@aws-amplify/storage 6.9.5 → 6.9.6-unstable.6ea70f9.0

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.
@@ -134,7 +134,11 @@ const xhrTransferHandler = (request, options) => {
134
134
  };
135
135
  exports.xhrTransferHandler = xhrTransferHandler;
136
136
  const convertToTransferProgressEvent = (event) => ({
137
- transferredBytes: event.loaded,
137
+ // `loaded` can exceed the `total` in some cases due to platform issues/bugs e.g. React Native & Expo Android
138
+ // clamp `loaded` values down to `total` if possible.
139
+ transferredBytes: event.lengthComputable
140
+ ? Math.min(event.loaded, event.total)
141
+ : event.loaded,
138
142
  totalBytes: event.lengthComputable ? event.total : undefined,
139
143
  });
140
144
  const buildHandlerError = (message, name) => {
@@ -1 +1 @@
1
- {"version":3,"file":"xhrTransferHandler.js","sources":["../../../../../../../src/providers/s3/utils/client/runtime/xhrTransferHandler.ts"],"sourcesContent":["\"use strict\";\n// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.xhrTransferHandler = void 0;\nconst aws_client_utils_1 = require(\"@aws-amplify/core/internals/aws-client-utils\");\nconst core_1 = require(\"@aws-amplify/core\");\nconst CanceledError_1 = require(\"../../../../../errors/CanceledError\");\nconst StorageError_1 = require(\"../../../../../errors/StorageError\");\nconst constants_1 = require(\"./constants\");\nconst logger = new core_1.ConsoleLogger('xhr-http-handler');\n/**\n * Base transfer handler implementation using XMLHttpRequest to support upload and download progress events.\n *\n * @param request - The request object.\n * @param options - The request options.\n * @returns A promise that will be resolved with the response object.\n *\n * @internal\n */\nconst xhrTransferHandler = (request, options) => {\n const { url, method, headers, body } = request;\n const { onDownloadProgress, onUploadProgress, responseType, abortSignal } = options;\n return new Promise((resolve, reject) => {\n let xhr = new XMLHttpRequest();\n xhr.open(method.toUpperCase(), url.toString());\n Object.entries(headers)\n .filter(([header]) => !FORBIDDEN_HEADERS.includes(header))\n .forEach(([header, value]) => {\n xhr.setRequestHeader(header, value);\n });\n xhr.responseType = responseType;\n if (onDownloadProgress) {\n xhr.addEventListener('progress', event => {\n onDownloadProgress(convertToTransferProgressEvent(event));\n logger.debug(event);\n });\n }\n if (onUploadProgress) {\n xhr.upload.addEventListener('progress', event => {\n onUploadProgress(convertToTransferProgressEvent(event));\n logger.debug(event);\n });\n }\n xhr.addEventListener('error', () => {\n const networkError = new StorageError_1.StorageError({\n message: constants_1.NETWORK_ERROR_MESSAGE,\n name: constants_1.NETWORK_ERROR_CODE,\n });\n logger.error(constants_1.NETWORK_ERROR_MESSAGE);\n reject(networkError);\n xhr = null; // clean up request\n });\n // Handle browser request cancellation (as opposed to a manual cancellation)\n xhr.addEventListener('abort', () => {\n // The abort event can be triggered after the error or load event. So we need to check if the xhr is null.\n // When request is aborted by AbortSignal, the promise is rejected in the abortSignal's 'abort' event listener.\n if (!xhr || abortSignal?.aborted)\n return;\n // Handle abort request caused by browser instead of AbortController\n // see: https://github.com/axios/axios/issues/537\n const error = buildHandlerError(constants_1.ABORT_ERROR_MESSAGE, constants_1.ABORT_ERROR_CODE);\n logger.error(constants_1.ABORT_ERROR_MESSAGE);\n reject(error);\n xhr = null; // clean up request\n });\n // Skip handling timeout error since we don't have a timeout\n xhr.addEventListener('readystatechange', () => {\n if (!xhr || xhr.readyState !== xhr.DONE) {\n return;\n }\n const onloadend = () => {\n // The load event is triggered after the error/abort/load event. So we need to check if the xhr is null.\n if (!xhr)\n return;\n const responseHeaders = convertResponseHeaders(xhr.getAllResponseHeaders());\n const { responseType: loadEndResponseType } = xhr;\n const responseBlob = xhr.response;\n const responseText = loadEndResponseType === 'text' ? xhr.responseText : '';\n const bodyMixIn = {\n blob: () => Promise.resolve(responseBlob),\n text: (0, aws_client_utils_1.withMemoization)(() => loadEndResponseType === 'blob'\n ? readBlobAsText(responseBlob)\n : Promise.resolve(responseText)),\n json: () => Promise.reject(\n // S3 does not support JSON response. So fail-fast here with nicer error message.\n new Error('Parsing response to JSON is not implemented. Please use response.text() instead.')),\n };\n const response = {\n statusCode: xhr.status,\n headers: responseHeaders,\n // The xhr.responseType is only set to 'blob' for streaming binary S3 object data. The streaming data is\n // exposed via public interface of Storage.get(). So we need to return the response as a Blob object for\n // backward compatibility. In other cases, the response payload is only used internally, we return it is\n // {@link ResponseBodyMixin}\n body: (xhr.responseType === 'blob'\n ? Object.assign(responseBlob, bodyMixIn)\n : bodyMixIn),\n };\n resolve(response);\n xhr = null; // clean up request\n };\n // readystate handler is calling before onerror or ontimeout handlers,\n // so we should call onloadend on the next 'tick'\n // @see https://github.com/axios/axios/blob/9588fcdec8aca45c3ba2f7968988a5d03f23168c/lib/adapters/xhr.js#L98-L99\n setTimeout(onloadend);\n });\n if (abortSignal) {\n const onCanceled = () => {\n // The abort event is triggered after the error or load event. So we need to check if the xhr is null.\n if (!xhr) {\n return;\n }\n const canceledError = new CanceledError_1.CanceledError({\n name: constants_1.CANCELED_ERROR_CODE,\n message: constants_1.CANCELED_ERROR_MESSAGE,\n });\n reject(canceledError);\n xhr.abort();\n xhr = null;\n };\n abortSignal.aborted\n ? onCanceled()\n : abortSignal.addEventListener('abort', onCanceled);\n }\n if (typeof ReadableStream === 'function' &&\n body instanceof ReadableStream) {\n // This does not matter as previous implementation uses Axios which does not support ReadableStream anyway.\n throw new Error('ReadableStream request payload is not supported.');\n }\n xhr.send(body ?? null);\n });\n};\nexports.xhrTransferHandler = xhrTransferHandler;\nconst convertToTransferProgressEvent = (event) => ({\n transferredBytes: event.loaded,\n totalBytes: event.lengthComputable ? event.total : undefined,\n});\nconst buildHandlerError = (message, name) => {\n const error = new Error(message);\n error.name = name;\n return error;\n};\n/**\n * Convert xhr.getAllResponseHeaders() string to a Record<string, string>. Note that modern browser already returns\n * header names in lowercase.\n * @param xhrHeaders - string of headers returned from xhr.getAllResponseHeaders()\n */\nconst convertResponseHeaders = (xhrHeaders) => {\n if (!xhrHeaders) {\n return {};\n }\n return xhrHeaders\n .split('\\r\\n')\n .reduce((headerMap, line) => {\n const parts = line.split(': ');\n const header = parts.shift();\n const value = parts.join(': ');\n headerMap[header.toLowerCase()] = value;\n return headerMap;\n }, {});\n};\nconst readBlobAsText = (blob) => {\n const reader = new FileReader();\n return new Promise((resolve, reject) => {\n reader.onloadend = () => {\n if (reader.readyState !== FileReader.DONE) {\n return;\n }\n resolve(reader.result);\n };\n reader.onerror = () => {\n reject(reader.error);\n };\n reader.readAsText(blob);\n });\n};\n// To add more forbidden headers as found set by S3. Intentionally NOT list all of them here to save bundle size.\n// https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_header_name\nconst FORBIDDEN_HEADERS = ['host'];\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"xhrTransferHandler.js","sources":["../../../../../../../src/providers/s3/utils/client/runtime/xhrTransferHandler.ts"],"sourcesContent":["\"use strict\";\n// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.xhrTransferHandler = void 0;\nconst aws_client_utils_1 = require(\"@aws-amplify/core/internals/aws-client-utils\");\nconst core_1 = require(\"@aws-amplify/core\");\nconst CanceledError_1 = require(\"../../../../../errors/CanceledError\");\nconst StorageError_1 = require(\"../../../../../errors/StorageError\");\nconst constants_1 = require(\"./constants\");\nconst logger = new core_1.ConsoleLogger('xhr-http-handler');\n/**\n * Base transfer handler implementation using XMLHttpRequest to support upload and download progress events.\n *\n * @param request - The request object.\n * @param options - The request options.\n * @returns A promise that will be resolved with the response object.\n *\n * @internal\n */\nconst xhrTransferHandler = (request, options) => {\n const { url, method, headers, body } = request;\n const { onDownloadProgress, onUploadProgress, responseType, abortSignal } = options;\n return new Promise((resolve, reject) => {\n let xhr = new XMLHttpRequest();\n xhr.open(method.toUpperCase(), url.toString());\n Object.entries(headers)\n .filter(([header]) => !FORBIDDEN_HEADERS.includes(header))\n .forEach(([header, value]) => {\n xhr.setRequestHeader(header, value);\n });\n xhr.responseType = responseType;\n if (onDownloadProgress) {\n xhr.addEventListener('progress', event => {\n onDownloadProgress(convertToTransferProgressEvent(event));\n logger.debug(event);\n });\n }\n if (onUploadProgress) {\n xhr.upload.addEventListener('progress', event => {\n onUploadProgress(convertToTransferProgressEvent(event));\n logger.debug(event);\n });\n }\n xhr.addEventListener('error', () => {\n const networkError = new StorageError_1.StorageError({\n message: constants_1.NETWORK_ERROR_MESSAGE,\n name: constants_1.NETWORK_ERROR_CODE,\n });\n logger.error(constants_1.NETWORK_ERROR_MESSAGE);\n reject(networkError);\n xhr = null; // clean up request\n });\n // Handle browser request cancellation (as opposed to a manual cancellation)\n xhr.addEventListener('abort', () => {\n // The abort event can be triggered after the error or load event. So we need to check if the xhr is null.\n // When request is aborted by AbortSignal, the promise is rejected in the abortSignal's 'abort' event listener.\n if (!xhr || abortSignal?.aborted)\n return;\n // Handle abort request caused by browser instead of AbortController\n // see: https://github.com/axios/axios/issues/537\n const error = buildHandlerError(constants_1.ABORT_ERROR_MESSAGE, constants_1.ABORT_ERROR_CODE);\n logger.error(constants_1.ABORT_ERROR_MESSAGE);\n reject(error);\n xhr = null; // clean up request\n });\n // Skip handling timeout error since we don't have a timeout\n xhr.addEventListener('readystatechange', () => {\n if (!xhr || xhr.readyState !== xhr.DONE) {\n return;\n }\n const onloadend = () => {\n // The load event is triggered after the error/abort/load event. So we need to check if the xhr is null.\n if (!xhr)\n return;\n const responseHeaders = convertResponseHeaders(xhr.getAllResponseHeaders());\n const { responseType: loadEndResponseType } = xhr;\n const responseBlob = xhr.response;\n const responseText = loadEndResponseType === 'text' ? xhr.responseText : '';\n const bodyMixIn = {\n blob: () => Promise.resolve(responseBlob),\n text: (0, aws_client_utils_1.withMemoization)(() => loadEndResponseType === 'blob'\n ? readBlobAsText(responseBlob)\n : Promise.resolve(responseText)),\n json: () => Promise.reject(\n // S3 does not support JSON response. So fail-fast here with nicer error message.\n new Error('Parsing response to JSON is not implemented. Please use response.text() instead.')),\n };\n const response = {\n statusCode: xhr.status,\n headers: responseHeaders,\n // The xhr.responseType is only set to 'blob' for streaming binary S3 object data. The streaming data is\n // exposed via public interface of Storage.get(). So we need to return the response as a Blob object for\n // backward compatibility. In other cases, the response payload is only used internally, we return it is\n // {@link ResponseBodyMixin}\n body: (xhr.responseType === 'blob'\n ? Object.assign(responseBlob, bodyMixIn)\n : bodyMixIn),\n };\n resolve(response);\n xhr = null; // clean up request\n };\n // readystate handler is calling before onerror or ontimeout handlers,\n // so we should call onloadend on the next 'tick'\n // @see https://github.com/axios/axios/blob/9588fcdec8aca45c3ba2f7968988a5d03f23168c/lib/adapters/xhr.js#L98-L99\n setTimeout(onloadend);\n });\n if (abortSignal) {\n const onCanceled = () => {\n // The abort event is triggered after the error or load event. So we need to check if the xhr is null.\n if (!xhr) {\n return;\n }\n const canceledError = new CanceledError_1.CanceledError({\n name: constants_1.CANCELED_ERROR_CODE,\n message: constants_1.CANCELED_ERROR_MESSAGE,\n });\n reject(canceledError);\n xhr.abort();\n xhr = null;\n };\n abortSignal.aborted\n ? onCanceled()\n : abortSignal.addEventListener('abort', onCanceled);\n }\n if (typeof ReadableStream === 'function' &&\n body instanceof ReadableStream) {\n // This does not matter as previous implementation uses Axios which does not support ReadableStream anyway.\n throw new Error('ReadableStream request payload is not supported.');\n }\n xhr.send(body ?? null);\n });\n};\nexports.xhrTransferHandler = xhrTransferHandler;\nconst convertToTransferProgressEvent = (event) => ({\n // `loaded` can exceed the `total` in some cases due to platform issues/bugs e.g. React Native & Expo Android\n // clamp `loaded` values down to `total` if possible.\n transferredBytes: event.lengthComputable\n ? Math.min(event.loaded, event.total)\n : event.loaded,\n totalBytes: event.lengthComputable ? event.total : undefined,\n});\nconst buildHandlerError = (message, name) => {\n const error = new Error(message);\n error.name = name;\n return error;\n};\n/**\n * Convert xhr.getAllResponseHeaders() string to a Record<string, string>. Note that modern browser already returns\n * header names in lowercase.\n * @param xhrHeaders - string of headers returned from xhr.getAllResponseHeaders()\n */\nconst convertResponseHeaders = (xhrHeaders) => {\n if (!xhrHeaders) {\n return {};\n }\n return xhrHeaders\n .split('\\r\\n')\n .reduce((headerMap, line) => {\n const parts = line.split(': ');\n const header = parts.shift();\n const value = parts.join(': ');\n headerMap[header.toLowerCase()] = value;\n return headerMap;\n }, {});\n};\nconst readBlobAsText = (blob) => {\n const reader = new FileReader();\n return new Promise((resolve, reject) => {\n reader.onloadend = () => {\n if (reader.readyState !== FileReader.DONE) {\n return;\n }\n resolve(reader.result);\n };\n reader.onerror = () => {\n reject(reader.error);\n };\n reader.readAsText(blob);\n });\n};\n// To add more forbidden headers as found set by S3. Intentionally NOT list all of them here to save bundle size.\n// https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_header_name\nconst FORBIDDEN_HEADERS = ['host'];\n"],"names":[],"mappings":"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"}
@@ -130,7 +130,11 @@ const xhrTransferHandler = (request, options) => {
130
130
  });
