@aws-amplify/storage 6.0.17-unstable.e316a2e.0 → 6.0.17
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/dist/cjs/providers/s3/apis/internal/getProperties.js +1 -1
- package/dist/cjs/providers/s3/apis/internal/getProperties.js.map +1 -1
- package/dist/cjs/providers/s3/apis/internal/getUrl.js +6 -6
- package/dist/cjs/providers/s3/apis/internal/getUrl.js.map +1 -1
- package/dist/cjs/providers/s3/apis/internal/list.js +2 -2
- package/dist/cjs/providers/s3/apis/internal/list.js.map +1 -1
- package/dist/cjs/providers/s3/apis/uploadData/multipart/initialUpload.js +1 -1
- package/dist/cjs/providers/s3/apis/uploadData/multipart/initialUpload.js.map +1 -1
- package/dist/cjs/providers/s3/apis/uploadData/multipart/uploadHandlers.js +25 -25
- package/dist/cjs/providers/s3/apis/uploadData/multipart/uploadHandlers.js.map +1 -1
- package/dist/cjs/providers/s3/utils/client/base.js +1 -1
- package/dist/cjs/providers/s3/utils/client/base.js.map +1 -1
- package/dist/cjs/providers/s3/utils/client/runtime/base64/index.native.js +1 -1
- package/dist/cjs/providers/s3/utils/client/runtime/base64/index.native.js.map +1 -1
- package/dist/cjs/providers/s3/utils/client/runtime/contentSha256middleware.js +3 -3
- package/dist/cjs/providers/s3/utils/client/runtime/contentSha256middleware.js.map +1 -1
- package/dist/cjs/providers/s3/utils/client/runtime/s3TransferHandler/fetch.js +1 -1
- package/dist/cjs/providers/s3/utils/client/runtime/s3TransferHandler/fetch.js.map +1 -1
- package/dist/cjs/providers/s3/utils/client/runtime/s3TransferHandler/xhr.js +4 -4
- package/dist/cjs/providers/s3/utils/client/runtime/s3TransferHandler/xhr.js.map +1 -1
- package/dist/cjs/providers/s3/utils/client/runtime/xhrTransferHandler.js +4 -4
- package/dist/cjs/providers/s3/utils/client/runtime/xhrTransferHandler.js.map +1 -1
- package/dist/cjs/providers/s3/utils/client/runtime/xmlParser/dom.js +4 -7
- package/dist/cjs/providers/s3/utils/client/runtime/xmlParser/dom.js.map +1 -1
- package/dist/cjs/providers/s3/utils/client/runtime/xmlParser/pureJs.js +6 -5
- package/dist/cjs/providers/s3/utils/client/runtime/xmlParser/pureJs.js.map +1 -1
- package/dist/cjs/providers/s3/utils/client/utils/deserializeHelpers.js +1 -1
- package/dist/cjs/providers/s3/utils/client/utils/deserializeHelpers.js.map +1 -1
- package/dist/cjs/providers/s3/utils/client/utils/parsePayload.js +2 -2
- package/dist/cjs/providers/s3/utils/client/utils/parsePayload.js.map +1 -1
- package/dist/cjs/providers/s3/utils/md5.js +8 -3
- package/dist/cjs/providers/s3/utils/md5.js.map +1 -1
- package/dist/cjs/providers/s3/utils/md5.native.js +6 -2
- package/dist/cjs/providers/s3/utils/md5.native.js.map +1 -1
- package/dist/cjs/providers/s3/utils/resolveS3ConfigAndInput.js +1 -1
- package/dist/cjs/providers/s3/utils/resolveS3ConfigAndInput.js.map +1 -1
- package/dist/cjs/providers/s3/utils/transferTask.js +10 -4
- package/dist/cjs/providers/s3/utils/transferTask.js.map +1 -1
- package/dist/esm/providers/s3/apis/getProperties.d.ts +1 -1
- package/dist/esm/providers/s3/apis/internal/getProperties.mjs +1 -1
- package/dist/esm/providers/s3/apis/internal/getProperties.mjs.map +1 -1
- package/dist/esm/providers/s3/apis/internal/getUrl.mjs +3 -3
- package/dist/esm/providers/s3/apis/internal/getUrl.mjs.map +1 -1
- package/dist/esm/providers/s3/apis/internal/list.d.ts +1 -1
- package/dist/esm/providers/s3/apis/internal/list.mjs +2 -2
- package/dist/esm/providers/s3/apis/internal/list.mjs.map +1 -1
- package/dist/esm/providers/s3/apis/list.d.ts +3 -3
- package/dist/esm/providers/s3/apis/server/list.d.ts +3 -3
- package/dist/esm/providers/s3/apis/uploadData/multipart/getDataChunker.d.ts +2 -2
- package/dist/esm/providers/s3/apis/uploadData/multipart/initialUpload.d.ts +4 -4
- package/dist/esm/providers/s3/apis/uploadData/multipart/initialUpload.mjs +1 -1
- package/dist/esm/providers/s3/apis/uploadData/multipart/initialUpload.mjs.map +1 -1
- package/dist/esm/providers/s3/apis/uploadData/multipart/progressTracker.d.ts +3 -3
- package/dist/esm/providers/s3/apis/uploadData/multipart/uploadCache.d.ts +6 -6
- package/dist/esm/providers/s3/apis/uploadData/multipart/uploadHandlers.mjs +25 -25
- package/dist/esm/providers/s3/apis/uploadData/multipart/uploadHandlers.mjs.map +1 -1
- package/dist/esm/providers/s3/apis/uploadData/multipart/uploadPartExecutor.d.ts +5 -5
- package/dist/esm/providers/s3/types/inputs.d.ts +2 -2
- package/dist/esm/providers/s3/types/options.d.ts +11 -11
- package/dist/esm/providers/s3/types/outputs.d.ts +1 -1
- package/dist/esm/providers/s3/utils/client/abortMultipartUpload.d.ts +2 -2
- package/dist/esm/providers/s3/utils/client/base.mjs +1 -1
- package/dist/esm/providers/s3/utils/client/base.mjs.map +1 -1
- package/dist/esm/providers/s3/utils/client/completeMultipartUpload.d.ts +2 -2
- package/dist/esm/providers/s3/utils/client/copyObject.d.ts +2 -2
- package/dist/esm/providers/s3/utils/client/copyObject.mjs.map +1 -1
- package/dist/esm/providers/s3/utils/client/createMultipartUpload.d.ts +3 -3
- package/dist/esm/providers/s3/utils/client/createMultipartUpload.mjs.map +1 -1
- package/dist/esm/providers/s3/utils/client/deleteObject.d.ts +2 -2
- package/dist/esm/providers/s3/utils/client/getObject.d.ts +3 -3
- package/dist/esm/providers/s3/utils/client/getObject.mjs.map +1 -1
- package/dist/esm/providers/s3/utils/client/headObject.d.ts +2 -2
- package/dist/esm/providers/s3/utils/client/listObjectsV2.d.ts +3 -3
- package/dist/esm/providers/s3/utils/client/listParts.d.ts +2 -2
- package/dist/esm/providers/s3/utils/client/listParts.mjs.map +1 -1
- package/dist/esm/providers/s3/utils/client/putObject.d.ts +2 -2
- package/dist/esm/providers/s3/utils/client/putObject.mjs.map +1 -1
- package/dist/esm/providers/s3/utils/client/runtime/base64/index.native.mjs +1 -1
- package/dist/esm/providers/s3/utils/client/runtime/base64/index.native.mjs.map +1 -1
- package/dist/esm/providers/s3/utils/client/runtime/contentSha256middleware.d.ts +2 -2
- package/dist/esm/providers/s3/utils/client/runtime/contentSha256middleware.mjs +2 -2
- package/dist/esm/providers/s3/utils/client/runtime/contentSha256middleware.mjs.map +1 -1
- package/dist/esm/providers/s3/utils/client/runtime/s3TransferHandler/fetch.d.ts +2 -2
- package/dist/esm/providers/s3/utils/client/runtime/s3TransferHandler/fetch.mjs +2 -2
- package/dist/esm/providers/s3/utils/client/runtime/s3TransferHandler/fetch.mjs.map +1 -1
- package/dist/esm/providers/s3/utils/client/runtime/s3TransferHandler/xhr.d.ts +2 -2
- package/dist/esm/providers/s3/utils/client/runtime/s3TransferHandler/xhr.mjs +6 -6
- package/dist/esm/providers/s3/utils/client/runtime/s3TransferHandler/xhr.mjs.map +1 -1
- package/dist/esm/providers/s3/utils/client/runtime/xhrTransferHandler.d.ts +2 -2
- package/dist/esm/providers/s3/utils/client/runtime/xhrTransferHandler.mjs +4 -4
- package/dist/esm/providers/s3/utils/client/runtime/xhrTransferHandler.mjs.map +1 -1
- package/dist/esm/providers/s3/utils/client/runtime/xmlParser/dom.mjs +4 -7
- package/dist/esm/providers/s3/utils/client/runtime/xmlParser/dom.mjs.map +1 -1
- package/dist/esm/providers/s3/utils/client/runtime/xmlParser/pureJs.mjs +6 -5
- package/dist/esm/providers/s3/utils/client/runtime/xmlParser/pureJs.mjs.map +1 -1
- package/dist/esm/providers/s3/utils/client/types.d.ts +11 -22
- package/dist/esm/providers/s3/utils/client/uploadPart.d.ts +2 -2
- package/dist/esm/providers/s3/utils/client/uploadPart.mjs.map +1 -1
- package/dist/esm/providers/s3/utils/client/utils/deserializeHelpers.d.ts +1 -3
- package/dist/esm/providers/s3/utils/client/utils/deserializeHelpers.mjs +1 -1
- package/dist/esm/providers/s3/utils/client/utils/deserializeHelpers.mjs.map +1 -1
- package/dist/esm/providers/s3/utils/client/utils/parsePayload.mjs +2 -2
- package/dist/esm/providers/s3/utils/client/utils/parsePayload.mjs.map +1 -1
- package/dist/esm/providers/s3/utils/client/utils/serializeHelpers.d.ts +1 -1
- package/dist/esm/providers/s3/utils/md5.mjs +8 -3
- package/dist/esm/providers/s3/utils/md5.mjs.map +1 -1
- package/dist/esm/providers/s3/utils/md5.native.mjs +6 -2
- package/dist/esm/providers/s3/utils/md5.native.mjs.map +1 -1
- package/dist/esm/providers/s3/utils/resolveS3ConfigAndInput.d.ts +4 -4
- package/dist/esm/providers/s3/utils/resolveS3ConfigAndInput.mjs +1 -1
- package/dist/esm/providers/s3/utils/resolveS3ConfigAndInput.mjs.map +1 -1
- package/dist/esm/providers/s3/utils/transferTask.d.ts +10 -10
- package/dist/esm/providers/s3/utils/transferTask.mjs +10 -4
- package/dist/esm/providers/s3/utils/transferTask.mjs.map +1 -1
- package/dist/esm/types/common.d.ts +7 -7
- package/dist/esm/types/inputs.d.ts +9 -9
- package/dist/esm/types/options.d.ts +2 -2
- package/dist/esm/types/outputs.d.ts +6 -6
- package/dist/esm/utils/resolvePrefix.d.ts +2 -2
- package/package.json +107 -106
- package/src/errors/CanceledError.ts +1 -0
- package/src/errors/utils/assertValidationError.ts +1 -1
- package/src/providers/s3/apis/copy.ts +3 -1
- package/src/providers/s3/apis/downloadData.ts +5 -3
- package/src/providers/s3/apis/getProperties.ts +5 -2
- package/src/providers/s3/apis/getUrl.ts +3 -0
- package/src/providers/s3/apis/internal/copy.ts +5 -4
- package/src/providers/s3/apis/internal/getProperties.ts +8 -6
- package/src/providers/s3/apis/internal/getUrl.ts +11 -9
- package/src/providers/s3/apis/internal/list.ts +13 -10
- package/src/providers/s3/apis/internal/remove.ts +5 -3
- package/src/providers/s3/apis/list.ts +8 -4
- package/src/providers/s3/apis/remove.ts +4 -1
- package/src/providers/s3/apis/server/copy.ts +2 -1
- package/src/providers/s3/apis/server/getProperties.ts +3 -2
- package/src/providers/s3/apis/server/getUrl.ts +2 -1
- package/src/providers/s3/apis/server/list.ts +10 -7
- package/src/providers/s3/apis/server/remove.ts +2 -1
- package/src/providers/s3/apis/uploadData/byteLength.ts +1 -0
- package/src/providers/s3/apis/uploadData/index.ts +5 -2
- package/src/providers/s3/apis/uploadData/multipart/calculatePartSize.ts +1 -0
- package/src/providers/s3/apis/uploadData/multipart/getDataChunker.ts +6 -4
- package/src/providers/s3/apis/uploadData/multipart/initialUpload.ts +12 -9
- package/src/providers/s3/apis/uploadData/multipart/progressTracker.ts +5 -4
- package/src/providers/s3/apis/uploadData/multipart/uploadCache.ts +15 -12
- package/src/providers/s3/apis/uploadData/multipart/uploadHandlers.ts +42 -36
- package/src/providers/s3/apis/uploadData/multipart/uploadPartExecutor.ts +7 -6
- package/src/providers/s3/apis/uploadData/putObjectJob.ts +2 -2
- package/src/providers/s3/types/inputs.ts +4 -4
- package/src/providers/s3/types/options.ts +11 -11
- package/src/providers/s3/types/outputs.ts +1 -1
- package/src/providers/s3/utils/client/abortMultipartUpload.ts +5 -4
- package/src/providers/s3/utils/client/base.ts +8 -6
- package/src/providers/s3/utils/client/completeMultipartUpload.ts +14 -6
- package/src/providers/s3/utils/client/copyObject.ts +7 -4
- package/src/providers/s3/utils/client/createMultipartUpload.ts +7 -5
- package/src/providers/s3/utils/client/deleteObject.ts +6 -5
- package/src/providers/s3/utils/client/getObject.ts +14 -12
- package/src/providers/s3/utils/client/headObject.ts +6 -5
- package/src/providers/s3/utils/client/listObjectsV2.ts +6 -3
- package/src/providers/s3/utils/client/listParts.ts +9 -6
- package/src/providers/s3/utils/client/putObject.ts +6 -5
- package/src/providers/s3/utils/client/runtime/base64/index.browser.ts +2 -1
- package/src/providers/s3/utils/client/runtime/base64/index.native.ts +1 -1
- package/src/providers/s3/utils/client/runtime/contentSha256middleware.ts +6 -4
- package/src/providers/s3/utils/client/runtime/s3TransferHandler/fetch.ts +7 -5
- package/src/providers/s3/utils/client/runtime/s3TransferHandler/xhr.ts +11 -11
- package/src/providers/s3/utils/client/runtime/xhrTransferHandler.ts +21 -14
- package/src/providers/s3/utils/client/runtime/xmlParser/dom.ts +6 -7
- package/src/providers/s3/utils/client/runtime/xmlParser/pureJs.ts +10 -5
- package/src/providers/s3/utils/client/types.ts +12 -14
- package/src/providers/s3/utils/client/uploadPart.ts +6 -5
- package/src/providers/s3/utils/client/utils/deserializeHelpers.ts +13 -8
- package/src/providers/s3/utils/client/utils/parsePayload.ts +6 -4
- package/src/providers/s3/utils/client/utils/serializeHelpers.ts +8 -5
- package/src/providers/s3/utils/md5.native.ts +9 -3
- package/src/providers/s3/utils/md5.ts +12 -4
- package/src/providers/s3/utils/resolveS3ConfigAndInput.ts +10 -8
- package/src/providers/s3/utils/transferTask.ts +26 -14
- package/src/providers/s3/utils/userAgent.ts +1 -1
- package/src/types/common.ts +7 -7
- package/src/types/inputs.ts +11 -11
- package/src/types/options.ts +2 -2
- package/src/types/outputs.ts +6 -6
- package/src/utils/resolvePrefix.ts +7 -4
|
@@ -48,9 +48,9 @@ type InferInstructionResultType<T extends Instruction<any>> =
|
|
|
48
48
|
*
|
|
49
49
|
* @internal
|
|
50
50
|
*/
|
|
51
|
-
export const map = <Instructions extends
|
|
51
|
+
export const map = <Instructions extends Record<string, Instruction<any>>>(
|
|
52
52
|
obj: Record<string, any>,
|
|
53
|
-
instructions: Instructions
|
|
53
|
+
instructions: Instructions,
|
|
54
54
|
): {
|
|
55
55
|
[K in keyof Instructions]: InferInstructionResultType<Instructions[K]>;
|
|
56
56
|
} => {
|
|
@@ -59,12 +59,13 @@ export const map = <Instructions extends { [key: string]: Instruction<any> }>(
|
|
|
59
59
|
const [accessor, deserializer] = Array.isArray(instruction)
|
|
60
60
|
? instruction
|
|
61
61
|
: [instruction];
|
|
62
|
-
if (
|
|
62
|
+
if (Object.prototype.hasOwnProperty.call(obj, accessor)) {
|
|
63
63
|
result[key as keyof Instructions] = deserializer
|
|
64
64
|
? deserializer(obj[accessor])
|
|
65
65
|
: String(obj[accessor]);
|
|
66
66
|
}
|
|
67
67
|
}
|
|
68
|
+
|
|
68
69
|
return result;
|
|
69
70
|
};
|
|
70
71
|
|
|
@@ -108,16 +109,17 @@ export const deserializeTimestamp = (value: string): Date | undefined => {
|
|
|
108
109
|
*
|
|
109
110
|
* @internal
|
|
110
111
|
*/
|
|
111
|
-
export const emptyArrayGuard = <T extends
|
|
112
|
+
export const emptyArrayGuard = <T extends any[]>(
|
|
112
113
|
value: any,
|
|
113
|
-
deserializer: (value: any[]) => T
|
|
114
|
+
deserializer: (value: any[]) => T,
|
|
114
115
|
): T => {
|
|
115
116
|
if (value === '') {
|
|
116
117
|
return [] as any as T;
|
|
117
118
|
}
|
|
118
119
|
const valueArray = (Array.isArray(value) ? value : [value]).filter(
|
|
119
|
-
e => e != null
|
|
120
|
+
e => e != null,
|
|
120
121
|
);
|
|
122
|
+
|
|
121
123
|
return deserializer(valueArray);
|
|
122
124
|
};
|
|
123
125
|
|
|
@@ -125,15 +127,17 @@ export const emptyArrayGuard = <T extends Array<any>>(
|
|
|
125
127
|
* @internal
|
|
126
128
|
*/
|
|
127
129
|
export const deserializeMetadata = (
|
|
128
|
-
headers: Headers
|
|
130
|
+
headers: Headers,
|
|
129
131
|
): Record<string, string> => {
|
|
130
132
|
const objectMetadataHeaderPrefix = 'x-amz-meta-';
|
|
131
133
|
const deserialized = Object.keys(headers)
|
|
132
134
|
.filter(header => header.startsWith(objectMetadataHeaderPrefix))
|
|
133
135
|
.reduce((acc, header) => {
|
|
134
136
|
acc[header.replace(objectMetadataHeaderPrefix, '')] = headers[header];
|
|
137
|
+
|
|
135
138
|
return acc;
|
|
136
139
|
}, {} as any);
|
|
140
|
+
|
|
137
141
|
return Object.keys(deserialized).length > 0 ? deserialized : undefined;
|
|
138
142
|
};
|
|
139
143
|
|
|
@@ -144,7 +148,7 @@ export const deserializeMetadata = (
|
|
|
144
148
|
*/
|
|
145
149
|
export const buildStorageServiceError = (
|
|
146
150
|
error: Error,
|
|
147
|
-
statusCode: number
|
|
151
|
+
statusCode: number,
|
|
148
152
|
): ServiceError => {
|
|
149
153
|
const storageError = new StorageError({
|
|
150
154
|
name: error.name,
|
|
@@ -154,5 +158,6 @@ export const buildStorageServiceError = (
|
|
|
154
158
|
storageError.recoverySuggestion =
|
|
155
159
|
'Please add the object with this key to the bucket as the key is not found.';
|
|
156
160
|
}
|
|
161
|
+
|
|
157
162
|
return storageError;
|
|
158
163
|
};
|
|
@@ -15,13 +15,14 @@ export const parseXmlError: ErrorParser = async (response?: HttpResponse) => {
|
|
|
15
15
|
}
|
|
16
16
|
const { statusCode } = response;
|
|
17
17
|
const body = await parseXmlBody(response);
|
|
18
|
-
const code = body?.
|
|
18
|
+
const code = body?.Code
|
|
19
19
|
? (body.Code as string)
|
|
20
20
|
: statusCode === 404
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
const message = body?.
|
|
21
|
+
? 'NotFound'
|
|
22
|
+
: statusCode.toString();
|
|
23
|
+
const message = body?.message ?? body?.Message ?? code;
|
|
24
24
|
const error = new Error(message);
|
|
25
|
+
|
|
25
26
|
return Object.assign(error, {
|
|
26
27
|
name: code,
|
|
27
28
|
$metadata: parseMetadata(response),
|
|
@@ -41,5 +42,6 @@ export const parseXmlBody = async (response: HttpResponse): Promise<any> => {
|
|
|
41
42
|
throw new Error('Failed to parse XML response.');
|
|
42
43
|
}
|
|
43
44
|
}
|
|
45
|
+
|
|
44
46
|
return {};
|
|
45
47
|
};
|
|
@@ -2,13 +2,14 @@
|
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
import { extendedEncodeURIComponent } from '@aws-amplify/core/internals/aws-client-utils';
|
|
4
4
|
import { AmplifyErrorCode } from '@aws-amplify/core/internals/utils';
|
|
5
|
+
|
|
5
6
|
import { StorageError } from '../../../../../errors/StorageError';
|
|
6
7
|
|
|
7
8
|
/**
|
|
8
9
|
* @internal
|
|
9
10
|
*/
|
|
10
11
|
export const assignStringVariables = (
|
|
11
|
-
values: Record<string, { toString
|
|
12
|
+
values: Record<string, { toString(): string } | undefined>,
|
|
12
13
|
): Record<string, string> => {
|
|
13
14
|
const queryParams: Record<string, string> = {};
|
|
14
15
|
for (const [key, value] of Object.entries(values)) {
|
|
@@ -16,6 +17,7 @@ export const assignStringVariables = (
|
|
|
16
17
|
queryParams[key] = value.toString();
|
|
17
18
|
}
|
|
18
19
|
}
|
|
20
|
+
|
|
19
21
|
return queryParams;
|
|
20
22
|
};
|
|
21
23
|
|
|
@@ -39,7 +41,7 @@ interface ObjectConfigs {
|
|
|
39
41
|
* @internal
|
|
40
42
|
*/
|
|
41
43
|
export const serializeObjectConfigsToHeaders = async (
|
|
42
|
-
input: ObjectConfigs
|
|
44
|
+
input: ObjectConfigs,
|
|
43
45
|
) => ({
|
|
44
46
|
...assignStringVariables({
|
|
45
47
|
'x-amz-acl': input.ACL,
|
|
@@ -55,10 +57,11 @@ export const serializeObjectConfigsToHeaders = async (
|
|
|
55
57
|
});
|
|
56
58
|
|
|
57
59
|
const serializeMetadata = (
|
|
58
|
-
metadata: Record<string, string> = {}
|
|
60
|
+
metadata: Record<string, string> = {},
|
|
59
61
|
): Record<string, string> =>
|
|
60
62
|
Object.keys(metadata).reduce((acc: any, suffix: string) => {
|
|
61
63
|
acc[`x-amz-meta-${suffix.toLowerCase()}`] = metadata[suffix];
|
|
64
|
+
|
|
62
65
|
return acc;
|
|
63
66
|
}, {});
|
|
64
67
|
|
|
@@ -77,14 +80,14 @@ export const serializePathnameObjectKey = (url: URL, key: string) => {
|
|
|
77
80
|
|
|
78
81
|
export function validateS3RequiredParameter(
|
|
79
82
|
assertion: boolean,
|
|
80
|
-
paramName: string
|
|
83
|
+
paramName: string,
|
|
81
84
|
): asserts assertion {
|
|
82
85
|
if (!assertion) {
|
|
83
86
|
throw new StorageError({
|
|
84
87
|
name: AmplifyErrorCode.Unknown,
|
|
85
88
|
message: 'An unknown error has occurred.',
|
|
86
89
|
underlyingError: new TypeError(
|
|
87
|
-
`Expected a non-null value for S3 parameter ${paramName}
|
|
90
|
+
`Expected a non-null value for S3 parameter ${paramName}`,
|
|
88
91
|
),
|
|
89
92
|
recoverySuggestion:
|
|
90
93
|
'This is likely to be a bug. Please reach out to library authors.',
|
|
@@ -2,10 +2,11 @@
|
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
|
|
4
4
|
import { Md5 } from '@smithy/md5-js';
|
|
5
|
+
|
|
5
6
|
import { toBase64 } from './client/utils';
|
|
6
7
|
|
|
7
8
|
export const calculateContentMd5 = async (
|
|
8
|
-
content: Blob | string | ArrayBuffer | ArrayBufferView
|
|
9
|
+
content: Blob | string | ArrayBuffer | ArrayBufferView,
|
|
9
10
|
): Promise<string> => {
|
|
10
11
|
const hasher = new Md5();
|
|
11
12
|
if (typeof content === 'string') {
|
|
@@ -19,6 +20,7 @@ export const calculateContentMd5 = async (
|
|
|
19
20
|
hasher.update(buffer);
|
|
20
21
|
}
|
|
21
22
|
const digest = await hasher.digest();
|
|
23
|
+
|
|
22
24
|
return toBase64(digest);
|
|
23
25
|
};
|
|
24
26
|
|
|
@@ -29,8 +31,12 @@ const readFile = (file: Blob): Promise<ArrayBuffer> => {
|
|
|
29
31
|
if (reader.result) {
|
|
30
32
|
resolve(reader.result as ArrayBuffer);
|
|
31
33
|
}
|
|
32
|
-
reader.onabort = () =>
|
|
33
|
-
|
|
34
|
+
reader.onabort = () => {
|
|
35
|
+
reject(new Error('Read aborted'));
|
|
36
|
+
};
|
|
37
|
+
reader.onerror = () => {
|
|
38
|
+
reject(reader.error);
|
|
39
|
+
};
|
|
34
40
|
};
|
|
35
41
|
if (file !== undefined) reader.readAsArrayBuffer(file);
|
|
36
42
|
});
|
|
@@ -2,10 +2,11 @@
|
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
|
|
4
4
|
import { Md5 } from '@smithy/md5-js';
|
|
5
|
+
|
|
5
6
|
import { toBase64, utf8Encode } from './client/utils';
|
|
6
7
|
|
|
7
8
|
export const calculateContentMd5 = async (
|
|
8
|
-
content: Blob | string | ArrayBuffer | ArrayBufferView
|
|
9
|
+
content: Blob | string | ArrayBuffer | ArrayBufferView,
|
|
9
10
|
): Promise<string> => {
|
|
10
11
|
const hasher = new Md5();
|
|
11
12
|
if (typeof content === 'string') {
|
|
@@ -19,6 +20,7 @@ export const calculateContentMd5 = async (
|
|
|
19
20
|
hasher.update(utf8Encode(buffer));
|
|
20
21
|
}
|
|
21
22
|
const digest = await hasher.digest();
|
|
23
|
+
|
|
22
24
|
return toBase64(digest);
|
|
23
25
|
};
|
|
24
26
|
|
|
@@ -30,12 +32,18 @@ const readFileToBase64 = (blob: Blob): Promise<string> => {
|
|
|
30
32
|
// response from readAsDataURL is always prepended with "data:*/*;base64,"
|
|
31
33
|
// reference: https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readyState
|
|
32
34
|
if (reader.readyState !== 2) {
|
|
33
|
-
|
|
35
|
+
reject(new Error('Reader aborted too early'));
|
|
36
|
+
|
|
37
|
+
return;
|
|
34
38
|
}
|
|
35
39
|
resolve((reader.result as string).split(',')[1]);
|
|
36
40
|
};
|
|
37
|
-
reader.onabort = () =>
|
|
38
|
-
|
|
41
|
+
reader.onabort = () => {
|
|
42
|
+
reject(new Error('Read aborted'));
|
|
43
|
+
};
|
|
44
|
+
reader.onerror = () => {
|
|
45
|
+
reject(reader.error);
|
|
46
|
+
};
|
|
39
47
|
// reader.readAsArrayBuffer is not available in RN
|
|
40
48
|
reader.readAsDataURL(blob);
|
|
41
49
|
});
|
|
@@ -2,25 +2,27 @@
|
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
|
|
4
4
|
import { AmplifyClassV6, StorageAccessLevel } from '@aws-amplify/core';
|
|
5
|
+
|
|
5
6
|
import { assertValidationError } from '../../../errors/utils/assertValidationError';
|
|
6
7
|
import { StorageValidationErrorCode } from '../../../errors/types/validation';
|
|
7
8
|
import { StorageError } from '../../../errors/StorageError';
|
|
8
|
-
import { DEFAULT_ACCESS_LEVEL, LOCAL_TESTING_S3_ENDPOINT } from './constants';
|
|
9
9
|
import { resolvePrefix as defaultPrefixResolver } from '../../../utils/resolvePrefix';
|
|
10
10
|
import { ResolvedS3Config } from '../types/options';
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
import { DEFAULT_ACCESS_LEVEL, LOCAL_TESTING_S3_ENDPOINT } from './constants';
|
|
13
|
+
|
|
14
|
+
interface S3ApiOptions {
|
|
13
15
|
accessLevel?: StorageAccessLevel;
|
|
14
16
|
targetIdentityId?: string;
|
|
15
17
|
useAccelerateEndpoint?: boolean;
|
|
16
|
-
}
|
|
18
|
+
}
|
|
17
19
|
|
|
18
|
-
|
|
20
|
+
interface ResolvedS3ConfigAndInput {
|
|
19
21
|
s3Config: ResolvedS3Config;
|
|
20
22
|
bucket: string;
|
|
21
23
|
keyPrefix: string;
|
|
22
24
|
isObjectLockEnabled?: boolean;
|
|
23
|
-
}
|
|
25
|
+
}
|
|
24
26
|
|
|
25
27
|
/**
|
|
26
28
|
* resolve the common input options for S3 API handlers from Amplify configuration and library options.
|
|
@@ -35,7 +37,7 @@ type ResolvedS3ConfigAndInput = {
|
|
|
35
37
|
*/
|
|
36
38
|
export const resolveS3ConfigAndInput = async (
|
|
37
39
|
amplify: AmplifyClassV6,
|
|
38
|
-
apiOptions?: S3ApiOptions
|
|
40
|
+
apiOptions?: S3ApiOptions,
|
|
39
41
|
): Promise<ResolvedS3ConfigAndInput> => {
|
|
40
42
|
// identityId is always cached in memory if forceRefresh is not set. So we can safely make calls here.
|
|
41
43
|
const { credentials, identityId } = await amplify.Auth.fetchAuthSession({
|
|
@@ -43,7 +45,7 @@ export const resolveS3ConfigAndInput = async (
|
|
|
43
45
|
});
|
|
44
46
|
assertValidationError(
|
|
45
47
|
!!credentials,
|
|
46
|
-
StorageValidationErrorCode.NoCredentials
|
|
48
|
+
StorageValidationErrorCode.NoCredentials,
|
|
47
49
|
);
|
|
48
50
|
assertValidationError(!!identityId, StorageValidationErrorCode.NoIdentityId);
|
|
49
51
|
|
|
@@ -77,7 +79,7 @@ export const resolveS3ConfigAndInput = async (
|
|
|
77
79
|
? {
|
|
78
80
|
customEndpoint: LOCAL_TESTING_S3_ENDPOINT,
|
|
79
81
|
forcePathStyle: true,
|
|
80
|
-
|
|
82
|
+
}
|
|
81
83
|
: {}),
|
|
82
84
|
},
|
|
83
85
|
bucket,
|
|
@@ -9,10 +9,10 @@ import {
|
|
|
9
9
|
} from '../../../types/common';
|
|
10
10
|
import { logger } from '../../../utils';
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
job
|
|
14
|
-
onCancel
|
|
15
|
-
}
|
|
12
|
+
interface CreateCancellableTaskOptions<Result> {
|
|
13
|
+
job(): Promise<Result>;
|
|
14
|
+
onCancel(message?: string): void;
|
|
15
|
+
}
|
|
16
16
|
|
|
17
17
|
type CancellableTask<Result> = DownloadTask<Result>;
|
|
18
18
|
|
|
@@ -21,12 +21,17 @@ const createCancellableTask = <Result>({
|
|
|
21
21
|
onCancel,
|
|
22
22
|
}: CreateCancellableTaskOptions<Result>): CancellableTask<Result> => {
|
|
23
23
|
const state = 'IN_PROGRESS' as TransferTaskState;
|
|
24
|
-
let canceledErrorMessage: string | undefined
|
|
24
|
+
let canceledErrorMessage: string | undefined;
|
|
25
25
|
const cancelableTask = {
|
|
26
26
|
cancel: (message?: string) => {
|
|
27
|
-
const { state } = cancelableTask;
|
|
28
|
-
if (
|
|
29
|
-
|
|
27
|
+
const { state: taskState } = cancelableTask;
|
|
28
|
+
if (
|
|
29
|
+
taskState === 'CANCELED' ||
|
|
30
|
+
taskState === 'ERROR' ||
|
|
31
|
+
taskState === 'SUCCESS'
|
|
32
|
+
) {
|
|
33
|
+
logger.debug(`This task cannot be canceled. State: ${taskState}`);
|
|
34
|
+
|
|
30
35
|
return;
|
|
31
36
|
}
|
|
32
37
|
cancelableTask.state = 'CANCELED';
|
|
@@ -40,6 +45,7 @@ const createCancellableTask = <Result>({
|
|
|
40
45
|
try {
|
|
41
46
|
const result = await job();
|
|
42
47
|
cancelableTask.state = 'SUCCESS';
|
|
48
|
+
|
|
43
49
|
return result;
|
|
44
50
|
} catch (e) {
|
|
45
51
|
if (isCancelError(e)) {
|
|
@@ -58,13 +64,13 @@ const createCancellableTask = <Result>({
|
|
|
58
64
|
|
|
59
65
|
export const createDownloadTask = createCancellableTask;
|
|
60
66
|
|
|
61
|
-
|
|
62
|
-
job
|
|
63
|
-
onCancel
|
|
64
|
-
onResume
|
|
65
|
-
onPause
|
|
67
|
+
interface CreateUploadTaskOptions<Result> {
|
|
68
|
+
job(): Promise<Result>;
|
|
69
|
+
onCancel(message?: string): void;
|
|
70
|
+
onResume?(): void;
|
|
71
|
+
onPause?(): void;
|
|
66
72
|
isMultipartUpload?: boolean;
|
|
67
|
-
}
|
|
73
|
+
}
|
|
68
74
|
|
|
69
75
|
export const createUploadTask = <Result>({
|
|
70
76
|
job,
|
|
@@ -83,8 +89,11 @@ export const createUploadTask = <Result>({
|
|
|
83
89
|
const { state } = uploadTask;
|
|
84
90
|
if (!isMultipartUpload || state !== 'IN_PROGRESS') {
|
|
85
91
|
logger.debug(`This task cannot be paused. State: ${state}`);
|
|
92
|
+
|
|
86
93
|
return;
|
|
87
94
|
}
|
|
95
|
+
// TODO(eslint): remove this linter suppression.
|
|
96
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
88
97
|
// @ts-ignore
|
|
89
98
|
uploadTask.state = 'PAUSED';
|
|
90
99
|
onPause?.();
|
|
@@ -93,8 +102,11 @@ export const createUploadTask = <Result>({
|
|
|
93
102
|
const { state } = uploadTask;
|
|
94
103
|
if (!isMultipartUpload || state !== 'PAUSED') {
|
|
95
104
|
logger.debug(`This task cannot be resumed. State: ${state}`);
|
|
105
|
+
|
|
96
106
|
return;
|
|
97
107
|
}
|
|
108
|
+
// TODO(eslint): remove this linter suppression.
|
|
109
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
98
110
|
// @ts-ignore
|
|
99
111
|
uploadTask.state = 'IN_PROGRESS';
|
|
100
112
|
onResume?.();
|
package/src/types/common.ts
CHANGED
|
@@ -10,12 +10,12 @@ export type TransferTaskState =
|
|
|
10
10
|
| 'SUCCESS'
|
|
11
11
|
| 'ERROR';
|
|
12
12
|
|
|
13
|
-
export
|
|
13
|
+
export interface TransferProgressEvent {
|
|
14
14
|
transferredBytes: number;
|
|
15
15
|
totalBytes?: number;
|
|
16
|
-
}
|
|
16
|
+
}
|
|
17
17
|
|
|
18
|
-
export
|
|
18
|
+
export interface TransferTask<Result> {
|
|
19
19
|
/**
|
|
20
20
|
* Cancel an ongoing transfer(upload/download) task. This will reject the `result` promise with an `AbortError` by
|
|
21
21
|
* default. You can use `isCancelError` to check if the error is caused by cancellation.
|
|
@@ -24,19 +24,19 @@ export type TransferTask<Result> = {
|
|
|
24
24
|
* canceled. If provided, the `result` promise will be rejected with a {@link CanceledError} with supplied error
|
|
25
25
|
* message instead.
|
|
26
26
|
*/
|
|
27
|
-
cancel
|
|
27
|
+
cancel(message?: string): void;
|
|
28
28
|
|
|
29
29
|
/**
|
|
30
30
|
* Pause an ongoing transfer(upload/download) task. This method does not support the following scenarios:
|
|
31
31
|
* * Downloading data or file from given key.
|
|
32
32
|
*/
|
|
33
|
-
pause
|
|
33
|
+
pause(): void;
|
|
34
34
|
|
|
35
35
|
/**
|
|
36
36
|
* Resume a paused transfer(upload/download) task. This method does not support the following scenarios:
|
|
37
37
|
* * Downloading data or file from given key.
|
|
38
38
|
*/
|
|
39
|
-
resume
|
|
39
|
+
resume(): void;
|
|
40
40
|
|
|
41
41
|
/**
|
|
42
42
|
* Current state of the transfer task.
|
|
@@ -47,7 +47,7 @@ export type TransferTask<Result> = {
|
|
|
47
47
|
* Promise that resolves when the transfer task is completed. The promise will be rejected if the task is canceled.
|
|
48
48
|
*/
|
|
49
49
|
result: Promise<Result>;
|
|
50
|
-
}
|
|
50
|
+
}
|
|
51
51
|
|
|
52
52
|
export type DownloadTask<Result> = Omit<
|
|
53
53
|
TransferTask<Result>,
|
package/src/types/inputs.ts
CHANGED
|
@@ -2,30 +2,30 @@
|
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
|
|
4
4
|
import {
|
|
5
|
-
StorageOptions,
|
|
6
5
|
StorageListAllOptions,
|
|
7
6
|
StorageListPaginateOptions,
|
|
7
|
+
StorageOptions,
|
|
8
8
|
} from './options';
|
|
9
9
|
|
|
10
|
-
export
|
|
10
|
+
export interface StorageOperationInput<Options extends StorageOptions> {
|
|
11
11
|
key: string;
|
|
12
12
|
options?: Options;
|
|
13
|
-
}
|
|
13
|
+
}
|
|
14
14
|
|
|
15
15
|
export type StorageGetPropertiesInput<Options extends StorageOptions> =
|
|
16
16
|
StorageOperationInput<Options>;
|
|
17
17
|
|
|
18
|
-
export
|
|
18
|
+
export interface StorageRemoveInput<Options extends StorageOptions> {
|
|
19
19
|
key: string;
|
|
20
20
|
options?: Options;
|
|
21
|
-
}
|
|
21
|
+
}
|
|
22
22
|
|
|
23
|
-
export
|
|
23
|
+
export interface StorageListInput<
|
|
24
24
|
Options extends StorageListAllOptions | StorageListPaginateOptions,
|
|
25
|
-
>
|
|
25
|
+
> {
|
|
26
26
|
prefix?: string;
|
|
27
27
|
options?: Options;
|
|
28
|
-
}
|
|
28
|
+
}
|
|
29
29
|
|
|
30
30
|
export type StorageGetUrlInput<Options extends StorageOptions> =
|
|
31
31
|
StorageOperationInput<Options>;
|
|
@@ -38,13 +38,13 @@ export type StorageUploadDataInput<Options extends StorageOptions> =
|
|
|
38
38
|
data: StorageUploadDataPayload;
|
|
39
39
|
};
|
|
40
40
|
|
|
41
|
-
export
|
|
41
|
+
export interface StorageCopyInput<
|
|
42
42
|
SourceOptions extends StorageOptions,
|
|
43
43
|
DestinationOptions extends StorageOptions,
|
|
44
|
-
>
|
|
44
|
+
> {
|
|
45
45
|
source: SourceOptions;
|
|
46
46
|
destination: DestinationOptions;
|
|
47
|
-
}
|
|
47
|
+
}
|
|
48
48
|
|
|
49
49
|
/**
|
|
50
50
|
* The data payload type for upload operation.
|
package/src/types/options.ts
CHANGED
package/src/types/outputs.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
import { ResponseBodyMixin } from '@aws-amplify/core/internals/aws-client-utils';
|
|
5
5
|
|
|
6
|
-
export
|
|
6
|
+
export interface StorageItem {
|
|
7
7
|
/**
|
|
8
8
|
* Key of the object
|
|
9
9
|
*/
|
|
@@ -26,13 +26,13 @@ export type StorageItem = {
|
|
|
26
26
|
* @see https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingMetadata.html#UserMetadata
|
|
27
27
|
*/
|
|
28
28
|
metadata?: Record<string, string>;
|
|
29
|
-
}
|
|
29
|
+
}
|
|
30
30
|
|
|
31
31
|
export type StorageDownloadDataOutput<T extends StorageItem> = T & {
|
|
32
32
|
body: ResponseBodyMixin;
|
|
33
33
|
};
|
|
34
34
|
|
|
35
|
-
export
|
|
35
|
+
export interface StorageGetUrlOutput {
|
|
36
36
|
/**
|
|
37
37
|
* presigned URL of the given object.
|
|
38
38
|
*/
|
|
@@ -41,10 +41,10 @@ export type StorageGetUrlOutput = {
|
|
|
41
41
|
* expiresAt is date in which generated URL expires.
|
|
42
42
|
*/
|
|
43
43
|
expiresAt: Date;
|
|
44
|
-
}
|
|
44
|
+
}
|
|
45
45
|
|
|
46
46
|
export type StorageUploadOutput<Item extends StorageItem> = Item;
|
|
47
47
|
|
|
48
|
-
export
|
|
48
|
+
export interface StorageListOutput<Item extends StorageItem> {
|
|
49
49
|
items: Item[];
|
|
50
|
-
}
|
|
50
|
+
}
|
|
@@ -2,13 +2,14 @@
|
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
|
|
4
4
|
import { StorageAccessLevel } from '@aws-amplify/core';
|
|
5
|
+
|
|
5
6
|
import { assertValidationError } from '../errors/utils/assertValidationError';
|
|
6
7
|
import { StorageValidationErrorCode } from '../errors/types/validation';
|
|
7
8
|
|
|
8
|
-
|
|
9
|
+
interface ResolvePrefixOptions {
|
|
9
10
|
accessLevel: StorageAccessLevel;
|
|
10
11
|
targetIdentityId?: string;
|
|
11
|
-
}
|
|
12
|
+
}
|
|
12
13
|
|
|
13
14
|
export const resolvePrefix = ({
|
|
14
15
|
accessLevel,
|
|
@@ -17,14 +18,16 @@ export const resolvePrefix = ({
|
|
|
17
18
|
if (accessLevel === 'private') {
|
|
18
19
|
assertValidationError(
|
|
19
20
|
!!targetIdentityId,
|
|
20
|
-
StorageValidationErrorCode.NoIdentityId
|
|
21
|
+
StorageValidationErrorCode.NoIdentityId,
|
|
21
22
|
);
|
|
23
|
+
|
|
22
24
|
return `private/${targetIdentityId}/`;
|
|
23
25
|
} else if (accessLevel === 'protected') {
|
|
24
26
|
assertValidationError(
|
|
25
27
|
!!targetIdentityId,
|
|
26
|
-
StorageValidationErrorCode.NoIdentityId
|
|
28
|
+
StorageValidationErrorCode.NoIdentityId,
|
|
27
29
|
);
|
|
30
|
+
|
|
28
31
|
return `protected/${targetIdentityId}/`;
|
|
29
32
|
} else {
|
|
30
33
|
return 'public/';
|