@aws-amplify/storage 6.6.0 → 6.6.1-storage-browser.37d5283.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.
- package/dist/cjs/errors/constants.js +8 -0
- package/dist/cjs/errors/constants.js.map +1 -0
- package/dist/cjs/errors/types/validation.js +20 -0
- package/dist/cjs/errors/types/validation.js.map +1 -1
- package/dist/cjs/providers/s3/apis/downloadData.js +3 -3
- package/dist/cjs/providers/s3/apis/downloadData.js.map +1 -1
- package/dist/cjs/providers/s3/apis/internal/copy.js +59 -14
- package/dist/cjs/providers/s3/apis/internal/copy.js.map +1 -1
- package/dist/cjs/providers/s3/apis/internal/getProperties.js +3 -4
- package/dist/cjs/providers/s3/apis/internal/getProperties.js.map +1 -1
- package/dist/cjs/providers/s3/apis/internal/getUrl.js +3 -3
- package/dist/cjs/providers/s3/apis/internal/getUrl.js.map +1 -1
- package/dist/cjs/providers/s3/apis/internal/list.js +4 -4
- package/dist/cjs/providers/s3/apis/internal/list.js.map +1 -1
- package/dist/cjs/providers/s3/apis/internal/remove.js +3 -4
- package/dist/cjs/providers/s3/apis/internal/remove.js.map +1 -1
- package/dist/cjs/providers/s3/apis/uploadData/multipart/initialUpload.js +22 -2
- package/dist/cjs/providers/s3/apis/uploadData/multipart/initialUpload.js.map +1 -1
- package/dist/cjs/providers/s3/apis/uploadData/multipart/uploadCache.js +3 -2
- package/dist/cjs/providers/s3/apis/uploadData/multipart/uploadCache.js.map +1 -1
- package/dist/cjs/providers/s3/apis/uploadData/multipart/uploadHandlers.js +19 -8
- package/dist/cjs/providers/s3/apis/uploadData/multipart/uploadHandlers.js.map +1 -1
- package/dist/cjs/providers/s3/apis/uploadData/multipart/uploadPartExecutor.js +20 -11
- package/dist/cjs/providers/s3/apis/uploadData/multipart/uploadPartExecutor.js.map +1 -1
- package/dist/cjs/providers/s3/apis/uploadData/putObjectJob.js +20 -7
- package/dist/cjs/providers/s3/apis/uploadData/putObjectJob.js.map +1 -1
- package/dist/cjs/providers/s3/apis/uploadData/validateObjectNotExists.js +25 -0
- package/dist/cjs/providers/s3/apis/uploadData/validateObjectNotExists.js.map +1 -0
- package/dist/cjs/providers/s3/utils/client/s3control/base.js +45 -0
- package/dist/cjs/providers/s3/utils/client/s3control/base.js.map +1 -0
- package/dist/cjs/providers/s3/utils/client/s3control/getDataAccess.js +58 -0
- package/dist/cjs/providers/s3/utils/client/s3control/getDataAccess.js.map +1 -0
- package/dist/cjs/providers/s3/utils/client/s3control/index.js +11 -0
- package/dist/cjs/providers/s3/utils/client/s3control/index.js.map +1 -0
- package/dist/cjs/providers/s3/utils/client/s3control/listCallerAccessGrants.js +59 -0
- package/dist/cjs/providers/s3/utils/client/s3control/listCallerAccessGrants.js.map +1 -0
- package/dist/cjs/providers/s3/utils/client/s3control/types.js.map +1 -0
- package/dist/cjs/providers/s3/utils/client/{abortMultipartUpload.js → s3data/abortMultipartUpload.js} +1 -1
- package/dist/cjs/providers/s3/utils/client/s3data/abortMultipartUpload.js.map +1 -0
- package/dist/cjs/providers/s3/utils/client/{base.js → s3data/base.js} +2 -2
- package/dist/cjs/providers/s3/utils/client/s3data/base.js.map +1 -0
- package/dist/cjs/providers/s3/utils/client/{completeMultipartUpload.js → s3data/completeMultipartUpload.js} +14 -9
- package/dist/cjs/providers/s3/utils/client/s3data/completeMultipartUpload.js.map +1 -0
- package/dist/cjs/providers/s3/utils/client/{copyObject.js → s3data/copyObject.js} +1 -1
- package/dist/cjs/providers/s3/utils/client/s3data/copyObject.js.map +1 -0
- package/dist/cjs/providers/s3/utils/client/{createMultipartUpload.js → s3data/createMultipartUpload.js} +7 -2
- package/dist/cjs/providers/s3/utils/client/s3data/createMultipartUpload.js.map +1 -0
- package/dist/cjs/providers/s3/utils/client/{deleteObject.js → s3data/deleteObject.js} +1 -1
- package/dist/cjs/providers/s3/utils/client/s3data/deleteObject.js.map +1 -0
- package/dist/cjs/providers/s3/utils/client/{getObject.js → s3data/getObject.js} +1 -1
- package/dist/cjs/providers/s3/utils/client/s3data/getObject.js.map +1 -0
- package/dist/cjs/providers/s3/utils/client/{headObject.js → s3data/headObject.js} +1 -1
- package/dist/cjs/providers/s3/utils/client/s3data/headObject.js.map +1 -0
- package/dist/cjs/providers/s3/utils/client/s3data/index.js.map +1 -0
- package/dist/cjs/providers/s3/utils/client/{listObjectsV2.js → s3data/listObjectsV2.js} +1 -1
- package/dist/cjs/providers/s3/utils/client/s3data/listObjectsV2.js.map +1 -0
- package/dist/cjs/providers/s3/utils/client/{listParts.js → s3data/listParts.js} +2 -1
- package/dist/cjs/providers/s3/utils/client/s3data/listParts.js.map +1 -0
- package/dist/cjs/providers/s3/utils/client/{putObject.js → s3data/putObject.js} +2 -1
- package/dist/cjs/providers/s3/utils/client/s3data/putObject.js.map +1 -0
- package/dist/cjs/providers/s3/utils/client/s3data/types.js +6 -0
- package/dist/cjs/providers/s3/utils/client/s3data/types.js.map +1 -0
- package/dist/cjs/providers/s3/utils/client/{uploadPart.js → s3data/uploadPart.js} +3 -2
- package/dist/cjs/providers/s3/utils/client/s3data/uploadPart.js.map +1 -0
- package/dist/cjs/providers/s3/utils/client/utils/index.js +3 -1
- package/dist/cjs/providers/s3/utils/client/utils/index.js.map +1 -1
- package/dist/cjs/providers/s3/utils/client/utils/retryDecider.js +61 -0
- package/dist/cjs/providers/s3/utils/client/utils/retryDecider.js.map +1 -0
- package/dist/cjs/providers/s3/utils/crc32.js +37 -0
- package/dist/cjs/providers/s3/utils/crc32.js.map +1 -0
- package/dist/cjs/providers/s3/utils/crc32.native.js +11 -0
- package/dist/cjs/providers/s3/utils/crc32.native.js.map +1 -0
- package/dist/cjs/providers/s3/utils/resolveIdentityId.js +14 -0
- package/dist/cjs/providers/s3/utils/resolveIdentityId.js.map +1 -0
- package/dist/cjs/providers/s3/utils/resolveS3ConfigAndInput.js +74 -14
- package/dist/cjs/providers/s3/utils/resolveS3ConfigAndInput.js.map +1 -1
- package/dist/cjs/providers/s3/utils/validateStorageOperationInput.js +4 -1
- package/dist/cjs/providers/s3/utils/validateStorageOperationInput.js.map +1 -1
- package/dist/cjs/providers/s3/utils/validateStorageOperationInputWithPrefix.js +4 -1
- package/dist/cjs/providers/s3/utils/validateStorageOperationInputWithPrefix.js.map +1 -1
- package/dist/cjs/storageBrowser/apis/constants.js +9 -0
- package/dist/cjs/storageBrowser/apis/constants.js.map +1 -0
- package/dist/cjs/storageBrowser/apis/getDataAccess.js +57 -0
- package/dist/cjs/storageBrowser/apis/getDataAccess.js.map +1 -0
- package/dist/cjs/storageBrowser/apis/listCallerAccessGrants.js +79 -0
- package/dist/cjs/storageBrowser/apis/listCallerAccessGrants.js.map +1 -0
- package/dist/cjs/storageBrowser/apis/types.js +6 -0
- package/dist/cjs/storageBrowser/apis/types.js.map +1 -0
- package/dist/cjs/storageBrowser/index.js +11 -0
- package/dist/cjs/storageBrowser/index.js.map +1 -0
- package/dist/cjs/storageBrowser/locationCredentialsStore/constants.js +9 -0
- package/dist/cjs/storageBrowser/locationCredentialsStore/constants.js.map +1 -0
- package/dist/cjs/storageBrowser/locationCredentialsStore/create.js +36 -0
- package/dist/cjs/storageBrowser/locationCredentialsStore/create.js.map +1 -0
- package/dist/cjs/storageBrowser/locationCredentialsStore/index.js +9 -0
- package/dist/cjs/storageBrowser/locationCredentialsStore/index.js.map +1 -0
- package/dist/cjs/storageBrowser/locationCredentialsStore/registry.js +58 -0
- package/dist/cjs/storageBrowser/locationCredentialsStore/registry.js.map +1 -0
- package/dist/cjs/storageBrowser/locationCredentialsStore/store.js +99 -0
- package/dist/cjs/storageBrowser/locationCredentialsStore/store.js.map +1 -0
- package/dist/cjs/storageBrowser/managedAuthConfigAdapter/createListLocationsHandler.js +15 -0
- package/dist/cjs/storageBrowser/managedAuthConfigAdapter/createListLocationsHandler.js.map +1 -0
- package/dist/cjs/storageBrowser/managedAuthConfigAdapter/createLocationCredentialsHandler.js +29 -0
- package/dist/cjs/storageBrowser/managedAuthConfigAdapter/createLocationCredentialsHandler.js.map +1 -0
- package/dist/cjs/storageBrowser/managedAuthConfigAdapter/createManagedAuthConfigAdapter.js +32 -0
- package/dist/cjs/storageBrowser/managedAuthConfigAdapter/createManagedAuthConfigAdapter.js.map +1 -0
- package/dist/cjs/storageBrowser/managedAuthConfigAdapter/index.js +9 -0
- package/dist/cjs/storageBrowser/managedAuthConfigAdapter/index.js.map +1 -0
- package/dist/cjs/storageBrowser/types.js +6 -0
- package/dist/cjs/storageBrowser/types.js.map +1 -0
- package/dist/esm/errors/constants.d.ts +1 -0
- package/dist/esm/errors/constants.mjs +6 -0
- package/dist/esm/errors/constants.mjs.map +1 -0
- package/dist/esm/errors/types/validation.d.ts +6 -1
- package/dist/esm/errors/types/validation.mjs +20 -0
- package/dist/esm/errors/types/validation.mjs.map +1 -1
- package/dist/esm/providers/s3/apis/downloadData.mjs +13 -13
- package/dist/esm/providers/s3/apis/downloadData.mjs.map +1 -1
- package/dist/esm/providers/s3/apis/internal/copy.mjs +69 -24
- package/dist/esm/providers/s3/apis/internal/copy.mjs.map +1 -1
- package/dist/esm/providers/s3/apis/internal/getProperties.mjs +13 -14
- package/dist/esm/providers/s3/apis/internal/getProperties.mjs.map +1 -1
- package/dist/esm/providers/s3/apis/internal/getUrl.mjs +13 -13
- package/dist/esm/providers/s3/apis/internal/getUrl.mjs.map +1 -1
- package/dist/esm/providers/s3/apis/internal/list.mjs +13 -13
- package/dist/esm/providers/s3/apis/internal/list.mjs.map +1 -1
- package/dist/esm/providers/s3/apis/internal/remove.mjs +13 -14
- package/dist/esm/providers/s3/apis/internal/remove.mjs.map +1 -1
- package/dist/esm/providers/s3/apis/uploadData/multipart/initialUpload.d.ts +2 -1
- package/dist/esm/providers/s3/apis/uploadData/multipart/initialUpload.mjs +32 -12
- package/dist/esm/providers/s3/apis/uploadData/multipart/initialUpload.mjs.map +1 -1
- package/dist/esm/providers/s3/apis/uploadData/multipart/uploadCache.d.ts +3 -1
- package/dist/esm/providers/s3/apis/uploadData/multipart/uploadCache.mjs +13 -12
- package/dist/esm/providers/s3/apis/uploadData/multipart/uploadCache.mjs.map +1 -1
- package/dist/esm/providers/s3/apis/uploadData/multipart/uploadHandlers.mjs +27 -16
- package/dist/esm/providers/s3/apis/uploadData/multipart/uploadHandlers.mjs.map +1 -1
- package/dist/esm/providers/s3/apis/uploadData/multipart/uploadPartExecutor.d.ts +3 -2
- package/dist/esm/providers/s3/apis/uploadData/multipart/uploadPartExecutor.mjs +27 -18
- package/dist/esm/providers/s3/apis/uploadData/multipart/uploadPartExecutor.mjs.map +1 -1
- package/dist/esm/providers/s3/apis/uploadData/putObjectJob.mjs +30 -17
- package/dist/esm/providers/s3/apis/uploadData/putObjectJob.mjs.map +1 -1
- package/dist/esm/providers/s3/apis/uploadData/validateObjectNotExists.d.ts +3 -0
- package/dist/esm/providers/s3/apis/uploadData/validateObjectNotExists.mjs +34 -0
- package/dist/esm/providers/s3/apis/uploadData/validateObjectNotExists.mjs.map +1 -0
- package/dist/esm/providers/s3/types/index.d.ts +1 -1
- package/dist/esm/providers/s3/types/inputs.d.ts +5 -2
- package/dist/esm/providers/s3/types/options.d.ts +38 -1
- package/dist/esm/providers/s3/utils/client/s3control/base.d.ts +31 -0
- package/dist/esm/providers/s3/utils/client/s3control/base.mjs +48 -0
- package/dist/esm/providers/s3/utils/client/s3control/base.mjs.map +1 -0
- package/dist/esm/providers/s3/utils/client/s3control/getDataAccess.d.ts +26 -0
- package/dist/esm/providers/s3/utils/client/s3control/getDataAccess.mjs +63 -0
- package/dist/esm/providers/s3/utils/client/s3control/getDataAccess.mjs.map +1 -0
- package/dist/esm/providers/s3/utils/client/s3control/index.d.ts +2 -0
- package/dist/esm/providers/s3/utils/client/s3control/index.mjs +3 -0
- package/dist/esm/providers/s3/utils/client/s3control/index.mjs.map +1 -0
- package/dist/esm/providers/s3/utils/client/s3control/listCallerAccessGrants.d.ts +26 -0
- package/dist/esm/providers/s3/utils/client/s3control/listCallerAccessGrants.mjs +64 -0
- package/dist/esm/providers/s3/utils/client/s3control/listCallerAccessGrants.mjs.map +1 -0
- package/dist/esm/providers/s3/utils/client/s3control/types.d.ts +176 -0
- package/dist/esm/providers/s3/utils/client/{abortMultipartUpload.d.ts → s3data/abortMultipartUpload.d.ts} +4 -4
- package/dist/esm/providers/s3/utils/client/{abortMultipartUpload.mjs → s3data/abortMultipartUpload.mjs} +6 -6
- package/dist/esm/providers/s3/utils/client/s3data/abortMultipartUpload.mjs.map +1 -0
- package/dist/esm/providers/s3/utils/client/{base.d.ts → s3data/base.d.ts} +1 -1
- package/dist/esm/providers/s3/utils/client/{base.mjs → s3data/base.mjs} +5 -5
- package/dist/esm/providers/s3/utils/client/s3data/base.mjs.map +1 -0
- package/dist/esm/providers/s3/utils/client/{completeMultipartUpload.d.ts → s3data/completeMultipartUpload.d.ts} +6 -6
- package/dist/esm/providers/s3/utils/client/{completeMultipartUpload.mjs → s3data/completeMultipartUpload.mjs} +20 -14
- package/dist/esm/providers/s3/utils/client/s3data/completeMultipartUpload.mjs.map +1 -0
- package/dist/esm/providers/s3/utils/client/{copyObject.d.ts → s3data/copyObject.d.ts} +4 -4
- package/dist/esm/providers/s3/utils/client/{copyObject.mjs → s3data/copyObject.mjs} +6 -6
- package/dist/esm/providers/s3/utils/client/s3data/copyObject.mjs.map +1 -0
- package/dist/esm/providers/s3/utils/client/{createMultipartUpload.d.ts → s3data/createMultipartUpload.d.ts} +4 -4
- package/dist/esm/providers/s3/utils/client/{createMultipartUpload.mjs → s3data/createMultipartUpload.mjs} +12 -7
- package/dist/esm/providers/s3/utils/client/s3data/createMultipartUpload.mjs.map +1 -0
- package/dist/esm/providers/s3/utils/client/{deleteObject.d.ts → s3data/deleteObject.d.ts} +4 -4
- package/dist/esm/providers/s3/utils/client/{deleteObject.mjs → s3data/deleteObject.mjs} +6 -6
- package/dist/esm/providers/s3/utils/client/s3data/deleteObject.mjs.map +1 -0
- package/dist/esm/providers/s3/utils/client/{getObject.d.ts → s3data/getObject.d.ts} +4 -4
- package/dist/esm/providers/s3/utils/client/{getObject.mjs → s3data/getObject.mjs} +7 -7
- package/dist/esm/providers/s3/utils/client/s3data/getObject.mjs.map +1 -0
- package/dist/esm/providers/s3/utils/client/{headObject.d.ts → s3data/headObject.d.ts} +4 -4
- package/dist/esm/providers/s3/utils/client/{headObject.mjs → s3data/headObject.mjs} +6 -6
- package/dist/esm/providers/s3/utils/client/s3data/headObject.mjs.map +1 -0
- package/dist/esm/providers/s3/utils/client/{listObjectsV2.d.ts → s3data/listObjectsV2.d.ts} +4 -4
- package/dist/esm/providers/s3/utils/client/{listObjectsV2.mjs → s3data/listObjectsV2.mjs} +6 -6
- package/dist/esm/providers/s3/utils/client/s3data/listObjectsV2.mjs.map +1 -0
- package/dist/esm/providers/s3/utils/client/{listParts.d.ts → s3data/listParts.d.ts} +4 -4
- package/dist/esm/providers/s3/utils/client/{listParts.mjs → s3data/listParts.mjs} +7 -6
- package/dist/esm/providers/s3/utils/client/s3data/listParts.mjs.map +1 -0
- package/dist/esm/providers/s3/utils/client/{putObject.d.ts → s3data/putObject.d.ts} +5 -5
- package/dist/esm/providers/s3/utils/client/{putObject.mjs → s3data/putObject.mjs} +7 -6
- package/dist/esm/providers/s3/utils/client/s3data/putObject.mjs.map +1 -0
- package/dist/esm/providers/s3/utils/client/s3data/types.mjs +2 -0
- package/dist/esm/providers/s3/utils/client/s3data/types.mjs.map +1 -0
- package/dist/esm/providers/s3/utils/client/{uploadPart.d.ts → s3data/uploadPart.d.ts} +5 -5
- package/dist/esm/providers/s3/utils/client/{uploadPart.mjs → s3data/uploadPart.mjs} +8 -7
- package/dist/esm/providers/s3/utils/client/s3data/uploadPart.mjs.map +1 -0
- package/dist/esm/providers/s3/utils/client/utils/index.d.ts +1 -0
- package/dist/esm/providers/s3/utils/client/utils/index.mjs +1 -0
- package/dist/esm/providers/s3/utils/client/utils/index.mjs.map +1 -1
- package/dist/esm/providers/s3/utils/client/utils/retryDecider.d.ts +13 -0
- package/dist/esm/providers/s3/utils/client/utils/retryDecider.mjs +59 -0
- package/dist/esm/providers/s3/utils/client/utils/retryDecider.mjs.map +1 -0
- package/dist/esm/providers/s3/utils/crc32.d.ts +6 -0
- package/dist/esm/providers/s3/utils/crc32.mjs +34 -0
- package/dist/esm/providers/s3/utils/crc32.mjs.map +1 -0
- package/dist/esm/providers/s3/utils/crc32.native.d.ts +2 -0
- package/dist/esm/providers/s3/utils/crc32.native.mjs +8 -0
- package/dist/esm/providers/s3/utils/crc32.native.mjs.map +1 -0
- package/dist/esm/providers/s3/utils/resolveIdentityId.d.ts +1 -0
- package/dist/esm/providers/s3/utils/resolveIdentityId.mjs +12 -0
- package/dist/esm/providers/s3/utils/resolveIdentityId.mjs.map +1 -0
- package/dist/esm/providers/s3/utils/resolveS3ConfigAndInput.d.ts +11 -2
- package/dist/esm/providers/s3/utils/resolveS3ConfigAndInput.mjs +72 -12
- package/dist/esm/providers/s3/utils/resolveS3ConfigAndInput.mjs.map +1 -1
- package/dist/esm/providers/s3/utils/validateStorageOperationInput.mjs +4 -1
- package/dist/esm/providers/s3/utils/validateStorageOperationInput.mjs.map +1 -1
- package/dist/esm/providers/s3/utils/validateStorageOperationInputWithPrefix.mjs +4 -1
- package/dist/esm/providers/s3/utils/validateStorageOperationInputWithPrefix.mjs.map +1 -1
- package/dist/esm/storageBrowser/apis/constants.d.ts +2 -0
- package/dist/esm/storageBrowser/apis/constants.mjs +7 -0
- package/dist/esm/storageBrowser/apis/constants.mjs.map +1 -0
- package/dist/esm/storageBrowser/apis/getDataAccess.d.ts +2 -0
- package/dist/esm/storageBrowser/apis/getDataAccess.mjs +57 -0
- package/dist/esm/storageBrowser/apis/getDataAccess.mjs.map +1 -0
- package/dist/esm/storageBrowser/apis/listCallerAccessGrants.d.ts +2 -0
- package/dist/esm/storageBrowser/apis/listCallerAccessGrants.mjs +79 -0
- package/dist/esm/storageBrowser/apis/listCallerAccessGrants.mjs.map +1 -0
- package/dist/esm/storageBrowser/apis/types.d.ts +18 -0
- package/dist/esm/storageBrowser/apis/types.mjs +2 -0
- package/dist/esm/storageBrowser/apis/types.mjs.map +1 -0
- package/dist/esm/storageBrowser/index.d.ts +6 -0
- package/dist/esm/storageBrowser/index.mjs +3 -0
- package/dist/esm/storageBrowser/index.mjs.map +1 -0
- package/dist/esm/storageBrowser/locationCredentialsStore/constants.d.ts +2 -0
- package/dist/esm/storageBrowser/locationCredentialsStore/constants.mjs +7 -0
- package/dist/esm/storageBrowser/locationCredentialsStore/constants.mjs.map +1 -0
- package/dist/esm/storageBrowser/locationCredentialsStore/create.d.ts +2 -0
- package/dist/esm/storageBrowser/locationCredentialsStore/create.mjs +34 -0
- package/dist/esm/storageBrowser/locationCredentialsStore/create.mjs.map +1 -0
- package/dist/esm/storageBrowser/locationCredentialsStore/index.d.ts +1 -0
- package/dist/esm/storageBrowser/locationCredentialsStore/index.mjs +2 -0
- package/dist/esm/storageBrowser/locationCredentialsStore/index.mjs.map +1 -0
- package/dist/esm/storageBrowser/locationCredentialsStore/registry.d.ts +23 -0
- package/dist/esm/storageBrowser/locationCredentialsStore/registry.mjs +54 -0
- package/dist/esm/storageBrowser/locationCredentialsStore/registry.mjs.map +1 -0
- package/dist/esm/storageBrowser/locationCredentialsStore/store.d.ts +35 -0
- package/dist/esm/storageBrowser/locationCredentialsStore/store.mjs +95 -0
- package/dist/esm/storageBrowser/locationCredentialsStore/store.mjs.map +1 -0
- package/dist/esm/storageBrowser/managedAuthConfigAdapter/createListLocationsHandler.d.ts +8 -0
- package/dist/esm/storageBrowser/managedAuthConfigAdapter/createListLocationsHandler.mjs +13 -0
- package/dist/esm/storageBrowser/managedAuthConfigAdapter/createListLocationsHandler.mjs.map +1 -0
- package/dist/esm/storageBrowser/managedAuthConfigAdapter/createLocationCredentialsHandler.d.ts +8 -0
- package/dist/esm/storageBrowser/managedAuthConfigAdapter/createLocationCredentialsHandler.mjs +27 -0
- package/dist/esm/storageBrowser/managedAuthConfigAdapter/createLocationCredentialsHandler.mjs.map +1 -0
- package/dist/esm/storageBrowser/managedAuthConfigAdapter/createManagedAuthConfigAdapter.d.ts +19 -0
- package/dist/esm/storageBrowser/managedAuthConfigAdapter/createManagedAuthConfigAdapter.mjs +30 -0
- package/dist/esm/storageBrowser/managedAuthConfigAdapter/createManagedAuthConfigAdapter.mjs.map +1 -0
- package/dist/esm/storageBrowser/managedAuthConfigAdapter/index.d.ts +1 -0
- package/dist/esm/storageBrowser/managedAuthConfigAdapter/index.mjs +2 -0
- package/dist/esm/storageBrowser/managedAuthConfigAdapter/index.mjs.map +1 -0
- package/dist/esm/storageBrowser/types.d.ts +92 -0
- package/dist/esm/storageBrowser/types.mjs +2 -0
- package/dist/esm/storageBrowser/types.mjs.map +1 -0
- package/dist/esm/types/inputs.d.ts +3 -3
- package/package.json +117 -107
- package/src/errors/constants.ts +4 -0
- package/src/errors/types/validation.ts +21 -0
- package/src/providers/s3/apis/downloadData.ts +2 -2
- package/src/providers/s3/apis/internal/copy.ts +77 -23
- package/src/providers/s3/apis/internal/getProperties.ts +2 -3
- package/src/providers/s3/apis/internal/getUrl.ts +2 -2
- package/src/providers/s3/apis/internal/list.ts +3 -3
- package/src/providers/s3/apis/internal/remove.ts +2 -3
- package/src/providers/s3/apis/uploadData/multipart/initialUpload.ts +30 -1
- package/src/providers/s3/apis/uploadData/multipart/uploadCache.ts +4 -1
- package/src/providers/s3/apis/uploadData/multipart/uploadHandlers.ts +36 -17
- package/src/providers/s3/apis/uploadData/multipart/uploadPartExecutor.ts +23 -7
- package/src/providers/s3/apis/uploadData/putObjectJob.ts +22 -5
- package/src/providers/s3/apis/uploadData/validateObjectNotExists.ts +25 -0
- package/src/providers/s3/types/index.ts +2 -0
- package/src/providers/s3/types/inputs.ts +11 -1
- package/src/providers/s3/types/options.ts +51 -1
- package/src/providers/s3/utils/client/s3control/base.ts +70 -0
- package/src/providers/s3/utils/client/s3control/getDataAccess.ts +97 -0
- package/src/providers/s3/utils/client/s3control/index.ts +13 -0
- package/src/providers/s3/utils/client/s3control/listCallerAccessGrants.ts +104 -0
- package/src/providers/s3/utils/client/s3control/types.ts +213 -0
- package/src/providers/s3/utils/client/{abortMultipartUpload.ts → s3data/abortMultipartUpload.ts} +4 -3
- package/src/providers/s3/utils/client/{base.ts → s3data/base.ts} +2 -3
- package/src/providers/s3/utils/client/{completeMultipartUpload.ts → s3data/completeMultipartUpload.ts} +29 -18
- package/src/providers/s3/utils/client/{copyObject.ts → s3data/copyObject.ts} +4 -3
- package/src/providers/s3/utils/client/{createMultipartUpload.ts → s3data/createMultipartUpload.ts} +15 -8
- package/src/providers/s3/utils/client/{deleteObject.ts → s3data/deleteObject.ts} +7 -6
- package/src/providers/s3/utils/client/{getObject.ts → s3data/getObject.ts} +8 -7
- package/src/providers/s3/utils/client/{headObject.ts → s3data/headObject.ts} +4 -3
- package/src/providers/s3/utils/client/{listObjectsV2.ts → s3data/listObjectsV2.ts} +7 -6
- package/src/providers/s3/utils/client/{listParts.ts → s3data/listParts.ts} +9 -7
- package/src/providers/s3/utils/client/{putObject.ts → s3data/putObject.ts} +6 -3
- package/src/providers/s3/utils/client/{uploadPart.ts → s3data/uploadPart.ts} +13 -5
- package/src/providers/s3/utils/client/utils/index.ts +1 -0
- package/src/providers/s3/utils/client/utils/retryDecider.ts +81 -0
- package/src/providers/s3/utils/crc32.native.ts +11 -0
- package/src/providers/s3/utils/crc32.ts +51 -0
- package/src/providers/s3/utils/resolveIdentityId.ts +11 -0
- package/src/providers/s3/utils/resolveS3ConfigAndInput.ts +142 -16
- package/src/providers/s3/utils/validateStorageOperationInput.ts +5 -1
- package/src/providers/s3/utils/validateStorageOperationInputWithPrefix.ts +5 -1
- package/src/storageBrowser/apis/constants.ts +5 -0
- package/src/storageBrowser/apis/getDataAccess.ts +79 -0
- package/src/storageBrowser/apis/listCallerAccessGrants.ts +107 -0
- package/src/storageBrowser/apis/types.ts +33 -0
- package/src/storageBrowser/index.ts +25 -0
- package/src/storageBrowser/locationCredentialsStore/constants.ts +5 -0
- package/src/storageBrowser/locationCredentialsStore/create.ts +54 -0
- package/src/storageBrowser/locationCredentialsStore/index.ts +4 -0
- package/src/storageBrowser/locationCredentialsStore/registry.ts +88 -0
- package/src/storageBrowser/locationCredentialsStore/store.ts +161 -0
- package/src/storageBrowser/managedAuthConfigAdapter/createListLocationsHandler.ts +21 -0
- package/src/storageBrowser/managedAuthConfigAdapter/createLocationCredentialsHandler.ts +40 -0
- package/src/storageBrowser/managedAuthConfigAdapter/createManagedAuthConfigAdapter.ts +53 -0
- package/src/storageBrowser/managedAuthConfigAdapter/index.ts +8 -0
- package/src/storageBrowser/types.ts +117 -0
- package/src/types/inputs.ts +7 -3
- package/dist/cjs/providers/s3/utils/client/abortMultipartUpload.js.map +0 -1
- package/dist/cjs/providers/s3/utils/client/base.js.map +0 -1
- package/dist/cjs/providers/s3/utils/client/completeMultipartUpload.js.map +0 -1
- package/dist/cjs/providers/s3/utils/client/copyObject.js.map +0 -1
- package/dist/cjs/providers/s3/utils/client/createMultipartUpload.js.map +0 -1
- package/dist/cjs/providers/s3/utils/client/deleteObject.js.map +0 -1
- package/dist/cjs/providers/s3/utils/client/getObject.js.map +0 -1
- package/dist/cjs/providers/s3/utils/client/headObject.js.map +0 -1
- package/dist/cjs/providers/s3/utils/client/index.js.map +0 -1
- package/dist/cjs/providers/s3/utils/client/listObjectsV2.js.map +0 -1
- package/dist/cjs/providers/s3/utils/client/listParts.js.map +0 -1
- package/dist/cjs/providers/s3/utils/client/putObject.js.map +0 -1
- package/dist/cjs/providers/s3/utils/client/types.js.map +0 -1
- package/dist/cjs/providers/s3/utils/client/uploadPart.js.map +0 -1
- package/dist/esm/providers/s3/utils/client/abortMultipartUpload.mjs.map +0 -1
- package/dist/esm/providers/s3/utils/client/base.mjs.map +0 -1
- package/dist/esm/providers/s3/utils/client/completeMultipartUpload.mjs.map +0 -1
- package/dist/esm/providers/s3/utils/client/copyObject.mjs.map +0 -1
- package/dist/esm/providers/s3/utils/client/createMultipartUpload.mjs.map +0 -1
- package/dist/esm/providers/s3/utils/client/deleteObject.mjs.map +0 -1
- package/dist/esm/providers/s3/utils/client/getObject.mjs.map +0 -1
- package/dist/esm/providers/s3/utils/client/headObject.mjs.map +0 -1
- package/dist/esm/providers/s3/utils/client/listObjectsV2.mjs.map +0 -1
- package/dist/esm/providers/s3/utils/client/listParts.mjs.map +0 -1
- package/dist/esm/providers/s3/utils/client/putObject.mjs.map +0 -1
- package/dist/esm/providers/s3/utils/client/uploadPart.mjs.map +0 -1
- /package/dist/cjs/providers/s3/utils/client/{types.js → s3control/types.js} +0 -0
- /package/dist/cjs/providers/s3/utils/client/{index.js → s3data/index.js} +0 -0
- /package/dist/esm/providers/s3/utils/client/{types.mjs → s3control/types.mjs} +0 -0
- /package/dist/esm/providers/s3/utils/client/{types.mjs.map → s3control/types.mjs.map} +0 -0
- /package/dist/esm/providers/s3/utils/client/{index.d.ts → s3data/index.d.ts} +0 -0
- /package/dist/esm/providers/s3/utils/client/{index.mjs → s3data/index.mjs} +0 -0
- /package/dist/esm/providers/s3/utils/client/{index.mjs.map → s3data/index.mjs.map} +0 -0
- /package/dist/esm/providers/s3/utils/client/{types.d.ts → s3data/types.d.ts} +0 -0
- /package/src/providers/s3/utils/client/{index.ts → s3data/index.ts} +0 -0
- /package/src/providers/s3/utils/client/{types.ts → s3data/types.ts} +0 -0
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
import {
|
|
4
|
+
HttpResponse,
|
|
5
|
+
MiddlewareContext,
|
|
6
|
+
RetryDeciderOutput,
|
|
7
|
+
getRetryDecider,
|
|
8
|
+
} from '@aws-amplify/core/internals/aws-client-utils';
|
|
9
|
+
|
|
10
|
+
import { LocationCredentialsProvider } from '../../../types/options';
|
|
11
|
+
|
|
12
|
+
import { parseXmlError } from './parsePayload';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Function to decide if the S3 request should be retried. For S3 APIs, we support forceRefresh option
|
|
16
|
+
* for {@link LocationCredentialsProvider | LocationCredentialsProvider } option. It's set when S3 returns
|
|
17
|
+
* credentials expired error. In the retry decider, we detect this response and set flag to signify a retry
|
|
18
|
+
* attempt. The retry attempt would invoke the LocationCredentialsProvider with forceRefresh option set.
|
|
19
|
+
*
|
|
20
|
+
* @param response Optional response of the request.
|
|
21
|
+
* @param error Optional error thrown from previous attempts.
|
|
22
|
+
* @param middlewareContext Optional context object to store data between retries.
|
|
23
|
+
* @returns True if the request should be retried.
|
|
24
|
+
*/
|
|
25
|
+
export const retryDecider = async (
|
|
26
|
+
response?: HttpResponse,
|
|
27
|
+
error?: unknown,
|
|
28
|
+
middlewareContext?: MiddlewareContext,
|
|
29
|
+
): Promise<RetryDeciderOutput> => {
|
|
30
|
+
const defaultRetryDecider = getRetryDecider(parseXmlError);
|
|
31
|
+
const defaultRetryDecision = await defaultRetryDecider(response, error);
|
|
32
|
+
if (!response || response.statusCode < 300) {
|
|
33
|
+
return { retryable: false };
|
|
34
|
+
}
|
|
35
|
+
const parsedError = await parseXmlError(response);
|
|
36
|
+
const errorCode = parsedError?.name;
|
|
37
|
+
const errorMessage = parsedError?.message;
|
|
38
|
+
const isCredentialsExpired = isCredentialsExpiredError(
|
|
39
|
+
errorCode,
|
|
40
|
+
errorMessage,
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
return {
|
|
44
|
+
retryable:
|
|
45
|
+
defaultRetryDecision.retryable ||
|
|
46
|
+
// If we know the previous retry attempt sets isCredentialsExpired in the
|
|
47
|
+
// middleware context, we don't want to retry anymore.
|
|
48
|
+
!!(isCredentialsExpired && !middlewareContext?.isCredentialsExpired),
|
|
49
|
+
isCredentialsExpiredError: isCredentialsExpired,
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
// Ref: https://github.com/aws/aws-sdk-js/blob/54829e341181b41573c419bd870dd0e0f8f10632/lib/event_listeners.js#L522-L541
|
|
54
|
+
const INVALID_TOKEN_ERROR_CODES = [
|
|
55
|
+
'RequestExpired',
|
|
56
|
+
'ExpiredTokenException',
|
|
57
|
+
'ExpiredToken',
|
|
58
|
+
];
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Given an error code, returns true if it is related to invalid credentials.
|
|
62
|
+
*
|
|
63
|
+
* @param errorCode String representation of some error.
|
|
64
|
+
* @returns True if given error indicates the credentials used to authorize request
|
|
65
|
+
* are invalid.
|
|
66
|
+
*/
|
|
67
|
+
const isCredentialsExpiredError = (
|
|
68
|
+
errorCode?: string,
|
|
69
|
+
errorMessage?: string,
|
|
70
|
+
) => {
|
|
71
|
+
const isExpiredTokenError =
|
|
72
|
+
!!errorCode && INVALID_TOKEN_ERROR_CODES.includes(errorCode);
|
|
73
|
+
// Ref: https://github.com/aws/aws-sdk-js/blob/54829e341181b41573c419bd870dd0e0f8f10632/lib/event_listeners.js#L536-L539
|
|
74
|
+
const isExpiredSignatureError =
|
|
75
|
+
!!errorCode &&
|
|
76
|
+
!!errorMessage &&
|
|
77
|
+
errorCode.includes('Signature') &&
|
|
78
|
+
errorMessage.includes('expired');
|
|
79
|
+
|
|
80
|
+
return isExpiredTokenError || isExpiredSignatureError;
|
|
81
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import { CRC32Checksum } from './crc32';
|
|
5
|
+
|
|
6
|
+
export const calculateContentCRC32 = async (
|
|
7
|
+
content: Blob | string | ArrayBuffer | ArrayBufferView,
|
|
8
|
+
_seed = 0,
|
|
9
|
+
): Promise<CRC32Checksum | undefined> => {
|
|
10
|
+
return undefined;
|
|
11
|
+
};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import crc32 from 'crc-32';
|
|
5
|
+
|
|
6
|
+
export interface CRC32Checksum {
|
|
7
|
+
checksumArrayBuffer: ArrayBuffer;
|
|
8
|
+
checksum: string;
|
|
9
|
+
seed: number;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export const calculateContentCRC32 = async (
|
|
13
|
+
content: Blob | string | ArrayBuffer | ArrayBufferView,
|
|
14
|
+
seed = 0,
|
|
15
|
+
): Promise<CRC32Checksum | undefined> => {
|
|
16
|
+
let internalSeed = seed;
|
|
17
|
+
let blob: Blob;
|
|
18
|
+
|
|
19
|
+
if (content instanceof Blob) {
|
|
20
|
+
blob = content;
|
|
21
|
+
} else {
|
|
22
|
+
blob = new Blob([content]);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
await blob.stream().pipeTo(
|
|
26
|
+
new WritableStream<Uint8Array>({
|
|
27
|
+
write(chunk) {
|
|
28
|
+
internalSeed = crc32.buf(chunk, internalSeed) >>> 0;
|
|
29
|
+
},
|
|
30
|
+
}),
|
|
31
|
+
);
|
|
32
|
+
const hex = internalSeed.toString(16).padStart(8, '0');
|
|
33
|
+
|
|
34
|
+
return {
|
|
35
|
+
checksumArrayBuffer: hexToArrayBuffer(hex),
|
|
36
|
+
checksum: hexToBase64(hex),
|
|
37
|
+
seed: internalSeed,
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const hexToArrayBuffer = (hexString: string) =>
|
|
42
|
+
new Uint8Array((hexString.match(/\w{2}/g)! ?? []).map(h => parseInt(h, 16)))
|
|
43
|
+
.buffer;
|
|
44
|
+
|
|
45
|
+
const hexToBase64 = (hexString: string) =>
|
|
46
|
+
btoa(
|
|
47
|
+
hexString
|
|
48
|
+
.match(/\w{2}/g)!
|
|
49
|
+
.map((a: string) => String.fromCharCode(parseInt(a, 16)))
|
|
50
|
+
.join(''),
|
|
51
|
+
);
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import { StorageValidationErrorCode } from '../../../errors/types/validation';
|
|
5
|
+
import { assertValidationError } from '../../../errors/utils/assertValidationError';
|
|
6
|
+
|
|
7
|
+
export const resolveIdentityId = (identityId?: string): string => {
|
|
8
|
+
assertValidationError(!!identityId, StorageValidationErrorCode.NoIdentityId);
|
|
9
|
+
|
|
10
|
+
return identityId;
|
|
11
|
+
};
|
|
@@ -2,11 +2,25 @@
|
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
|
|
4
4
|
import { AmplifyClassV6, StorageAccessLevel } from '@aws-amplify/core';
|
|
5
|
+
import { CredentialsProviderOptions } from '@aws-amplify/core/internals/aws-client-utils';
|
|
5
6
|
|
|
6
7
|
import { assertValidationError } from '../../../errors/utils/assertValidationError';
|
|
7
8
|
import { StorageValidationErrorCode } from '../../../errors/types/validation';
|
|
8
9
|
import { resolvePrefix as defaultPrefixResolver } from '../../../utils/resolvePrefix';
|
|
9
|
-
import {
|
|
10
|
+
import {
|
|
11
|
+
StorageOperationInputWithKey,
|
|
12
|
+
StorageOperationInputWithPath,
|
|
13
|
+
StorageOperationInputWithPrefix,
|
|
14
|
+
} from '../../../types/inputs';
|
|
15
|
+
import { StorageError } from '../../../errors/StorageError';
|
|
16
|
+
import { CopyInput, CopyWithPathInput } from '../types';
|
|
17
|
+
import { INVALID_STORAGE_INPUT } from '../../../errors/constants';
|
|
18
|
+
import {
|
|
19
|
+
BucketInfo,
|
|
20
|
+
LocationCredentialsProvider,
|
|
21
|
+
ResolvedS3Config,
|
|
22
|
+
StorageBucket,
|
|
23
|
+
} from '../types/options';
|
|
10
24
|
|
|
11
25
|
import { DEFAULT_ACCESS_LEVEL, LOCAL_TESTING_S3_ENDPOINT } from './constants';
|
|
12
26
|
|
|
@@ -14,6 +28,8 @@ interface S3ApiOptions {
|
|
|
14
28
|
accessLevel?: StorageAccessLevel;
|
|
15
29
|
targetIdentityId?: string;
|
|
16
30
|
useAccelerateEndpoint?: boolean;
|
|
31
|
+
locationCredentialsProvider?: LocationCredentialsProvider;
|
|
32
|
+
bucket?: StorageBucket;
|
|
17
33
|
}
|
|
18
34
|
|
|
19
35
|
interface ResolvedS3ConfigAndInput {
|
|
@@ -23,6 +39,16 @@ interface ResolvedS3ConfigAndInput {
|
|
|
23
39
|
isObjectLockEnabled?: boolean;
|
|
24
40
|
identityId?: string;
|
|
25
41
|
}
|
|
42
|
+
export type DeprecatedStorageInput =
|
|
43
|
+
| StorageOperationInputWithKey
|
|
44
|
+
| StorageOperationInputWithPrefix
|
|
45
|
+
| CopyInput;
|
|
46
|
+
|
|
47
|
+
export type CallbackPathStorageInput =
|
|
48
|
+
| StorageOperationInputWithPath
|
|
49
|
+
| CopyWithPathInput;
|
|
50
|
+
|
|
51
|
+
type StorageInput = DeprecatedStorageInput | CallbackPathStorageInput;
|
|
26
52
|
|
|
27
53
|
/**
|
|
28
54
|
* resolve the common input options for S3 API handlers from Amplify configuration and library options.
|
|
@@ -37,23 +63,35 @@ interface ResolvedS3ConfigAndInput {
|
|
|
37
63
|
*/
|
|
38
64
|
export const resolveS3ConfigAndInput = async (
|
|
39
65
|
amplify: AmplifyClassV6,
|
|
40
|
-
|
|
66
|
+
apiInput?: StorageInput & { options?: S3ApiOptions },
|
|
41
67
|
): Promise<ResolvedS3ConfigAndInput> => {
|
|
68
|
+
const { options: apiOptions } = apiInput ?? {};
|
|
42
69
|
/**
|
|
43
70
|
* IdentityId is always cached in memory so we can safely make calls here. It
|
|
44
71
|
* should be stable even for unauthenticated users, regardless of credentials.
|
|
45
72
|
*/
|
|
46
73
|
const { identityId } = await amplify.Auth.fetchAuthSession();
|
|
47
|
-
assertValidationError(!!identityId, StorageValidationErrorCode.NoIdentityId);
|
|
48
74
|
|
|
49
75
|
/**
|
|
50
76
|
* A credentials provider function instead of a static credentials object is
|
|
51
77
|
* used because the long-running tasks like multipart upload may span over the
|
|
52
78
|
* credentials expiry. Auth.fetchAuthSession() automatically refreshes the
|
|
53
79
|
* credentials if they are expired.
|
|
80
|
+
*
|
|
81
|
+
* The optional forceRefresh option is set when the S3 service returns expired
|
|
82
|
+
* tokens error in the previous API call attempt.
|
|
54
83
|
*/
|
|
55
|
-
const credentialsProvider = async () => {
|
|
56
|
-
|
|
84
|
+
const credentialsProvider = async (options?: CredentialsProviderOptions) => {
|
|
85
|
+
if (isLocationCredentialsProvider(apiOptions)) {
|
|
86
|
+
assertStorageInput(apiInput);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// TODO: forceRefresh option of fetchAuthSession would refresh both tokens and
|
|
90
|
+
// AWS credentials. So we do not support forceRefreshing from the Auth until
|
|
91
|
+
// we support refreshing only the credentials.
|
|
92
|
+
const { credentials } = isLocationCredentialsProvider(apiOptions)
|
|
93
|
+
? await apiOptions.locationCredentialsProvider(options)
|
|
94
|
+
: await amplify.Auth.fetchAuthSession();
|
|
57
95
|
assertValidationError(
|
|
58
96
|
!!credentials,
|
|
59
97
|
StorageValidationErrorCode.NoCredentials,
|
|
@@ -62,8 +100,16 @@ export const resolveS3ConfigAndInput = async (
|
|
|
62
100
|
return credentials;
|
|
63
101
|
};
|
|
64
102
|
|
|
65
|
-
const {
|
|
66
|
-
|
|
103
|
+
const {
|
|
104
|
+
bucket: defaultBucket,
|
|
105
|
+
region: defaultRegion,
|
|
106
|
+
dangerouslyConnectToHttpEndpointForTesting,
|
|
107
|
+
buckets,
|
|
108
|
+
} = amplify.getConfig()?.Storage?.S3 ?? {};
|
|
109
|
+
|
|
110
|
+
const { bucket = defaultBucket, region = defaultRegion } =
|
|
111
|
+
(apiOptions?.bucket && resolveBucketConfig(apiOptions, buckets)) || {};
|
|
112
|
+
|
|
67
113
|
assertValidationError(!!bucket, StorageValidationErrorCode.NoBucket);
|
|
68
114
|
assertValidationError(!!region, StorageValidationErrorCode.NoRegion);
|
|
69
115
|
|
|
@@ -73,15 +119,14 @@ export const resolveS3ConfigAndInput = async (
|
|
|
73
119
|
isObjectLockEnabled,
|
|
74
120
|
} = amplify.libraryOptions?.Storage?.S3 ?? {};
|
|
75
121
|
|
|
76
|
-
const
|
|
77
|
-
accessLevel
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
});
|
|
122
|
+
const accessLevel =
|
|
123
|
+
apiOptions?.accessLevel ?? defaultAccessLevel ?? DEFAULT_ACCESS_LEVEL;
|
|
124
|
+
const targetIdentityId =
|
|
125
|
+
accessLevel === 'protected'
|
|
126
|
+
? (apiOptions?.targetIdentityId ?? identityId)
|
|
127
|
+
: identityId;
|
|
128
|
+
|
|
129
|
+
const keyPrefix = await prefixResolver({ accessLevel, targetIdentityId });
|
|
85
130
|
|
|
86
131
|
return {
|
|
87
132
|
s3Config: {
|
|
@@ -101,3 +146,84 @@ export const resolveS3ConfigAndInput = async (
|
|
|
101
146
|
isObjectLockEnabled,
|
|
102
147
|
};
|
|
103
148
|
};
|
|
149
|
+
|
|
150
|
+
const isLocationCredentialsProvider = (
|
|
151
|
+
options?: S3ApiOptions,
|
|
152
|
+
): options is S3ApiOptions & {
|
|
153
|
+
locationCredentialsProvider: LocationCredentialsProvider;
|
|
154
|
+
} => {
|
|
155
|
+
return !!options?.locationCredentialsProvider;
|
|
156
|
+
};
|
|
157
|
+
|
|
158
|
+
const isInputWithCallbackPath = (input?: CallbackPathStorageInput) => {
|
|
159
|
+
return (
|
|
160
|
+
((input as StorageOperationInputWithPath)?.path &&
|
|
161
|
+
typeof (input as StorageOperationInputWithPath).path === 'function') ||
|
|
162
|
+
((input as CopyWithPathInput)?.destination?.path &&
|
|
163
|
+
typeof (input as CopyWithPathInput).destination?.path === 'function') ||
|
|
164
|
+
((input as CopyWithPathInput)?.source?.path &&
|
|
165
|
+
typeof (input as CopyWithPathInput).source?.path === 'function')
|
|
166
|
+
);
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
const isDeprecatedInput = (
|
|
170
|
+
input?: StorageInput,
|
|
171
|
+
): input is DeprecatedStorageInput => {
|
|
172
|
+
return (
|
|
173
|
+
isInputWithKey(input) ||
|
|
174
|
+
isInputWithPrefix(input) ||
|
|
175
|
+
isInputWithCopySourceOrDestination(input)
|
|
176
|
+
);
|
|
177
|
+
};
|
|
178
|
+
const assertStorageInput = (input?: StorageInput) => {
|
|
179
|
+
if (isDeprecatedInput(input) || isInputWithCallbackPath(input)) {
|
|
180
|
+
throw new StorageError({
|
|
181
|
+
name: INVALID_STORAGE_INPUT,
|
|
182
|
+
message: 'The input needs to have a path as a string value.',
|
|
183
|
+
recoverySuggestion:
|
|
184
|
+
'Please provide a valid path as a string value for the input.',
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
|
|
189
|
+
const isInputWithKey = (
|
|
190
|
+
input?: StorageInput,
|
|
191
|
+
): input is StorageOperationInputWithKey => {
|
|
192
|
+
return !!(typeof (input as StorageOperationInputWithKey).key === 'string');
|
|
193
|
+
};
|
|
194
|
+
const isInputWithPrefix = (
|
|
195
|
+
input?: StorageInput,
|
|
196
|
+
): input is StorageOperationInputWithPrefix => {
|
|
197
|
+
return !!(
|
|
198
|
+
typeof (input as StorageOperationInputWithPrefix).prefix === 'string'
|
|
199
|
+
);
|
|
200
|
+
};
|
|
201
|
+
const isInputWithCopySourceOrDestination = (
|
|
202
|
+
input?: StorageInput,
|
|
203
|
+
): input is CopyInput => {
|
|
204
|
+
return !!(
|
|
205
|
+
typeof (input as CopyInput).source?.key === 'string' ||
|
|
206
|
+
typeof (input as CopyInput).destination?.key === 'string'
|
|
207
|
+
);
|
|
208
|
+
};
|
|
209
|
+
const resolveBucketConfig = (
|
|
210
|
+
apiOptions: S3ApiOptions,
|
|
211
|
+
buckets: Record<string, BucketInfo> | undefined,
|
|
212
|
+
): { bucket: string; region: string } | undefined => {
|
|
213
|
+
if (typeof apiOptions.bucket === 'string') {
|
|
214
|
+
const bucketConfig = buckets?.[apiOptions.bucket];
|
|
215
|
+
assertValidationError(
|
|
216
|
+
!!bucketConfig,
|
|
217
|
+
StorageValidationErrorCode.InvalidStorageBucket,
|
|
218
|
+
);
|
|
219
|
+
|
|
220
|
+
return { bucket: bucketConfig.bucketName, region: bucketConfig.region };
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
if (typeof apiOptions.bucket === 'object') {
|
|
224
|
+
return {
|
|
225
|
+
bucket: apiOptions.bucket.bucketName,
|
|
226
|
+
region: apiOptions.bucket.region,
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
};
|
|
@@ -7,6 +7,7 @@ import { StorageValidationErrorCode } from '../../../errors/types/validation';
|
|
|
7
7
|
|
|
8
8
|
import { isInputWithPath } from './isInputWithPath';
|
|
9
9
|
import { STORAGE_INPUT_KEY, STORAGE_INPUT_PATH } from './constants';
|
|
10
|
+
import { resolveIdentityId } from './resolveIdentityId';
|
|
10
11
|
|
|
11
12
|
export const validateStorageOperationInput = (
|
|
12
13
|
input: Input,
|
|
@@ -22,7 +23,10 @@ export const validateStorageOperationInput = (
|
|
|
22
23
|
|
|
23
24
|
if (isInputWithPath(input)) {
|
|
24
25
|
const { path } = input;
|
|
25
|
-
const objectKey =
|
|
26
|
+
const objectKey =
|
|
27
|
+
typeof path === 'string'
|
|
28
|
+
? path
|
|
29
|
+
: path({ identityId: resolveIdentityId(identityId) });
|
|
26
30
|
|
|
27
31
|
assertValidationError(
|
|
28
32
|
!objectKey.startsWith('/'),
|
|
@@ -9,6 +9,7 @@ import { assertValidationError } from '../../../errors/utils/assertValidationErr
|
|
|
9
9
|
import { StorageValidationErrorCode } from '../../../errors/types/validation';
|
|
10
10
|
|
|
11
11
|
import { STORAGE_INPUT_PATH, STORAGE_INPUT_PREFIX } from './constants';
|
|
12
|
+
import { resolveIdentityId } from './resolveIdentityId';
|
|
12
13
|
|
|
13
14
|
// Local assertion function with StorageOperationInputWithPrefixPath as Input
|
|
14
15
|
const _isInputWithPath = (
|
|
@@ -28,7 +29,10 @@ export const validateStorageOperationInputWithPrefix = (
|
|
|
28
29
|
);
|
|
29
30
|
if (_isInputWithPath(input)) {
|
|
30
31
|
const { path } = input;
|
|
31
|
-
const objectKey =
|
|
32
|
+
const objectKey =
|
|
33
|
+
typeof path === 'string'
|
|
34
|
+
? path
|
|
35
|
+
: path({ identityId: resolveIdentityId(identityId) });
|
|
32
36
|
|
|
33
37
|
// Assert on no leading slash in the path parameter
|
|
34
38
|
assertValidationError(
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
AmplifyErrorCode,
|
|
6
|
+
StorageAction,
|
|
7
|
+
} from '@aws-amplify/core/internals/utils';
|
|
8
|
+
import { CredentialsProviderOptions } from '@aws-amplify/core/internals/aws-client-utils';
|
|
9
|
+
|
|
10
|
+
import { getStorageUserAgentValue } from '../../providers/s3/utils/userAgent';
|
|
11
|
+
import { getDataAccess as getDataAccessClient } from '../../providers/s3/utils/client/s3control';
|
|
12
|
+
import { StorageError } from '../../errors/StorageError';
|
|
13
|
+
import { logger } from '../../utils';
|
|
14
|
+
|
|
15
|
+
import { GetDataAccessInput, GetDataAccessOutput } from './types';
|
|
16
|
+
import { DEFAULT_CRED_TTL } from './constants';
|
|
17
|
+
|
|
18
|
+
export const getDataAccess = async (
|
|
19
|
+
input: GetDataAccessInput,
|
|
20
|
+
): Promise<GetDataAccessOutput> => {
|
|
21
|
+
const targetType = input.scope.endsWith('*') ? undefined : 'Object';
|
|
22
|
+
const clientCredentialsProvider = async (
|
|
23
|
+
options?: CredentialsProviderOptions,
|
|
24
|
+
) => {
|
|
25
|
+
const { credentials } = await input.credentialsProvider(options);
|
|
26
|
+
|
|
27
|
+
return credentials;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
const result = await getDataAccessClient(
|
|
31
|
+
{
|
|
32
|
+
credentials: clientCredentialsProvider,
|
|
33
|
+
region: input.region,
|
|
34
|
+
userAgentValue: getStorageUserAgentValue(StorageAction.GetDataAccess),
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
AccountId: input.accountId,
|
|
38
|
+
Target: input.scope,
|
|
39
|
+
Permission: input.permission,
|
|
40
|
+
TargetType: targetType,
|
|
41
|
+
DurationSeconds: DEFAULT_CRED_TTL,
|
|
42
|
+
},
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
const grantCredentials = result.Credentials;
|
|
46
|
+
|
|
47
|
+
// Ensure that S3 returned credentials (this shouldn't happen)
|
|
48
|
+
if (
|
|
49
|
+
!grantCredentials ||
|
|
50
|
+
!grantCredentials.AccessKeyId ||
|
|
51
|
+
!grantCredentials.SecretAccessKey ||
|
|
52
|
+
!grantCredentials.SessionToken ||
|
|
53
|
+
!grantCredentials.Expiration
|
|
54
|
+
) {
|
|
55
|
+
throw new StorageError({
|
|
56
|
+
name: AmplifyErrorCode.Unknown,
|
|
57
|
+
message: 'Service did not return valid temporary credentials.',
|
|
58
|
+
});
|
|
59
|
+
} else {
|
|
60
|
+
logger.debug(`Retrieved credentials for: ${result.MatchedGrantTarget}`);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const {
|
|
64
|
+
AccessKeyId: accessKeyId,
|
|
65
|
+
SecretAccessKey: secretAccessKey,
|
|
66
|
+
SessionToken: sessionToken,
|
|
67
|
+
Expiration: expiration,
|
|
68
|
+
} = grantCredentials;
|
|
69
|
+
|
|
70
|
+
return {
|
|
71
|
+
credentials: {
|
|
72
|
+
accessKeyId,
|
|
73
|
+
secretAccessKey,
|
|
74
|
+
sessionToken,
|
|
75
|
+
expiration,
|
|
76
|
+
},
|
|
77
|
+
scope: result.MatchedGrantTarget,
|
|
78
|
+
};
|
|
79
|
+
};
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import { StorageAction } from '@aws-amplify/core/internals/utils';
|
|
5
|
+
import { CredentialsProviderOptions } from '@aws-amplify/core/internals/aws-client-utils';
|
|
6
|
+
|
|
7
|
+
import { logger } from '../../utils';
|
|
8
|
+
import { listCallerAccessGrants as listCallerAccessGrantsClient } from '../../providers/s3/utils/client/s3control';
|
|
9
|
+
import { LocationAccess, LocationType, Permission } from '../types';
|
|
10
|
+
import { StorageError } from '../../errors/StorageError';
|
|
11
|
+
import { getStorageUserAgentValue } from '../../providers/s3/utils/userAgent';
|
|
12
|
+
|
|
13
|
+
import {
|
|
14
|
+
ListCallerAccessGrantsInput,
|
|
15
|
+
ListCallerAccessGrantsOutput,
|
|
16
|
+
} from './types';
|
|
17
|
+
import { MAX_PAGE_SIZE } from './constants';
|
|
18
|
+
|
|
19
|
+
export const listCallerAccessGrants = async (
|
|
20
|
+
input: ListCallerAccessGrantsInput,
|
|
21
|
+
): Promise<ListCallerAccessGrantsOutput> => {
|
|
22
|
+
const { credentialsProvider, accountId, region, nextToken, pageSize } = input;
|
|
23
|
+
|
|
24
|
+
logger.debug(`listing available locations from account ${input.accountId}`);
|
|
25
|
+
|
|
26
|
+
if (!!pageSize && pageSize > MAX_PAGE_SIZE) {
|
|
27
|
+
logger.debug(`defaulting pageSize to ${MAX_PAGE_SIZE}.`);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const clientCredentialsProvider = async (
|
|
31
|
+
options?: CredentialsProviderOptions,
|
|
32
|
+
) => {
|
|
33
|
+
const { credentials } = await credentialsProvider(options);
|
|
34
|
+
|
|
35
|
+
return credentials;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
const { CallerAccessGrantsList, NextToken } =
|
|
39
|
+
await listCallerAccessGrantsClient(
|
|
40
|
+
{
|
|
41
|
+
credentials: clientCredentialsProvider,
|
|
42
|
+
region,
|
|
43
|
+
userAgentValue: getStorageUserAgentValue(
|
|
44
|
+
StorageAction.ListCallerAccessGrants,
|
|
45
|
+
),
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
AccountId: accountId,
|
|
49
|
+
NextToken: nextToken,
|
|
50
|
+
MaxResults: pageSize ?? MAX_PAGE_SIZE,
|
|
51
|
+
},
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
const accessGrants: LocationAccess[] =
|
|
55
|
+
CallerAccessGrantsList?.map(grant => {
|
|
56
|
+
// These values are correct from service mostly, but we add assertions to make TSC happy.
|
|
57
|
+
assertPermission(grant.Permission);
|
|
58
|
+
assertGrantScope(grant.GrantScope);
|
|
59
|
+
|
|
60
|
+
return {
|
|
61
|
+
scope: grant.GrantScope,
|
|
62
|
+
permission: grant.Permission,
|
|
63
|
+
type: parseGrantType(grant.GrantScope!),
|
|
64
|
+
};
|
|
65
|
+
}) ?? [];
|
|
66
|
+
|
|
67
|
+
return {
|
|
68
|
+
locations: accessGrants,
|
|
69
|
+
nextToken: NextToken,
|
|
70
|
+
};
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
const parseGrantType = (grantScope: string): LocationType => {
|
|
74
|
+
const bucketScopeReg = /^s3:\/\/(.*)\/\*$/;
|
|
75
|
+
const possibleBucketName = grantScope.match(bucketScopeReg)?.[1];
|
|
76
|
+
if (!grantScope.endsWith('*')) {
|
|
77
|
+
return 'OBJECT';
|
|
78
|
+
} else if (
|
|
79
|
+
grantScope.endsWith('/*') &&
|
|
80
|
+
possibleBucketName &&
|
|
81
|
+
possibleBucketName.indexOf('/') === -1
|
|
82
|
+
) {
|
|
83
|
+
return 'BUCKET';
|
|
84
|
+
} else {
|
|
85
|
+
return 'PREFIX';
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
function assertPermission(
|
|
90
|
+
permissionValue: string | undefined,
|
|
91
|
+
): asserts permissionValue is Permission {
|
|
92
|
+
if (!['READ', 'READWRITE', 'WRITE'].includes(permissionValue ?? '')) {
|
|
93
|
+
throw new StorageError({
|
|
94
|
+
name: 'InvalidPermission',
|
|
95
|
+
message: `Invalid permission: ${permissionValue}`,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function assertGrantScope(value: unknown): asserts value is string {
|
|
101
|
+
if (typeof value !== 'string' || !value.startsWith('s3://')) {
|
|
102
|
+
throw new StorageError({
|
|
103
|
+
name: 'InvalidGrantScope',
|
|
104
|
+
message: `Expected a valid grant scope, got ${value}`,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
CredentialsProvider,
|
|
6
|
+
ListLocationsInput,
|
|
7
|
+
ListLocationsOutput,
|
|
8
|
+
LocationCredentials,
|
|
9
|
+
Permission,
|
|
10
|
+
PrefixType,
|
|
11
|
+
Privilege,
|
|
12
|
+
} from '../types';
|
|
13
|
+
|
|
14
|
+
export interface ListCallerAccessGrantsInput extends ListLocationsInput {
|
|
15
|
+
accountId: string;
|
|
16
|
+
credentialsProvider: CredentialsProvider;
|
|
17
|
+
region: string;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export type ListCallerAccessGrantsOutput = ListLocationsOutput;
|
|
21
|
+
|
|
22
|
+
export interface GetDataAccessInput {
|
|
23
|
+
accountId: string;
|
|
24
|
+
credentialsProvider: CredentialsProvider;
|
|
25
|
+
durationSeconds?: number;
|
|
26
|
+
permission: Permission;
|
|
27
|
+
prefixType?: PrefixType;
|
|
28
|
+
privilege?: Privilege;
|
|
29
|
+
region: string;
|
|
30
|
+
scope: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export type GetDataAccessOutput = LocationCredentials;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
export { LocationCredentialsProvider } from '../providers/s3/types/options';
|
|
5
|
+
export { StorageSubpathStrategy } from '../types/options';
|
|
6
|
+
|
|
7
|
+
export { createLocationCredentialsStore } from './locationCredentialsStore';
|
|
8
|
+
export {
|
|
9
|
+
AuthConfigAdapter,
|
|
10
|
+
createManagedAuthConfigAdapter,
|
|
11
|
+
CreateManagedAuthConfigAdapterInput,
|
|
12
|
+
} from './managedAuthConfigAdapter';
|
|
13
|
+
export {
|
|
14
|
+
GetLocationCredentials,
|
|
15
|
+
ListLocations,
|
|
16
|
+
LocationCredentialsStore,
|
|
17
|
+
CreateLocationCredentialsStoreInput,
|
|
18
|
+
LocationCredentials,
|
|
19
|
+
ListLocationsInput,
|
|
20
|
+
ListLocationsOutput,
|
|
21
|
+
GetLocationCredentialsInput,
|
|
22
|
+
GetLocationCredentialsOutput,
|
|
23
|
+
Permission,
|
|
24
|
+
} from './types';
|
|
25
|
+
export { AWSTemporaryCredentials } from '../providers/s3/types/options';
|