131
131
  };
132
132
  const convertToTransferProgressEvent = (event) => ({
133
- transferredBytes: event.loaded,
133
+ // `loaded` can exceed the `total` in some cases due to platform issues/bugs e.g. React Native & Expo Android
134
+ // clamp `loaded` values down to `total` if possible.
135
+ transferredBytes: event.lengthComputable
136
+ ? Math.min(event.loaded, event.total)
137
+ : event.loaded,
134
138
  totalBytes: event.lengthComputable ? event.total : undefined,
135
139
  });
136
140
  const buildHandlerError = (message, name) => {
@@ -1 +1 @@
1
- {"version":3,"file":"xhrTransferHandler.mjs","sources":["../../../../../../../src/providers/s3/utils/client/runtime/xhrTransferHandler.ts"],"sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport { withMemoization, } from '@aws-amplify/core/internals/aws-client-utils';\nimport { ConsoleLogger } from '@aws-amplify/core';\nimport { CanceledError } from '../../../../../errors/CanceledError';\nimport { StorageError } from '../../../../../errors/StorageError';\nimport { ABORT_ERROR_CODE, ABORT_ERROR_MESSAGE, CANCELED_ERROR_CODE, CANCELED_ERROR_MESSAGE, NETWORK_ERROR_CODE, NETWORK_ERROR_MESSAGE, } from './constants';\nconst logger = new ConsoleLogger('xhr-http-handler');\n/**\n * Base transfer handler implementation using XMLHttpRequest to support upload and download progress events.\n *\n * @param request - The request object.\n * @param options - The request options.\n * @returns A promise that will be resolved with the response object.\n *\n * @internal\n */\nexport const xhrTransferHandler = (request, options) => {\n const { url, method, headers, body } = request;\n const { onDownloadProgress, onUploadProgress, responseType, abortSignal } = options;\n return new Promise((resolve, reject) => {\n let xhr = new XMLHttpRequest();\n xhr.open(method.toUpperCase(), url.toString());\n Object.entries(headers)\n .filter(([header]) => !FORBIDDEN_HEADERS.includes(header))\n .forEach(([header, value]) => {\n xhr.setRequestHeader(header, value);\n });\n xhr.responseType = responseType;\n if (onDownloadProgress) {\n xhr.addEventListener('progress', event => {\n onDownloadProgress(convertToTransferProgressEvent(event));\n logger.debug(event);\n });\n }\n if (onUploadProgress) {\n xhr.upload.addEventListener('progress', event => {\n onUploadProgress(convertToTransferProgressEvent(event));\n logger.debug(event);\n });\n }\n xhr.addEventListener('error', () => {\n const networkError = new StorageError({\n message: NETWORK_ERROR_MESSAGE,\n name: NETWORK_ERROR_CODE,\n });\n logger.error(NETWORK_ERROR_MESSAGE);\n reject(networkError);\n xhr = null; // clean up request\n });\n // Handle browser request cancellation (as opposed to a manual cancellation)\n xhr.addEventListener('abort', () => {\n // The abort event can be triggered after the error or load event. So we need to check if the xhr is null.\n // When request is aborted by AbortSignal, the promise is rejected in the abortSignal's 'abort' event listener.\n if (!xhr || abortSignal?.aborted)\n return;\n // Handle abort request caused by browser instead of AbortController\n // see: https://github.com/axios/axios/issues/537\n const error = buildHandlerError(ABORT_ERROR_MESSAGE, ABORT_ERROR_CODE);\n logger.error(ABORT_ERROR_MESSAGE);\n reject(error);\n xhr = null; // clean up request\n });\n // Skip handling timeout error since we don't have a timeout\n xhr.addEventListener('readystatechange', () => {\n if (!xhr || xhr.readyState !== xhr.DONE) {\n return;\n }\n const onloadend = () => {\n // The load event is triggered after the error/abort/load event. So we need to check if the xhr is null.\n if (!xhr)\n return;\n const responseHeaders = convertResponseHeaders(xhr.getAllResponseHeaders());\n const { responseType: loadEndResponseType } = xhr;\n const responseBlob = xhr.response;\n const responseText = loadEndResponseType === 'text' ? xhr.responseText : '';\n const bodyMixIn = {\n blob: () => Promise.resolve(responseBlob),\n text: withMemoization(() => loadEndResponseType === 'blob'\n ? readBlobAsText(responseBlob)\n : Promise.resolve(responseText)),\n json: () => Promise.reject(\n // S3 does not support JSON response. So fail-fast here with nicer error message.\n new Error('Parsing response to JSON is not implemented. Please use response.text() instead.')),\n };\n const response = {\n statusCode: xhr.status,\n headers: responseHeaders,\n // The xhr.responseType is only set to 'blob' for streaming binary S3 object data. The streaming data is\n // exposed via public interface of Storage.get(). So we need to return the response as a Blob object for\n // backward compatibility. In other cases, the response payload is only used internally, we return it is\n // {@link ResponseBodyMixin}\n body: (xhr.responseType === 'blob'\n ? Object.assign(responseBlob, bodyMixIn)\n : bodyMixIn),\n };\n resolve(response);\n xhr = null; // clean up request\n };\n // readystate handler is calling before onerror or ontimeout handlers,\n // so we should call onloadend on the next 'tick'\n // @see https://github.com/axios/axios/blob/9588fcdec8aca45c3ba2f7968988a5d03f23168c/lib/adapters/xhr.js#L98-L99\n setTimeout(onloadend);\n });\n if (abortSignal) {\n const onCanceled = () => {\n // The abort event is triggered after the error or load event. So we need to check if the xhr is null.\n if (!xhr) {\n return;\n }\n const canceledError = new CanceledError({\n name: CANCELED_ERROR_CODE,\n message: CANCELED_ERROR_MESSAGE,\n });\n reject(canceledError);\n xhr.abort();\n xhr = null;\n };\n abortSignal.aborted\n ? onCanceled()\n : abortSignal.addEventListener('abort', onCanceled);\n }\n if (typeof ReadableStream === 'function' &&\n body instanceof ReadableStream) {\n // This does not matter as previous implementation uses Axios which does not support ReadableStream anyway.\n throw new Error('ReadableStream request payload is not supported.');\n }\n xhr.send(body ?? null);\n });\n};\nconst convertToTransferProgressEvent = (event) => ({\n transferredBytes: event.loaded,\n totalBytes: event.lengthComputable ? event.total : undefined,\n});\nconst buildHandlerError = (message, name) => {\n const error = new Error(message);\n error.name = name;\n return error;\n};\n/**\n * Convert xhr.getAllResponseHeaders() string to a Record<string, string>. Note that modern browser already returns\n * header names in lowercase.\n * @param xhrHeaders - string of headers returned from xhr.getAllResponseHeaders()\n */\nconst convertResponseHeaders = (xhrHeaders) => {\n if (!xhrHeaders) {\n return {};\n }\n return xhrHeaders\n .split('\\r\\n')\n .reduce((headerMap, line) => {\n const parts = line.split(': ');\n const header = parts.shift();\n const value = parts.join(': ');\n headerMap[header.toLowerCase()] = value;\n return headerMap;\n }, {});\n};\nconst readBlobAsText = (blob) => {\n const reader = new FileReader();\n return new Promise((resolve, reject) => {\n reader.onloadend = () => {\n if (reader.readyState !== FileReader.DONE) {\n return;\n }\n resolve(reader.result);\n };\n reader.onerror = () => {\n reject(reader.error);\n };\n reader.readAsText(blob);\n });\n};\n// To add more forbidden headers as found set by S3. Intentionally NOT list all of them here to save bundle size.\n// https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_header_name\nconst FORBIDDEN_HEADERS = ['host'];\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"xhrTransferHandler.mjs","sources":["../../../../../../../src/providers/s3/utils/client/runtime/xhrTransferHandler.ts"],"sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport { withMemoization, } from '@aws-amplify/core/internals/aws-client-utils';\nimport { ConsoleLogger } from '@aws-amplify/core';\nimport { CanceledError } from '../../../../../errors/CanceledError';\nimport { StorageError } from '../../../../../errors/StorageError';\nimport { ABORT_ERROR_CODE, ABORT_ERROR_MESSAGE, CANCELED_ERROR_CODE, CANCELED_ERROR_MESSAGE, NETWORK_ERROR_CODE, NETWORK_ERROR_MESSAGE, } from './constants';\nconst logger = new ConsoleLogger('xhr-http-handler');\n/**\n * Base transfer handler implementation using XMLHttpRequest to support upload and download progress events.\n *\n * @param request - The request object.\n * @param options - The request options.\n * @returns A promise that will be resolved with the response object.\n *\n * @internal\n */\nexport const xhrTransferHandler = (request, options) => {\n const { url, method, headers, body } = request;\n const { onDownloadProgress, onUploadProgress, responseType, abortSignal } = options;\n return new Promise((resolve, reject) => {\n let xhr = new XMLHttpRequest();\n xhr.open(method.toUpperCase(), url.toString());\n Object.entries(headers)\n .filter(([header]) => !FORBIDDEN_HEADERS.includes(header))\n .forEach(([header, value]) => {\n xhr.setRequestHeader(header, value);\n });\n xhr.responseType = responseType;\n if (onDownloadProgress) {\n xhr.addEventListener('progress', event => {\n onDownloadProgress(convertToTransferProgressEvent(event));\n logger.debug(event);\n });\n }\n if (onUploadProgress) {\n xhr.upload.addEventListener('progress', event => {\n onUploadProgress(convertToTransferProgressEvent(event));\n logger.debug(event);\n });\n }\n xhr.addEventListener('error', () => {\n const networkError = new StorageError({\n message: NETWORK_ERROR_MESSAGE,\n name: NETWORK_ERROR_CODE,\n });\n logger.error(NETWORK_ERROR_MESSAGE);\n reject(networkError);\n xhr = null; // clean up request\n });\n // Handle browser request cancellation (as opposed to a manual cancellation)\n xhr.addEventListener('abort', () => {\n // The abort event can be triggered after the error or load event. So we need to check if the xhr is null.\n // When request is aborted by AbortSignal, the promise is rejected in the abortSignal's 'abort' event listener.\n if (!xhr || abortSignal?.aborted)\n return;\n // Handle abort request caused by browser instead of AbortController\n // see: https://github.com/axios/axios/issues/537\n const error = buildHandlerError(ABORT_ERROR_MESSAGE, ABORT_ERROR_CODE);\n logger.error(ABORT_ERROR_MESSAGE);\n reject(error);\n xhr = null; // clean up request\n });\n // Skip handling timeout error since we don't have a timeout\n xhr.addEventListener('readystatechange', () => {\n if (!xhr || xhr.readyState !== xhr.DONE) {\n return;\n }\n const onloadend = () => {\n // The load event is triggered after the error/abort/load event. So we need to check if the xhr is null.\n if (!xhr)\n return;\n const responseHeaders = convertResponseHeaders(xhr.getAllResponseHeaders());\n const { responseType: loadEndResponseType } = xhr;\n const responseBlob = xhr.response;\n const responseText = loadEndResponseType === 'text' ? xhr.responseText : '';\n const bodyMixIn = {\n blob: () => Promise.resolve(responseBlob),\n text: withMemoization(() => loadEndResponseType === 'blob'\n ? readBlobAsText(responseBlob)\n : Promise.resolve(responseText)),\n json: () => Promise.reject(\n // S3 does not support JSON response. So fail-fast here with nicer error message.\n new Error('Parsing response to JSON is not implemented. Please use response.text() instead.')),\n };\n const response = {\n statusCode: xhr.status,\n headers: responseHeaders,\n // The xhr.responseType is only set to 'blob' for streaming binary S3 object data. The streaming data is\n // exposed via public interface of Storage.get(). So we need to return the response as a Blob object for\n // backward compatibility. In other cases, the response payload is only used internally, we return it is\n // {@link ResponseBodyMixin}\n body: (xhr.responseType === 'blob'\n ? Object.assign(responseBlob, bodyMixIn)\n : bodyMixIn),\n };\n resolve(response);\n xhr = null; // clean up request\n };\n // readystate handler is calling before onerror or ontimeout handlers,\n // so we should call onloadend on the next 'tick'\n // @see https://github.com/axios/axios/blob/9588fcdec8aca45c3ba2f7968988a5d03f23168c/lib/adapters/xhr.js#L98-L99\n setTimeout(onloadend);\n });\n if (abortSignal) {\n const onCanceled = () => {\n // The abort event is triggered after the error or load event. So we need to check if the xhr is null.\n if (!xhr) {\n return;\n }\n const canceledError = new CanceledError({\n name: CANCELED_ERROR_CODE,\n message: CANCELED_ERROR_MESSAGE,\n });\n reject(canceledError);\n xhr.abort();\n xhr = null;\n };\n abortSignal.aborted\n ? onCanceled()\n : abortSignal.addEventListener('abort', onCanceled);\n }\n if (typeof ReadableStream === 'function' &&\n body instanceof ReadableStream) {\n // This does not matter as previous implementation uses Axios which does not support ReadableStream anyway.\n throw new Error('ReadableStream request payload is not supported.');\n }\n xhr.send(body ?? null);\n });\n};\nconst convertToTransferProgressEvent = (event) => ({\n // `loaded` can exceed the `total` in some cases due to platform issues/bugs e.g. React Native & Expo Android\n // clamp `loaded` values down to `total` if possible.\n transferredBytes: event.lengthComputable\n ? Math.min(event.loaded, event.total)\n : event.loaded,\n totalBytes: event.lengthComputable ? event.total : undefined,\n});\nconst buildHandlerError = (message, name) => {\n const error = new Error(message);\n error.name = name;\n return error;\n};\n/**\n * Convert xhr.getAllResponseHeaders() string to a Record<string, string>. Note that modern browser already returns\n * header names in lowercase.\n * @param xhrHeaders - string of headers returned from xhr.getAllResponseHeaders()\n */\nconst convertResponseHeaders = (xhrHeaders) => {\n if (!xhrHeaders) {\n return {};\n }\n return xhrHeaders\n .split('\\r\\n')\n .reduce((headerMap, line) => {\n const parts = line.split(': ');\n const header = parts.shift();\n const value = parts.join(': ');\n headerMap[header.toLowerCase()] = value;\n return headerMap;\n }, {});\n};\nconst readBlobAsText = (blob) => {\n const reader = new FileReader();\n return new Promise((resolve, reject) => {\n reader.onloadend = () => {\n if (reader.readyState !== FileReader.DONE) {\n return;\n }\n resolve(reader.result);\n };\n reader.onerror = () => {\n reject(reader.error);\n };\n reader.readAsText(blob);\n });\n};\n// To add more forbidden headers as found set by S3. Intentionally NOT list all of them here to save bundle size.\n// https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_header_name\nconst FORBIDDEN_HEADERS = ['host'];\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,119 +1,119 @@
1
1
  {
2
- "name": "@aws-amplify/storage",
3
- "version": "6.9.5",
4
- "description": "Storage category of aws-amplify",
5
- "main": "./dist/cjs/index.js",
6
- "module": "./dist/esm/index.mjs",
7
- "react-native": {
8
- "./dist/cjs/index": "./src/index.ts",
9
- "fast-xml-parser": "fast-xml-parser",
10
- "buffer": "buffer"
11
- },
12
- "typings": "./dist/esm/index.d.ts",
13
- "browser": {
14
- "./dist/esm/providers/s3/utils/client/runtime/base64/index.native.mjs": "./dist/esm/providers/s3/utils/client/runtime/base64/index.browser.mjs",
15
- "./dist/esm/providers/s3/utils/client/runtime/s3TransferHandler/fetch.mjs": "./dist/esm/providers/s3/utils/client/runtime/s3TransferHandler/xhr.mjs",
16
- "./dist/esm/providers/s3/utils/client/runtime/xmlParser/pureJs.mjs": "./dist/esm/providers/s3/utils/client/runtime/xmlParser/dom.mjs",
17
- "fast-xml-parser": false,
18
- "buffer": false
19
- },
20
- "sideEffects": false,
21
- "publishConfig": {
22
- "access": "public"
23
- },
24
- "scripts": {
25
- "test": "npm run lint && jest -w 1 --coverage --logHeapUsage",
26
- "build-with-test": "npm test && npm run build",
27
- "build:umd": "webpack && webpack --config ./webpack.config.dev.js",
28
- "build:esm-cjs": "rollup --forceExit -c rollup.config.mjs",
29
- "build:watch": "npm run build:esm-cjs -- --watch",
30
- "build": "npm run clean && npm run build:esm-cjs && npm run build:umd",
31
- "clean": "npm run clean:size && rimraf lib-esm lib dist",
32
- "clean:size": "rimraf dual-publish-tmp tmp*",
33
- "format": "echo \"Not implemented\"",
34
- "lint": "eslint '**/*.{ts,tsx}' && npm run ts-coverage",
35
- "lint:fix": "eslint '**/*.{ts,tsx}' --fix",
36
- "ts-coverage": "typescript-coverage-report -p ./tsconfig.build.json -t 90.31"
37
- },
38
- "typesVersions": {
39
- ">=4.2": {
40
- "s3": [
41
- "./dist/esm/providers/s3/index.d.ts"
42
- ],
43
- "internals": [
44
- "./dist/esm/internals/index.d.ts"
45
- ],
46
- "server": [
47
- "./dist/esm/server.d.ts"
48
- ],
49
- "s3/server": [
50
- "./dist/esm/providers/s3/server.d.ts"
51
- ]
52
- }
53
- },
54
- "repository": {
55
- "type": "git",
56
- "url": "https://github.com/aws-amplify/amplify-js.git"
57
- },
58
- "author": "Amazon Web Services",
59
- "license": "Apache-2.0",
60
- "bugs": {
61
- "url": "https://github.com/aws/aws-amplify/issues"
62
- },
63
- "homepage": "https://aws-amplify.github.io/",
64
- "files": [
65
- "dist/cjs",
66
- "dist/esm",
67
- "internals",
68
- "src",
69
- "server",
70
- "s3"
71
- ],
72
- "dependencies": {
73
- "@aws-sdk/types": "3.398.0",
74
- "@smithy/md5-js": "2.0.7",
75
- "buffer": "4.9.2",
76
- "crc-32": "1.2.2",
77
- "fast-xml-parser": "^4.4.1",
78
- "tslib": "^2.5.0"
79
- },
80
- "exports": {
81
- ".": {
82
- "react-native": "./dist/cjs/index.js",
83
- "types": "./dist/esm/index.d.ts",
84
- "import": "./dist/esm/index.mjs",
85
- "require": "./dist/cjs/index.js"
86
- },
87
- "./internals": {
88
- "types": "./dist/esm/internals/index.d.ts",
89
- "import": "./dist/esm/internals/index.mjs",
90
- "require": "./dist/cjs/internals/index.js"
91
- },
92
- "./server": {
93
- "types": "./dist/esm/server.d.ts",
94
- "import": "./dist/esm/server.mjs",
95
- "require": "./dist/cjs/server.js"
96
- },
97
- "./s3": {
98
- "react-native": "./dist/cjs/providers/s3/index.js",
99
- "types": "./dist/esm/providers/s3/index.d.ts",
100
- "import": "./dist/esm/providers/s3/index.mjs",
101
- "require": "./dist/cjs/providers/s3/index.js"
102
- },
103
- "./s3/server": {
104
- "types": "./dist/esm/providers/s3/server.d.ts",
105
- "import": "./dist/esm/providers/s3/server.mjs",
106
- "require": "./dist/cjs/providers/s3/server.js"
107
- },
108
- "./package.json": "./package.json"
109
- },
110
- "peerDependencies": {
111
- "@aws-amplify/core": "^6.1.0"
112
- },
113
- "devDependencies": {
114
- "@aws-amplify/core": "6.13.1",
115
- "@aws-amplify/react-native": "1.1.10",
116
- "@types/node": "20.14.12"
117
- },
118
- "gitHead": "0b91f4857921a599b31999f04e858a4221eb9c51"
2
+ "name": "@aws-amplify/storage",
3
+ "version": "6.9.6-unstable.6ea70f9.0+6ea70f9",
4
+ "description": "Storage category of aws-amplify",
5
+ "main": "./dist/cjs/index.js",
6
+ "module": "./dist/esm/index.mjs",
7
+ "react-native": {
8
+ "./dist/cjs/index": "./src/index.ts",
9
+ "fast-xml-parser": "fast-xml-parser",
10
+ "buffer": "buffer"
11
+ },
12
+ "typings": "./dist/esm/index.d.ts",
13
+ "browser": {
14
+ "./dist/esm/providers/s3/utils/client/runtime/base64/index.native.mjs": "./dist/esm/providers/s3/utils/client/runtime/base64/index.browser.mjs",
15
+ "./dist/esm/providers/s3/utils/client/runtime/s3TransferHandler/fetch.mjs": "./dist/esm/providers/s3/utils/client/runtime/s3TransferHandler/xhr.mjs",
16
+ "./dist/esm/providers/s3/utils/client/runtime/xmlParser/pureJs.mjs": "./dist/esm/providers/s3/utils/client/runtime/xmlParser/dom.mjs",
17
+ "fast-xml-parser": false,
18
+ "buffer": false
19
+ },
20
+ "sideEffects": false,
21
+ "publishConfig": {
22
+ "access": "public"
23
+ },
24
+ "scripts": {
25
+ "test": "npm run lint && jest -w 1 --coverage --logHeapUsage",
26
+ "build-with-test": "npm test && npm run build",
27
+ "build:umd": "webpack && webpack --config ./webpack.config.dev.js",
28
+ "build:esm-cjs": "rollup --forceExit -c rollup.config.mjs",
29
+ "build:watch": "npm run build:esm-cjs -- --watch",
30
+ "build": "npm run clean && npm run build:esm-cjs && npm run build:umd",
31
+ "clean": "npm run clean:size && rimraf lib-esm lib dist",
32
+ "clean:size": "rimraf dual-publish-tmp tmp*",
33
+ "format": "echo \"Not implemented\"",
34
+ "lint": "eslint '**/*.{ts,tsx}' && npm run ts-coverage",
35
+ "lint:fix": "eslint '**/*.{ts,tsx}' --fix",
36
+ "ts-coverage": "typescript-coverage-report -p ./tsconfig.build.json -t 90.31"
37
+ },
38
+ "typesVersions": {
39
+ ">=4.2": {
40
+ "s3": [
41
+ "./dist/esm/providers/s3/index.d.ts"
42
+ ],
43
+ "internals": [
44
+ "./dist/esm/internals/index.d.ts"
45
+ ],
46
+ "server": [
47
+ "./dist/esm/server.d.ts"
48
+ ],
49
+ "s3/server": [
50
+ "./dist/esm/providers/s3/server.d.ts"
51
+ ]
52
+ }
53
+ },
54
+ "repository": {
55
+ "type": "git",
56
+ "url": "https://github.com/aws-amplify/amplify-js.git"
57
+ },
58
+ "author": "Amazon Web Services",
59
+ "license": "Apache-2.0",
60
+ "bugs": {
61
+ "url": "https://github.com/aws/aws-amplify/issues"
62
+ },
63
+ "homepage": "https://aws-amplify.github.io/",
64
+ "files": [
65
+ "dist/cjs",
66
+ "dist/esm",
67
+ "internals",
68
+ "src",
69
+ "server",
70
+ "s3"
71
+ ],
72
+ "dependencies": {
73
+ "@aws-sdk/types": "3.398.0",
74
+ "@smithy/md5-js": "2.0.7",
75
+ "buffer": "4.9.2",
76
+ "crc-32": "1.2.2",
77
+ "fast-xml-parser": "^4.4.1",
78
+ "tslib": "^2.5.0"
79
+ },
80
+ "exports": {
81
+ ".": {
82
+ "react-native": "./dist/cjs/index.js",
83
+ "types": "./dist/esm/index.d.ts",
84
+ "import": "./dist/esm/index.mjs",
85
+ "require": "./dist/cjs/index.js"
86
+ },
87
+ "./internals": {
88
+ "types": "./dist/esm/internals/index.d.ts",
89
+ "import": "./dist/esm/internals/index.mjs",
90
+ "require": "./dist/cjs/internals/index.js"
91
+ },
92
+ "./server": {
93
+ "types": "./dist/esm/server.d.ts",
94
+ "import": "./dist/esm/server.mjs",
95
+ "require": "./dist/cjs/server.js"
96
+ },
97
+ "./s3": {
98
+ "react-native": "./dist/cjs/providers/s3/index.js",
99
+ "types": "./dist/esm/providers/s3/index.d.ts",
100
+ "import": "./dist/esm/providers/s3/index.mjs",
101
+ "require": "./dist/cjs/providers/s3/index.js"
102
+ },
103
+ "./s3/server": {
104
+ "types": "./dist/esm/providers/s3/server.d.ts",
105
+ "import": "./dist/esm/providers/s3/server.mjs",
106
+ "require": "./dist/cjs/providers/s3/server.js"
107
+ },
108
+ "./package.json": "./package.json"
109
+ },
110
+ "peerDependencies": {
111
+ "@aws-amplify/core": "6.13.2-unstable.6ea70f9.0+6ea70f9"
112
+ },
113
+ "devDependencies": {
114
+ "@aws-amplify/core": "6.13.2-unstable.6ea70f9.0+6ea70f9",
115
+ "@aws-amplify/react-native": "1.1.11-unstable.6ea70f9.0+6ea70f9",
116
+ "@types/node": "20.14.12"
117
+ },
118
+ "gitHead": "6ea70f9374ad5fd29d13a2d8bd89159c55da3932"
119
119
  }
@@ -190,7 +190,11 @@ export const xhrTransferHandler: TransferHandler<
190
190
  const convertToTransferProgressEvent = (
191
191
  event: ProgressEvent,
192
192
  ): TransferProgressEvent => ({
193
- transferredBytes: event.loaded,
193
+ // `loaded` can exceed the `total` in some cases due to platform issues/bugs e.g. React Native & Expo Android
194
+ // clamp `loaded` values down to `total` if possible.
195
+ transferredBytes: event.lengthComputable
196
+ ? Math.min(event.loaded, event.total)
197
+ : event.loaded,
194
198
  totalBytes: event.lengthComputable ? event.total : undefined,
195
199
  });
196
200