@aws-amplify/storage 6.6.5 → 6.6.6-storage-browser.4949269.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.
Files changed (369) hide show
  1. package/dist/cjs/errors/constants.js +8 -0
  2. package/dist/cjs/errors/constants.js.map +1 -0
  3. package/dist/cjs/errors/types/validation.js +12 -0
  4. package/dist/cjs/errors/types/validation.js.map +1 -1
  5. package/dist/cjs/providers/s3/apis/downloadData.js +3 -3
  6. package/dist/cjs/providers/s3/apis/downloadData.js.map +1 -1
  7. package/dist/cjs/providers/s3/apis/internal/copy.js +38 -6
  8. package/dist/cjs/providers/s3/apis/internal/copy.js.map +1 -1
  9. package/dist/cjs/providers/s3/apis/internal/getProperties.js +3 -4
  10. package/dist/cjs/providers/s3/apis/internal/getProperties.js.map +1 -1
  11. package/dist/cjs/providers/s3/apis/internal/getUrl.js +3 -3
  12. package/dist/cjs/providers/s3/apis/internal/getUrl.js.map +1 -1
  13. package/dist/cjs/providers/s3/apis/internal/list.js +4 -4
  14. package/dist/cjs/providers/s3/apis/internal/list.js.map +1 -1
  15. package/dist/cjs/providers/s3/apis/internal/remove.js +3 -4
  16. package/dist/cjs/providers/s3/apis/internal/remove.js.map +1 -1
  17. package/dist/cjs/providers/s3/apis/uploadData/multipart/initialUpload.js +22 -2
  18. package/dist/cjs/providers/s3/apis/uploadData/multipart/initialUpload.js.map +1 -1
  19. package/dist/cjs/providers/s3/apis/uploadData/multipart/uploadCache.js +3 -2
  20. package/dist/cjs/providers/s3/apis/uploadData/multipart/uploadCache.js.map +1 -1
  21. package/dist/cjs/providers/s3/apis/uploadData/multipart/uploadHandlers.js +19 -8
  22. package/dist/cjs/providers/s3/apis/uploadData/multipart/uploadHandlers.js.map +1 -1
  23. package/dist/cjs/providers/s3/apis/uploadData/multipart/uploadPartExecutor.js +20 -11
  24. package/dist/cjs/providers/s3/apis/uploadData/multipart/uploadPartExecutor.js.map +1 -1
  25. package/dist/cjs/providers/s3/apis/uploadData/putObjectJob.js +20 -7
  26. package/dist/cjs/providers/s3/apis/uploadData/putObjectJob.js.map +1 -1
  27. package/dist/cjs/providers/s3/apis/uploadData/validateObjectNotExists.js +25 -0
  28. package/dist/cjs/providers/s3/apis/uploadData/validateObjectNotExists.js.map +1 -0
  29. package/dist/cjs/providers/s3/utils/client/s3control/base.js +70 -0
  30. package/dist/cjs/providers/s3/utils/client/s3control/base.js.map +1 -0
  31. package/dist/cjs/providers/s3/utils/client/s3control/getDataAccess.js +58 -0
  32. package/dist/cjs/providers/s3/utils/client/s3control/getDataAccess.js.map +1 -0
  33. package/dist/cjs/providers/s3/utils/client/s3control/index.js +11 -0
  34. package/dist/cjs/providers/s3/utils/client/s3control/index.js.map +1 -0
  35. package/dist/cjs/providers/s3/utils/client/s3control/listCallerAccessGrants.js +63 -0
  36. package/dist/cjs/providers/s3/utils/client/s3control/listCallerAccessGrants.js.map +1 -0
  37. package/dist/cjs/providers/s3/utils/client/s3control/types.js.map +1 -0
  38. package/dist/cjs/providers/s3/utils/client/{abortMultipartUpload.js → s3data/abortMultipartUpload.js} +2 -2
  39. package/dist/cjs/providers/s3/utils/client/s3data/abortMultipartUpload.js.map +1 -0
  40. package/dist/cjs/providers/s3/utils/client/{base.js → s3data/base.js} +25 -3
  41. package/dist/cjs/providers/s3/utils/client/s3data/base.js.map +1 -0
  42. package/dist/cjs/providers/s3/utils/client/{completeMultipartUpload.js → s3data/completeMultipartUpload.js} +16 -11
  43. package/dist/cjs/providers/s3/utils/client/s3data/completeMultipartUpload.js.map +1 -0
  44. package/dist/cjs/providers/s3/utils/client/{copyObject.js → s3data/copyObject.js} +2 -2
  45. package/dist/cjs/providers/s3/utils/client/s3data/copyObject.js.map +1 -0
  46. package/dist/cjs/providers/s3/utils/client/{createMultipartUpload.js → s3data/createMultipartUpload.js} +8 -3
  47. package/dist/cjs/providers/s3/utils/client/s3data/createMultipartUpload.js.map +1 -0
  48. package/dist/cjs/providers/s3/utils/client/{deleteObject.js → s3data/deleteObject.js} +2 -2
  49. package/dist/cjs/providers/s3/utils/client/s3data/deleteObject.js.map +1 -0
  50. package/dist/cjs/providers/s3/utils/client/{getObject.js → s3data/getObject.js} +3 -3
  51. package/dist/cjs/providers/s3/utils/client/s3data/getObject.js.map +1 -0
  52. package/dist/cjs/providers/s3/utils/client/{headObject.js → s3data/headObject.js} +2 -2
  53. package/dist/cjs/providers/s3/utils/client/s3data/headObject.js.map +1 -0
  54. package/dist/cjs/providers/s3/utils/client/s3data/index.js.map +1 -0
  55. package/dist/cjs/providers/s3/utils/client/{listObjectsV2.js → s3data/listObjectsV2.js} +2 -2
  56. package/dist/cjs/providers/s3/utils/client/s3data/listObjectsV2.js.map +1 -0
  57. package/dist/cjs/providers/s3/utils/client/{listParts.js → s3data/listParts.js} +3 -2
  58. package/dist/cjs/providers/s3/utils/client/s3data/listParts.js.map +1 -0
  59. package/dist/cjs/providers/s3/utils/client/{putObject.js → s3data/putObject.js} +3 -2
  60. package/dist/cjs/providers/s3/utils/client/s3data/putObject.js.map +1 -0
  61. package/dist/cjs/providers/s3/utils/client/s3data/types.js +6 -0
  62. package/dist/cjs/providers/s3/utils/client/s3data/types.js.map +1 -0
  63. package/dist/cjs/providers/s3/utils/client/{uploadPart.js → s3data/uploadPart.js} +4 -3
  64. package/dist/cjs/providers/s3/utils/client/s3data/uploadPart.js.map +1 -0
  65. package/dist/cjs/providers/s3/utils/client/utils/createRetryDecider.js +57 -0
  66. package/dist/cjs/providers/s3/utils/client/utils/createRetryDecider.js.map +1 -0
  67. package/dist/cjs/providers/s3/utils/client/utils/deserializeHelpers.js +34 -1
  68. package/dist/cjs/providers/s3/utils/client/utils/deserializeHelpers.js.map +1 -1
  69. package/dist/cjs/providers/s3/utils/client/utils/index.js +4 -2
  70. package/dist/cjs/providers/s3/utils/client/utils/index.js.map +1 -1
  71. package/dist/cjs/providers/s3/utils/client/utils/parsePayload.js +20 -6
  72. package/dist/cjs/providers/s3/utils/client/utils/parsePayload.js.map +1 -1
  73. package/dist/cjs/providers/s3/utils/crc32.js +37 -0
  74. package/dist/cjs/providers/s3/utils/crc32.js.map +1 -0
  75. package/dist/cjs/providers/s3/utils/crc32.native.js +11 -0
  76. package/dist/cjs/providers/s3/utils/crc32.native.js.map +1 -0
  77. package/dist/cjs/providers/s3/utils/resolveIdentityId.js +14 -0
  78. package/dist/cjs/providers/s3/utils/resolveIdentityId.js.map +1 -0
  79. package/dist/cjs/providers/s3/utils/resolveS3ConfigAndInput.js +59 -13
  80. package/dist/cjs/providers/s3/utils/resolveS3ConfigAndInput.js.map +1 -1
  81. package/dist/cjs/providers/s3/utils/validateStorageOperationInput.js +4 -1
  82. package/dist/cjs/providers/s3/utils/validateStorageOperationInput.js.map +1 -1
  83. package/dist/cjs/providers/s3/utils/validateStorageOperationInputWithPrefix.js +4 -1
  84. package/dist/cjs/providers/s3/utils/validateStorageOperationInputWithPrefix.js.map +1 -1
  85. package/dist/cjs/storageBrowser/apis/constants.js +9 -0
  86. package/dist/cjs/storageBrowser/apis/constants.js.map +1 -0
  87. package/dist/cjs/storageBrowser/apis/getDataAccess.js +57 -0
  88. package/dist/cjs/storageBrowser/apis/getDataAccess.js.map +1 -0
  89. package/dist/cjs/storageBrowser/apis/listCallerAccessGrants.js +69 -0
  90. package/dist/cjs/storageBrowser/apis/listCallerAccessGrants.js.map +1 -0
  91. package/dist/cjs/storageBrowser/apis/types.js +6 -0
  92. package/dist/cjs/storageBrowser/apis/types.js.map +1 -0
  93. package/dist/cjs/storageBrowser/index.js +11 -0
  94. package/dist/cjs/storageBrowser/index.js.map +1 -0
  95. package/dist/cjs/storageBrowser/locationCredentialsStore/constants.js +9 -0
  96. package/dist/cjs/storageBrowser/locationCredentialsStore/constants.js.map +1 -0
  97. package/dist/cjs/storageBrowser/locationCredentialsStore/create.js +36 -0
  98. package/dist/cjs/storageBrowser/locationCredentialsStore/create.js.map +1 -0
  99. package/dist/cjs/storageBrowser/locationCredentialsStore/index.js +9 -0
  100. package/dist/cjs/storageBrowser/locationCredentialsStore/index.js.map +1 -0
  101. package/dist/cjs/storageBrowser/locationCredentialsStore/registry.js +58 -0
  102. package/dist/cjs/storageBrowser/locationCredentialsStore/registry.js.map +1 -0
  103. package/dist/cjs/storageBrowser/locationCredentialsStore/store.js +99 -0
  104. package/dist/cjs/storageBrowser/locationCredentialsStore/store.js.map +1 -0
  105. package/dist/cjs/storageBrowser/managedAuthConfigAdapter/createListLocationsHandler.js +15 -0
  106. package/dist/cjs/storageBrowser/managedAuthConfigAdapter/createListLocationsHandler.js.map +1 -0
  107. package/dist/cjs/storageBrowser/managedAuthConfigAdapter/createLocationCredentialsHandler.js +29 -0
  108. package/dist/cjs/storageBrowser/managedAuthConfigAdapter/createLocationCredentialsHandler.js.map +1 -0
  109. package/dist/cjs/storageBrowser/managedAuthConfigAdapter/createManagedAuthConfigAdapter.js +32 -0
  110. package/dist/cjs/storageBrowser/managedAuthConfigAdapter/createManagedAuthConfigAdapter.js.map +1 -0
  111. package/dist/cjs/storageBrowser/managedAuthConfigAdapter/index.js +9 -0
  112. package/dist/cjs/storageBrowser/managedAuthConfigAdapter/index.js.map +1 -0
  113. package/dist/cjs/storageBrowser/types.js +6 -0
  114. package/dist/cjs/storageBrowser/types.js.map +1 -0
  115. package/dist/esm/errors/constants.d.ts +1 -0
  116. package/dist/esm/errors/constants.mjs +6 -0
  117. package/dist/esm/errors/constants.mjs.map +1 -0
  118. package/dist/esm/errors/types/validation.d.ts +4 -1
  119. package/dist/esm/errors/types/validation.mjs +12 -0
  120. package/dist/esm/errors/types/validation.mjs.map +1 -1
  121. package/dist/esm/providers/s3/apis/downloadData.mjs +13 -13
  122. package/dist/esm/providers/s3/apis/downloadData.mjs.map +1 -1
  123. package/dist/esm/providers/s3/apis/internal/copy.mjs +48 -16
  124. package/dist/esm/providers/s3/apis/internal/copy.mjs.map +1 -1
  125. package/dist/esm/providers/s3/apis/internal/getProperties.mjs +13 -14
  126. package/dist/esm/providers/s3/apis/internal/getProperties.mjs.map +1 -1
  127. package/dist/esm/providers/s3/apis/internal/getUrl.mjs +13 -13
  128. package/dist/esm/providers/s3/apis/internal/getUrl.mjs.map +1 -1
  129. package/dist/esm/providers/s3/apis/internal/list.mjs +13 -13
  130. package/dist/esm/providers/s3/apis/internal/list.mjs.map +1 -1
  131. package/dist/esm/providers/s3/apis/internal/remove.mjs +13 -14
  132. package/dist/esm/providers/s3/apis/internal/remove.mjs.map +1 -1
  133. package/dist/esm/providers/s3/apis/uploadData/multipart/initialUpload.d.ts +2 -1
  134. package/dist/esm/providers/s3/apis/uploadData/multipart/initialUpload.mjs +32 -12
  135. package/dist/esm/providers/s3/apis/uploadData/multipart/initialUpload.mjs.map +1 -1
  136. package/dist/esm/providers/s3/apis/uploadData/multipart/uploadCache.d.ts +3 -1
  137. package/dist/esm/providers/s3/apis/uploadData/multipart/uploadCache.mjs +13 -12
  138. package/dist/esm/providers/s3/apis/uploadData/multipart/uploadCache.mjs.map +1 -1
  139. package/dist/esm/providers/s3/apis/uploadData/multipart/uploadHandlers.mjs +27 -16
  140. package/dist/esm/providers/s3/apis/uploadData/multipart/uploadHandlers.mjs.map +1 -1
  141. package/dist/esm/providers/s3/apis/uploadData/multipart/uploadPartExecutor.d.ts +3 -2
  142. package/dist/esm/providers/s3/apis/uploadData/multipart/uploadPartExecutor.mjs +27 -18
  143. package/dist/esm/providers/s3/apis/uploadData/multipart/uploadPartExecutor.mjs.map +1 -1
  144. package/dist/esm/providers/s3/apis/uploadData/putObjectJob.mjs +30 -17
  145. package/dist/esm/providers/s3/apis/uploadData/putObjectJob.mjs.map +1 -1
  146. package/dist/esm/providers/s3/apis/uploadData/validateObjectNotExists.d.ts +3 -0
  147. package/dist/esm/providers/s3/apis/uploadData/validateObjectNotExists.mjs +34 -0
  148. package/dist/esm/providers/s3/apis/uploadData/validateObjectNotExists.mjs.map +1 -0
  149. package/dist/esm/providers/s3/types/inputs.d.ts +5 -1
  150. package/dist/esm/providers/s3/types/options.d.ts +24 -1
  151. package/dist/esm/providers/s3/utils/client/s3control/base.d.ts +56 -0
  152. package/dist/esm/providers/s3/utils/client/s3control/base.mjs +74 -0
  153. package/dist/esm/providers/s3/utils/client/s3control/base.mjs.map +1 -0
  154. package/dist/esm/providers/s3/utils/client/s3control/getDataAccess.d.ts +26 -0
  155. package/dist/esm/providers/s3/utils/client/s3control/getDataAccess.mjs +63 -0
  156. package/dist/esm/providers/s3/utils/client/s3control/getDataAccess.mjs.map +1 -0
  157. package/dist/esm/providers/s3/utils/client/s3control/index.d.ts +2 -0
  158. package/dist/esm/providers/s3/utils/client/s3control/index.mjs +3 -0
  159. package/dist/esm/providers/s3/utils/client/s3control/index.mjs.map +1 -0
  160. package/dist/esm/providers/s3/utils/client/s3control/listCallerAccessGrants.d.ts +26 -0
  161. package/dist/esm/providers/s3/utils/client/s3control/listCallerAccessGrants.mjs +67 -0
  162. package/dist/esm/providers/s3/utils/client/s3control/listCallerAccessGrants.mjs.map +1 -0
  163. package/dist/esm/providers/s3/utils/client/s3control/types.d.ts +188 -0
  164. package/dist/esm/providers/s3/utils/client/{abortMultipartUpload.d.ts → s3data/abortMultipartUpload.d.ts} +4 -4
  165. package/dist/esm/providers/s3/utils/client/{abortMultipartUpload.mjs → s3data/abortMultipartUpload.mjs} +5 -6
  166. package/dist/esm/providers/s3/utils/client/s3data/abortMultipartUpload.mjs.map +1 -0
  167. package/dist/esm/providers/s3/utils/client/{base.d.ts → s3data/base.d.ts} +23 -1
  168. package/dist/esm/providers/s3/utils/client/{base.mjs → s3data/base.mjs} +29 -6
  169. package/dist/esm/providers/s3/utils/client/s3data/base.mjs.map +1 -0
  170. package/dist/esm/providers/s3/utils/client/{completeMultipartUpload.d.ts → s3data/completeMultipartUpload.d.ts} +6 -6
  171. package/dist/esm/providers/s3/utils/client/{completeMultipartUpload.mjs → s3data/completeMultipartUpload.mjs} +19 -14
  172. package/dist/esm/providers/s3/utils/client/s3data/completeMultipartUpload.mjs.map +1 -0
  173. package/dist/esm/providers/s3/utils/client/{copyObject.d.ts → s3data/copyObject.d.ts} +4 -4
  174. package/dist/esm/providers/s3/utils/client/{copyObject.mjs → s3data/copyObject.mjs} +6 -6
  175. package/dist/esm/providers/s3/utils/client/s3data/copyObject.mjs.map +1 -0
  176. package/dist/esm/providers/s3/utils/client/{createMultipartUpload.d.ts → s3data/createMultipartUpload.d.ts} +4 -4
  177. package/dist/esm/providers/s3/utils/client/{createMultipartUpload.mjs → s3data/createMultipartUpload.mjs} +12 -7
  178. package/dist/esm/providers/s3/utils/client/s3data/createMultipartUpload.mjs.map +1 -0
  179. package/dist/esm/providers/s3/utils/client/{deleteObject.d.ts → s3data/deleteObject.d.ts} +4 -4
  180. package/dist/esm/providers/s3/utils/client/{deleteObject.mjs → s3data/deleteObject.mjs} +5 -6
  181. package/dist/esm/providers/s3/utils/client/s3data/deleteObject.mjs.map +1 -0
  182. package/dist/esm/providers/s3/utils/client/{getObject.d.ts → s3data/getObject.d.ts} +4 -4
  183. package/dist/esm/providers/s3/utils/client/{getObject.mjs → s3data/getObject.mjs} +7 -8
  184. package/dist/esm/providers/s3/utils/client/s3data/getObject.mjs.map +1 -0
  185. package/dist/esm/providers/s3/utils/client/{headObject.d.ts → s3data/headObject.d.ts} +4 -4
  186. package/dist/esm/providers/s3/utils/client/{headObject.mjs → s3data/headObject.mjs} +5 -6
  187. package/dist/esm/providers/s3/utils/client/s3data/headObject.mjs.map +1 -0
  188. package/dist/esm/providers/s3/utils/client/{listObjectsV2.d.ts → s3data/listObjectsV2.d.ts} +4 -4
  189. package/dist/esm/providers/s3/utils/client/{listObjectsV2.mjs → s3data/listObjectsV2.mjs} +6 -6
  190. package/dist/esm/providers/s3/utils/client/s3data/listObjectsV2.mjs.map +1 -0
  191. package/dist/esm/providers/s3/utils/client/{listParts.d.ts → s3data/listParts.d.ts} +4 -4
  192. package/dist/esm/providers/s3/utils/client/{listParts.mjs → s3data/listParts.mjs} +7 -6
  193. package/dist/esm/providers/s3/utils/client/s3data/listParts.mjs.map +1 -0
  194. package/dist/esm/providers/s3/utils/client/{putObject.d.ts → s3data/putObject.d.ts} +5 -5
  195. package/dist/esm/providers/s3/utils/client/{putObject.mjs → s3data/putObject.mjs} +6 -6
  196. package/dist/esm/providers/s3/utils/client/s3data/putObject.mjs.map +1 -0
  197. package/dist/esm/providers/s3/utils/client/s3data/types.mjs +2 -0
  198. package/dist/esm/providers/s3/utils/client/s3data/types.mjs.map +1 -0
  199. package/dist/esm/providers/s3/utils/client/{uploadPart.d.ts → s3data/uploadPart.d.ts} +5 -5
  200. package/dist/esm/providers/s3/utils/client/{uploadPart.mjs → s3data/uploadPart.mjs} +7 -7
  201. package/dist/esm/providers/s3/utils/client/s3data/uploadPart.mjs.map +1 -0
  202. package/dist/esm/providers/s3/utils/client/utils/createRetryDecider.d.ts +22 -0
  203. package/dist/esm/providers/s3/utils/client/utils/createRetryDecider.mjs +55 -0
  204. package/dist/esm/providers/s3/utils/client/utils/createRetryDecider.mjs.map +1 -0
  205. package/dist/esm/providers/s3/utils/client/utils/deserializeHelpers.d.ts +17 -0
  206. package/dist/esm/providers/s3/utils/client/utils/deserializeHelpers.mjs +33 -1
  207. package/dist/esm/providers/s3/utils/client/utils/deserializeHelpers.mjs.map +1 -1
  208. package/dist/esm/providers/s3/utils/client/utils/index.d.ts +2 -1
  209. package/dist/esm/providers/s3/utils/client/utils/index.mjs +2 -1
  210. package/dist/esm/providers/s3/utils/client/utils/index.mjs.map +1 -1
  211. package/dist/esm/providers/s3/utils/client/utils/parsePayload.d.ts +16 -1
  212. package/dist/esm/providers/s3/utils/client/utils/parsePayload.mjs +19 -5
  213. package/dist/esm/providers/s3/utils/client/utils/parsePayload.mjs.map +1 -1
  214. package/dist/esm/providers/s3/utils/crc32.d.ts +6 -0
  215. package/dist/esm/providers/s3/utils/crc32.mjs +34 -0
  216. package/dist/esm/providers/s3/utils/crc32.mjs.map +1 -0
  217. package/dist/esm/providers/s3/utils/crc32.native.d.ts +2 -0
  218. package/dist/esm/providers/s3/utils/crc32.native.mjs +8 -0
  219. package/dist/esm/providers/s3/utils/crc32.native.mjs.map +1 -0
  220. package/dist/esm/providers/s3/utils/resolveIdentityId.d.ts +1 -0
  221. package/dist/esm/providers/s3/utils/resolveIdentityId.mjs +12 -0
  222. package/dist/esm/providers/s3/utils/resolveIdentityId.mjs.map +1 -0
  223. package/dist/esm/providers/s3/utils/resolveS3ConfigAndInput.d.ts +10 -2
  224. package/dist/esm/providers/s3/utils/resolveS3ConfigAndInput.mjs +57 -11
  225. package/dist/esm/providers/s3/utils/resolveS3ConfigAndInput.mjs.map +1 -1
  226. package/dist/esm/providers/s3/utils/validateStorageOperationInput.mjs +4 -1
  227. package/dist/esm/providers/s3/utils/validateStorageOperationInput.mjs.map +1 -1
  228. package/dist/esm/providers/s3/utils/validateStorageOperationInputWithPrefix.mjs +4 -1
  229. package/dist/esm/providers/s3/utils/validateStorageOperationInputWithPrefix.mjs.map +1 -1
  230. package/dist/esm/storageBrowser/apis/constants.d.ts +2 -0
  231. package/dist/esm/storageBrowser/apis/constants.mjs +7 -0
  232. package/dist/esm/storageBrowser/apis/constants.mjs.map +1 -0
  233. package/dist/esm/storageBrowser/apis/getDataAccess.d.ts +2 -0
  234. package/dist/esm/storageBrowser/apis/getDataAccess.mjs +57 -0
  235. package/dist/esm/storageBrowser/apis/getDataAccess.mjs.map +1 -0
  236. package/dist/esm/storageBrowser/apis/listCallerAccessGrants.d.ts +2 -0
  237. package/dist/esm/storageBrowser/apis/listCallerAccessGrants.mjs +69 -0
  238. package/dist/esm/storageBrowser/apis/listCallerAccessGrants.mjs.map +1 -0
  239. package/dist/esm/storageBrowser/apis/types.d.ts +18 -0
  240. package/dist/esm/storageBrowser/apis/types.mjs +2 -0
  241. package/dist/esm/storageBrowser/apis/types.mjs.map +1 -0
  242. package/dist/esm/storageBrowser/index.d.ts +6 -0
  243. package/dist/esm/storageBrowser/index.mjs +3 -0
  244. package/dist/esm/storageBrowser/index.mjs.map +1 -0
  245. package/dist/esm/storageBrowser/locationCredentialsStore/constants.d.ts +2 -0
  246. package/dist/esm/storageBrowser/locationCredentialsStore/constants.mjs +7 -0
  247. package/dist/esm/storageBrowser/locationCredentialsStore/constants.mjs.map +1 -0
  248. package/dist/esm/storageBrowser/locationCredentialsStore/create.d.ts +2 -0
  249. package/dist/esm/storageBrowser/locationCredentialsStore/create.mjs +34 -0
  250. package/dist/esm/storageBrowser/locationCredentialsStore/create.mjs.map +1 -0
  251. package/dist/esm/storageBrowser/locationCredentialsStore/index.d.ts +1 -0
  252. package/dist/esm/storageBrowser/locationCredentialsStore/index.mjs +2 -0
  253. package/dist/esm/storageBrowser/locationCredentialsStore/index.mjs.map +1 -0
  254. package/dist/esm/storageBrowser/locationCredentialsStore/registry.d.ts +23 -0
  255. package/dist/esm/storageBrowser/locationCredentialsStore/registry.mjs +54 -0
  256. package/dist/esm/storageBrowser/locationCredentialsStore/registry.mjs.map +1 -0
  257. package/dist/esm/storageBrowser/locationCredentialsStore/store.d.ts +35 -0
  258. package/dist/esm/storageBrowser/locationCredentialsStore/store.mjs +95 -0
  259. package/dist/esm/storageBrowser/locationCredentialsStore/store.mjs.map +1 -0
  260. package/dist/esm/storageBrowser/managedAuthConfigAdapter/createListLocationsHandler.d.ts +8 -0
  261. package/dist/esm/storageBrowser/managedAuthConfigAdapter/createListLocationsHandler.mjs +13 -0
  262. package/dist/esm/storageBrowser/managedAuthConfigAdapter/createListLocationsHandler.mjs.map +1 -0
  263. package/dist/esm/storageBrowser/managedAuthConfigAdapter/createLocationCredentialsHandler.d.ts +8 -0
  264. package/dist/esm/storageBrowser/managedAuthConfigAdapter/createLocationCredentialsHandler.mjs +27 -0
  265. package/dist/esm/storageBrowser/managedAuthConfigAdapter/createLocationCredentialsHandler.mjs.map +1 -0
  266. package/dist/esm/storageBrowser/managedAuthConfigAdapter/createManagedAuthConfigAdapter.d.ts +19 -0
  267. package/dist/esm/storageBrowser/managedAuthConfigAdapter/createManagedAuthConfigAdapter.mjs +30 -0
  268. package/dist/esm/storageBrowser/managedAuthConfigAdapter/createManagedAuthConfigAdapter.mjs.map +1 -0
  269. package/dist/esm/storageBrowser/managedAuthConfigAdapter/index.d.ts +1 -0
  270. package/dist/esm/storageBrowser/managedAuthConfigAdapter/index.mjs +2 -0
  271. package/dist/esm/storageBrowser/managedAuthConfigAdapter/index.mjs.map +1 -0
  272. package/dist/esm/storageBrowser/types.d.ts +92 -0
  273. package/dist/esm/storageBrowser/types.mjs +2 -0
  274. package/dist/esm/storageBrowser/types.mjs.map +1 -0
  275. package/package.json +117 -107
  276. package/src/errors/constants.ts +4 -0
  277. package/src/errors/types/validation.ts +12 -0
  278. package/src/providers/s3/apis/downloadData.ts +2 -2
  279. package/src/providers/s3/apis/internal/copy.ts +42 -12
  280. package/src/providers/s3/apis/internal/getProperties.ts +2 -3
  281. package/src/providers/s3/apis/internal/getUrl.ts +2 -2
  282. package/src/providers/s3/apis/internal/list.ts +3 -3
  283. package/src/providers/s3/apis/internal/remove.ts +2 -3
  284. package/src/providers/s3/apis/uploadData/multipart/initialUpload.ts +30 -1
  285. package/src/providers/s3/apis/uploadData/multipart/uploadCache.ts +4 -1
  286. package/src/providers/s3/apis/uploadData/multipart/uploadHandlers.ts +36 -17
  287. package/src/providers/s3/apis/uploadData/multipart/uploadPartExecutor.ts +23 -7
  288. package/src/providers/s3/apis/uploadData/putObjectJob.ts +22 -5
  289. package/src/providers/s3/apis/uploadData/validateObjectNotExists.ts +25 -0
  290. package/src/providers/s3/types/inputs.ts +7 -1
  291. package/src/providers/s3/types/options.ts +35 -1
  292. package/src/providers/s3/utils/client/s3control/base.ts +97 -0
  293. package/src/providers/s3/utils/client/s3control/getDataAccess.ts +96 -0
  294. package/src/providers/s3/utils/client/s3control/index.ts +13 -0
  295. package/src/providers/s3/utils/client/s3control/listCallerAccessGrants.ts +107 -0
  296. package/src/providers/s3/utils/client/s3control/types.ts +216 -0
  297. package/src/providers/s3/utils/client/{abortMultipartUpload.ts → s3data/abortMultipartUpload.ts} +4 -4
  298. package/src/providers/s3/utils/client/{base.ts → s3data/base.ts} +26 -3
  299. package/src/providers/s3/utils/client/{completeMultipartUpload.ts → s3data/completeMultipartUpload.ts} +28 -19
  300. package/src/providers/s3/utils/client/{copyObject.ts → s3data/copyObject.ts} +4 -4
  301. package/src/providers/s3/utils/client/{createMultipartUpload.ts → s3data/createMultipartUpload.ts} +15 -9
  302. package/src/providers/s3/utils/client/{deleteObject.ts → s3data/deleteObject.ts} +7 -7
  303. package/src/providers/s3/utils/client/{getObject.ts → s3data/getObject.ts} +13 -9
  304. package/src/providers/s3/utils/client/{headObject.ts → s3data/headObject.ts} +4 -4
  305. package/src/providers/s3/utils/client/{listObjectsV2.ts → s3data/listObjectsV2.ts} +7 -7
  306. package/src/providers/s3/utils/client/{listParts.ts → s3data/listParts.ts} +9 -8
  307. package/src/providers/s3/utils/client/{putObject.ts → s3data/putObject.ts} +6 -4
  308. package/src/providers/s3/utils/client/{uploadPart.ts → s3data/uploadPart.ts} +13 -6
  309. package/src/providers/s3/utils/client/utils/createRetryDecider.ts +96 -0
  310. package/src/providers/s3/utils/client/utils/deserializeHelpers.ts +41 -0
  311. package/src/providers/s3/utils/client/utils/index.ts +2 -1
  312. package/src/providers/s3/utils/client/utils/parsePayload.ts +36 -18
  313. package/src/providers/s3/utils/crc32.native.ts +11 -0
  314. package/src/providers/s3/utils/crc32.ts +51 -0
  315. package/src/providers/s3/utils/resolveIdentityId.ts +11 -0
  316. package/src/providers/s3/utils/resolveS3ConfigAndInput.ts +109 -14
  317. package/src/providers/s3/utils/validateStorageOperationInput.ts +5 -1
  318. package/src/providers/s3/utils/validateStorageOperationInputWithPrefix.ts +5 -1
  319. package/src/storageBrowser/apis/constants.ts +5 -0
  320. package/src/storageBrowser/apis/getDataAccess.ts +79 -0
  321. package/src/storageBrowser/apis/listCallerAccessGrants.ts +94 -0
  322. package/src/storageBrowser/apis/types.ts +33 -0
  323. package/src/storageBrowser/index.ts +25 -0
  324. package/src/storageBrowser/locationCredentialsStore/constants.ts +5 -0
  325. package/src/storageBrowser/locationCredentialsStore/create.ts +54 -0
  326. package/src/storageBrowser/locationCredentialsStore/index.ts +4 -0
  327. package/src/storageBrowser/locationCredentialsStore/registry.ts +88 -0
  328. package/src/storageBrowser/locationCredentialsStore/store.ts +161 -0
  329. package/src/storageBrowser/managedAuthConfigAdapter/createListLocationsHandler.ts +21 -0
  330. package/src/storageBrowser/managedAuthConfigAdapter/createLocationCredentialsHandler.ts +40 -0
  331. package/src/storageBrowser/managedAuthConfigAdapter/createManagedAuthConfigAdapter.ts +53 -0
  332. package/src/storageBrowser/managedAuthConfigAdapter/index.ts +8 -0
  333. package/src/storageBrowser/types.ts +117 -0
  334. package/dist/cjs/providers/s3/utils/client/abortMultipartUpload.js.map +0 -1
  335. package/dist/cjs/providers/s3/utils/client/base.js.map +0 -1
  336. package/dist/cjs/providers/s3/utils/client/completeMultipartUpload.js.map +0 -1
  337. package/dist/cjs/providers/s3/utils/client/copyObject.js.map +0 -1
  338. package/dist/cjs/providers/s3/utils/client/createMultipartUpload.js.map +0 -1
  339. package/dist/cjs/providers/s3/utils/client/deleteObject.js.map +0 -1
  340. package/dist/cjs/providers/s3/utils/client/getObject.js.map +0 -1
  341. package/dist/cjs/providers/s3/utils/client/headObject.js.map +0 -1
  342. package/dist/cjs/providers/s3/utils/client/index.js.map +0 -1
  343. package/dist/cjs/providers/s3/utils/client/listObjectsV2.js.map +0 -1
  344. package/dist/cjs/providers/s3/utils/client/listParts.js.map +0 -1
  345. package/dist/cjs/providers/s3/utils/client/putObject.js.map +0 -1
  346. package/dist/cjs/providers/s3/utils/client/types.js.map +0 -1
  347. package/dist/cjs/providers/s3/utils/client/uploadPart.js.map +0 -1
  348. package/dist/esm/providers/s3/utils/client/abortMultipartUpload.mjs.map +0 -1
  349. package/dist/esm/providers/s3/utils/client/base.mjs.map +0 -1
  350. package/dist/esm/providers/s3/utils/client/completeMultipartUpload.mjs.map +0 -1
  351. package/dist/esm/providers/s3/utils/client/copyObject.mjs.map +0 -1
  352. package/dist/esm/providers/s3/utils/client/createMultipartUpload.mjs.map +0 -1
  353. package/dist/esm/providers/s3/utils/client/deleteObject.mjs.map +0 -1
  354. package/dist/esm/providers/s3/utils/client/getObject.mjs.map +0 -1
  355. package/dist/esm/providers/s3/utils/client/headObject.mjs.map +0 -1
  356. package/dist/esm/providers/s3/utils/client/listObjectsV2.mjs.map +0 -1
  357. package/dist/esm/providers/s3/utils/client/listParts.mjs.map +0 -1
  358. package/dist/esm/providers/s3/utils/client/putObject.mjs.map +0 -1
  359. package/dist/esm/providers/s3/utils/client/uploadPart.mjs.map +0 -1
  360. /package/dist/cjs/providers/s3/utils/client/{types.js → s3control/types.js} +0 -0
  361. /package/dist/cjs/providers/s3/utils/client/{index.js → s3data/index.js} +0 -0
  362. /package/dist/esm/providers/s3/utils/client/{types.mjs → s3control/types.mjs} +0 -0
  363. /package/dist/esm/providers/s3/utils/client/{types.mjs.map → s3control/types.mjs.map} +0 -0
  364. /package/dist/esm/providers/s3/utils/client/{index.d.ts → s3data/index.d.ts} +0 -0
  365. /package/dist/esm/providers/s3/utils/client/{index.mjs → s3data/index.mjs} +0 -0
  366. /package/dist/esm/providers/s3/utils/client/{index.mjs.map → s3data/index.mjs.map} +0 -0
  367. /package/dist/esm/providers/s3/utils/client/{types.d.ts → s3data/types.d.ts} +0 -0
  368. /package/src/providers/s3/utils/client/{index.ts → s3data/index.ts} +0 -0
  369. /package/src/providers/s3/utils/client/{types.ts → s3data/types.ts} +0 -0
@@ -14,7 +14,7 @@ import {
14
14
  resolveS3ConfigAndInput,
15
15
  validateStorageOperationInput,
16
16
  } from '../../utils';
17
- import { deleteObject } from '../../utils/client';
17
+ import { deleteObject } from '../../utils/client/s3data';
18
18
  import { getStorageUserAgentValue } from '../../utils/userAgent';
19
19
  import { logger } from '../../../../utils';
20
20
  import { STORAGE_INPUT_KEY } from '../../utils/constants';
@@ -23,9 +23,8 @@ export const remove = async (
23
23
  amplify: AmplifyClassV6,
24
24
  input: RemoveInput | RemoveWithPathInput,
25
25
  ): Promise<RemoveOutput | RemoveWithPathOutput> => {
26
- const { options = {} } = input ?? {};
27
26
  const { s3Config, keyPrefix, bucket, identityId } =
28
- await resolveS3ConfigAndInput(amplify, options);
27
+ await resolveS3ConfigAndInput(amplify, input);
29
28
 
30
29
  const { inputType, objectKey } = validateStorageOperationInput(
31
30
  input,
@@ -5,8 +5,9 @@ import { StorageAccessLevel } from '@aws-amplify/core';
5
5
 
6
6
  import { ContentDisposition, ResolvedS3Config } from '../../../types/options';
7
7
  import { StorageUploadDataPayload } from '../../../../../types';
8
- import { Part, createMultipartUpload } from '../../../utils/client';
8
+ import { Part, createMultipartUpload } from '../../../utils/client/s3data';
9
9
  import { logger } from '../../../../../utils';
10
+ import { calculateContentCRC32 } from '../../../utils/crc32';
10
11
  import { constructContentDisposition } from '../../../utils/constructContentDisposition';
11
12
 
12
13
  import {
@@ -14,6 +15,7 @@ import {
14
15
  findCachedUploadParts,
15
16
  getUploadsCacheKey,
16
17
  } from './uploadCache';
18
+ import { getDataChunker } from './getDataChunker';
17
19
 
18
20
  interface LoadOrCreateMultipartUploadOptions {
19
21
  s3Config: ResolvedS3Config;
@@ -33,6 +35,7 @@ interface LoadOrCreateMultipartUploadOptions {
33
35
  interface LoadOrCreateMultipartUploadResult {
34
36
  uploadId: string;
35
37
  cachedParts: Part[];
38
+ finalCrc32?: string;
36
39
  }
37
40
 
38
41
  /**
@@ -62,6 +65,7 @@ export const loadOrCreateMultipartUpload = async ({
62
65
  parts: Part[];
63
66
  uploadId: string;
64
67
  uploadCacheKey: string;
68
+ finalCrc32?: string;
65
69
  }
66
70
  | undefined;
67
71
  if (size === undefined) {
@@ -92,8 +96,11 @@ export const loadOrCreateMultipartUpload = async ({
92
96
  return {
93
97
  uploadId: cachedUpload.uploadId,
94
98
  cachedParts: cachedUpload.parts,
99
+ finalCrc32: cachedUpload.finalCrc32,
95
100
  };
96
101
  } else {
102
+ const finalCrc32 = await getCombinedCrc32(data, size);
103
+
97
104
  const { UploadId } = await createMultipartUpload(
98
105
  {
99
106
  ...s3Config,
@@ -106,14 +113,17 @@ export const loadOrCreateMultipartUpload = async ({
106
113
  ContentDisposition: constructContentDisposition(contentDisposition),
107
114
  ContentEncoding: contentEncoding,
108
115
  Metadata: metadata,
116
+ ChecksumAlgorithm: finalCrc32 ? 'CRC32' : undefined,
109
117
  },
110
118
  );
119
+
111
120
  if (size === undefined) {
112
121
  logger.debug('uploaded data size cannot be determined, skipping cache.');
113
122
 
114
123
  return {
115
124
  uploadId: UploadId!,
116
125
  cachedParts: [],
126
+ finalCrc32,
117
127
  };
118
128
  }
119
129
  const uploadCacheKey = getUploadsCacheKey({
@@ -128,12 +138,31 @@ export const loadOrCreateMultipartUpload = async ({
128
138
  uploadId: UploadId!,
129
139
  bucket,
130
140
  key,
141
+ finalCrc32,
131
142
  fileName: data instanceof File ? data.name : '',
132
143
  });
133
144
 
134
145
  return {
135
146
  uploadId: UploadId!,
136
147
  cachedParts: [],
148
+ finalCrc32,
137
149
  };
138
150
  }
139
151
  };
152
+
153
+ const getCombinedCrc32 = async (
154
+ data: StorageUploadDataPayload,
155
+ size: number | undefined,
156
+ ) => {
157
+ const crc32List: ArrayBuffer[] = [];
158
+ const dataChunker = getDataChunker(data, size);
159
+ for (const { data: checkData } of dataChunker) {
160
+ const checksumArrayBuffer = (await calculateContentCRC32(checkData))
161
+ ?.checksumArrayBuffer;
162
+ if (checksumArrayBuffer === undefined) return undefined;
163
+
164
+ crc32List.push(checksumArrayBuffer);
165
+ }
166
+
167
+ return `${(await calculateContentCRC32(new Blob(crc32List)))?.checksum}-${crc32List.length}`;
168
+ };
@@ -9,7 +9,7 @@ import {
9
9
 
10
10
  import { UPLOADS_STORAGE_KEY } from '../../../utils/constants';
11
11
  import { ResolvedS3Config } from '../../../types/options';
12
- import { Part, listParts } from '../../../utils/client';
12
+ import { Part, listParts } from '../../../utils/client/s3data';
13
13
  import { logger } from '../../../../../utils';
14
14
 
15
15
  const ONE_HOUR = 1000 * 60 * 60;
@@ -33,6 +33,7 @@ export const findCachedUploadParts = async ({
33
33
  }: FindCachedUploadPartsOptions): Promise<{
34
34
  parts: Part[];
35
35
  uploadId: string;
36
+ finalCrc32?: string;
36
37
  } | null> => {
37
38
  const cachedUploads = await listCachedUploadTasks(defaultStorage);
38
39
  if (
@@ -60,6 +61,7 @@ export const findCachedUploadParts = async ({
60
61
  return {
61
62
  parts: Parts,
62
63
  uploadId: cachedUpload.uploadId,
64
+ finalCrc32: cachedUpload.finalCrc32,
63
65
  };
64
66
  } catch (e) {
65
67
  logger.debug('failed to list cached parts, removing cached upload.');
@@ -74,6 +76,7 @@ interface FileMetadata {
74
76
  fileName: string;
75
77
  key: string;
76
78
  uploadId: string;
79
+ finalCrc32?: string;
77
80
  // Unix timestamp in ms
78
81
  lastTouched: number;
79
82
  }
@@ -26,9 +26,10 @@ import {
26
26
  abortMultipartUpload,
27
27
  completeMultipartUpload,
28
28
  headObject,
29
- } from '../../../utils/client';
29
+ } from '../../../utils/client/s3data';
30
30
  import { getStorageUserAgentValue } from '../../../utils/userAgent';
31
31
  import { logger } from '../../../../../utils';
32
+ import { validateObjectNotExists } from '../validateObjectNotExists';
32
33
 
33
34
  import { uploadPartExecutor } from './uploadPartExecutor';
34
35
  import { getUploadsCacheKey, removeCachedUpload } from './uploadCache';
@@ -54,6 +55,7 @@ export const getMultipartUploadHandlers = (
54
55
  | {
55
56
  uploadId: string;
56
57
  completedParts: Part[];
58
+ finalCrc32?: string;
57
59
  }
58
60
  | undefined;
59
61
  let resolvedS3Config: ResolvedS3Config | undefined;
@@ -73,7 +75,7 @@ export const getMultipartUploadHandlers = (
73
75
  const { options: uploadDataOptions, data } = uploadDataInput;
74
76
  const resolvedS3Options = await resolveS3ConfigAndInput(
75
77
  Amplify,
76
- uploadDataOptions,
78
+ uploadDataInput,
77
79
  );
78
80
 
79
81
  abortController = new AbortController();
@@ -92,6 +94,7 @@ export const getMultipartUploadHandlers = (
92
94
  contentEncoding,
93
95
  contentType = 'application/octet-stream',
94
96
  metadata,
97
+ preventOverwrite,
95
98
  onProgress,
96
99
  } = uploadDataOptions ?? {};
97
100
 
@@ -108,23 +111,25 @@ export const getMultipartUploadHandlers = (
108
111
  }
109
112
 
110
113
  if (!inProgressUpload) {
111
- const { uploadId, cachedParts } = await loadOrCreateMultipartUpload({
112
- s3Config: resolvedS3Config,
113
- accessLevel: resolvedAccessLevel,
114
- bucket: resolvedBucket,
115
- keyPrefix: resolvedKeyPrefix,
116
- key: objectKey,
117
- contentType,
118
- contentDisposition,
119
- contentEncoding,
120
- metadata,
121
- data,
122
- size,
123
- abortSignal: abortController.signal,
124
- });
114
+ const { uploadId, cachedParts, finalCrc32 } =
115
+ await loadOrCreateMultipartUpload({
116
+ s3Config: resolvedS3Config,
117
+ accessLevel: resolvedAccessLevel,
118
+ bucket: resolvedBucket,
119
+ keyPrefix: resolvedKeyPrefix,
120
+ key: objectKey,
121
+ contentType,
122
+ contentDisposition,
123
+ contentEncoding,
124
+ metadata,
125
+ data,
126
+ size,
127
+ abortSignal: abortController.signal,
128
+ });
125
129
  inProgressUpload = {
126
130
  uploadId,
127
131
  completedParts: cachedParts,
132
+ finalCrc32,
128
133
  };
129
134
  }
130
135
 
@@ -143,10 +148,15 @@ export const getMultipartUploadHandlers = (
143
148
  const completedPartNumberSet = new Set<number>(
144
149
  inProgressUpload.completedParts.map(({ PartNumber }) => PartNumber!),
145
150
  );
146
- const onPartUploadCompletion = (partNumber: number, eTag: string) => {
151
+ const onPartUploadCompletion = (
152
+ partNumber: number,
153
+ eTag: string,
154
+ crc32: string | undefined,
155
+ ) => {
147
156
  inProgressUpload?.completedParts.push({
148
157
  PartNumber: partNumber,
149
158
  ETag: eTag,
159
+ ChecksumCRC32: crc32,
150
160
  });
151
161
  };
152
162
  const concurrentUploadsProgressTracker =
@@ -169,12 +179,20 @@ export const getMultipartUploadHandlers = (
169
179
  onPartUploadCompletion,
170
180
  onProgress: concurrentUploadsProgressTracker.getOnProgressListener(),
171
181
  isObjectLockEnabled: resolvedS3Options.isObjectLockEnabled,
182
+ useCRC32Checksum: Boolean(inProgressUpload.finalCrc32),
172
183
  }),
173
184
  );
174
185
  }
175
186
 
176
187
  await Promise.all(concurrentUploadPartExecutors);
177
188
 
189
+ if (preventOverwrite) {
190
+ await validateObjectNotExists(resolvedS3Config, {
191
+ Bucket: resolvedBucket,
192
+ Key: finalKey,
193
+ });
194
+ }
195
+
178
196
  const { ETag: eTag } = await completeMultipartUpload(
179
197
  {
180
198
  ...resolvedS3Config,
@@ -185,6 +203,7 @@ export const getMultipartUploadHandlers = (
185
203
  Bucket: resolvedBucket,
186
204
  Key: finalKey,
187
205
  UploadId: inProgressUpload.uploadId,
206
+ ChecksumCRC32: inProgressUpload.finalCrc32,
188
207
  MultipartUpload: {
189
208
  Parts: inProgressUpload.completedParts.sort(
190
209
  (partA, partB) => partA.PartNumber! - partB.PartNumber!,
@@ -3,9 +3,10 @@
3
3
 
4
4
  import { TransferProgressEvent } from '../../../../../types';
5
5
  import { ResolvedS3Config } from '../../../types/options';
6
- import { calculateContentMd5 } from '../../../utils';
7
- import { uploadPart } from '../../../utils/client';
6
+ import { uploadPart } from '../../../utils/client/s3data';
8
7
  import { logger } from '../../../../../utils';
8
+ import { CRC32Checksum, calculateContentCRC32 } from '../../../utils/crc32';
9
+ import { calculateContentMd5 } from '../../../utils';
9
10
 
10
11
  import { PartToUpload } from './getDataChunker';
11
12
 
@@ -18,7 +19,12 @@ interface UploadPartExecutorOptions {
18
19
  finalKey: string;
19
20
  uploadId: string;
20
21
  isObjectLockEnabled?: boolean;
21
- onPartUploadCompletion(partNumber: number, eTag: string): void;
22
+ useCRC32Checksum?: boolean;
23
+ onPartUploadCompletion(
24
+ partNumber: number,
25
+ eTag: string,
26
+ crc32: string | undefined,
27
+ ): void;
22
28
  onProgress?(event: TransferProgressEvent): void;
23
29
  }
24
30
 
@@ -33,6 +39,7 @@ export const uploadPartExecutor = async ({
33
39
  onPartUploadCompletion,
34
40
  onProgress,
35
41
  isObjectLockEnabled,
42
+ useCRC32Checksum,
36
43
  }: UploadPartExecutorOptions) => {
37
44
  let transferredBytes = 0;
38
45
  for (const { data, partNumber, size } of dataChunkerGenerator) {
@@ -49,6 +56,16 @@ export const uploadPartExecutor = async ({
49
56
  });
50
57
  } else {
51
58
  // handle cancel error
59
+ let checksumCRC32: CRC32Checksum | undefined;
60
+ if (useCRC32Checksum) {
61
+ checksumCRC32 = await calculateContentCRC32(data);
62
+ }
63
+ const contentMD5 =
64
+ // check if checksum exists. ex: should not exist in react native
65
+ !checksumCRC32 && isObjectLockEnabled
66
+ ? await calculateContentMd5(data)
67
+ : undefined;
68
+
52
69
  const { ETag: eTag } = await uploadPart(
53
70
  {
54
71
  ...s3Config,
@@ -66,14 +83,13 @@ export const uploadPartExecutor = async ({
66
83
  UploadId: uploadId,
67
84
  Body: data,
68
85
  PartNumber: partNumber,
69
- ContentMD5: isObjectLockEnabled
70
- ? await calculateContentMd5(data)
71
- : undefined,
86
+ ChecksumCRC32: checksumCRC32?.checksum,
87
+ ContentMD5: contentMD5,
72
88
  },
73
89
  );
74
90
  transferredBytes += size;
75
91
  // eTag will always be set even the S3 model interface marks it as optional.
76
- onPartUploadCompletion(partNumber, eTag!);
92
+ onPartUploadCompletion(partNumber, eTag!, checksumCRC32?.checksum);
77
93
  }
78
94
  }
79
95
  };
@@ -11,11 +11,14 @@ import {
11
11
  validateStorageOperationInput,
12
12
  } from '../../utils';
13
13
  import { ItemWithKey, ItemWithPath } from '../../types/outputs';
14
- import { putObject } from '../../utils/client';
14
+ import { putObject } from '../../utils/client/s3data';
15
15
  import { getStorageUserAgentValue } from '../../utils/userAgent';
16
16
  import { STORAGE_INPUT_KEY } from '../../utils/constants';
17
+ import { calculateContentCRC32 } from '../../utils/crc32';
17
18
  import { constructContentDisposition } from '../../utils/constructContentDisposition';
18
19
 
20
+ import { validateObjectNotExists } from './validateObjectNotExists';
21
+
19
22
  /**
20
23
  * Get a function the returns a promise to call putObject API to S3.
21
24
  *
@@ -30,7 +33,7 @@ export const putObjectJob =
30
33
  async (): Promise<ItemWithKey | ItemWithPath> => {
31
34
  const { options: uploadDataOptions, data } = uploadDataInput;
32
35
  const { bucket, keyPrefix, s3Config, isObjectLockEnabled, identityId } =
33
- await resolveS3ConfigAndInput(Amplify, uploadDataOptions);
36
+ await resolveS3ConfigAndInput(Amplify, uploadDataInput);
34
37
  const { inputType, objectKey } = validateStorageOperationInput(
35
38
  uploadDataInput,
36
39
  identityId,
@@ -42,10 +45,25 @@ export const putObjectJob =
42
45
  contentDisposition,
43
46
  contentEncoding,
44
47
  contentType = 'application/octet-stream',
48
+ preventOverwrite,
45
49
  metadata,
46
50
  onProgress,
47
51
  } = uploadDataOptions ?? {};
48
52
 
53
+ const checksumCRC32 = await calculateContentCRC32(data);
54
+ const contentMD5 =
55
+ // check if checksum exists. ex: should not exist in react native
56
+ !checksumCRC32 && isObjectLockEnabled
57
+ ? await calculateContentMd5(data)
58
+ : undefined;
59
+
60
+ if (preventOverwrite) {
61
+ await validateObjectNotExists(s3Config, {
62
+ Bucket: bucket,
63
+ Key: finalKey,
64
+ });
65
+ }
66
+
49
67
  const { ETag: eTag, VersionId: versionId } = await putObject(
50
68
  {
51
69
  ...s3Config,
@@ -61,9 +79,8 @@ export const putObjectJob =
61
79
  ContentDisposition: constructContentDisposition(contentDisposition),
62
80
  ContentEncoding: contentEncoding,
63
81
  Metadata: metadata,
64
- ContentMD5: isObjectLockEnabled
65
- ? await calculateContentMd5(data)
66
- : undefined,
82
+ ContentMD5: contentMD5,
83
+ ChecksumCRC32: checksumCRC32?.checksum,
67
84
  },
68
85
  );
69
86
 
@@ -0,0 +1,25 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import { StorageError } from '../../../../errors/StorageError';
5
+ import { ResolvedS3Config } from '../../types/options';
6
+ import { HeadObjectInput, headObject } from '../../utils/client/s3data';
7
+
8
+ export const validateObjectNotExists = async (
9
+ s3Config: ResolvedS3Config,
10
+ input: HeadObjectInput,
11
+ ): Promise<void> => {
12
+ try {
13
+ await headObject(s3Config, input);
14
+
15
+ throw new StorageError({
16
+ name: 'PreconditionFailed',
17
+ message: 'At least one of the pre-conditions you specified did not hold',
18
+ });
19
+ } catch (error) {
20
+ const serviceError = error as StorageError;
21
+ if (serviceError.name !== 'NotFound') {
22
+ throw error;
23
+ }
24
+ }
25
+ };
@@ -17,6 +17,7 @@ import {
17
17
  StorageUploadDataInputWithKey,
18
18
  StorageUploadDataInputWithPath,
19
19
  } from '../../../types';
20
+ import { StorageOperationOptionsInput } from '../../../types/inputs';
20
21
  import {
21
22
  CopyDestinationOptionsWithKey,
22
23
  CopySourceOptionsWithKey,
@@ -35,6 +36,8 @@ import {
35
36
  UploadDataOptionsWithPath,
36
37
  } from '../types';
37
38
 
39
+ import { LocationCredentialsProvider } from './options';
40
+
38
41
  // TODO: support use accelerate endpoint option
39
42
  /**
40
43
  * @deprecated Use {@link CopyWithPathInput} instead.
@@ -47,7 +50,10 @@ export type CopyInput = StorageCopyInputWithKey<
47
50
  /**
48
51
  * Input type with path for S3 copy API.
49
52
  */
50
- export type CopyWithPathInput = StorageCopyInputWithPath;
53
+ export type CopyWithPathInput = StorageCopyInputWithPath &
54
+ StorageOperationOptionsInput<{
55
+ locationCredentialsProvider?: LocationCredentialsProvider;
56
+ }>;
51
57
 
52
58
  /**
53
59
  * @deprecated Use {@link GetPropertiesWithPathInput} instead.
@@ -2,7 +2,11 @@
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
4
  import { StorageAccessLevel } from '@aws-amplify/core';
5
- import { SigningOptions } from '@aws-amplify/core/internals/aws-client-utils';
5
+ import { AWSCredentials } from '@aws-amplify/core/internals/utils';
6
+ import {
7
+ CredentialsProviderOptions,
8
+ SigningOptions,
9
+ } from '@aws-amplify/core/internals/aws-client-utils';
6
10
 
7
11
  import { TransferProgressEvent } from '../../../types';
8
12
  import {
@@ -11,6 +15,23 @@ import {
11
15
  StorageSubpathStrategy,
12
16
  } from '../../../types/options';
13
17
 
18
+ /**
19
+ * @internal
20
+ */
21
+ export type AWSTemporaryCredentials = Required<
22
+ Pick<
23
+ AWSCredentials,
24
+ 'accessKeyId' | 'secretAccessKey' | 'sessionToken' | 'expiration'
25
+ >
26
+ >;
27
+
28
+ /**
29
+ * @internal
30
+ */
31
+ export type LocationCredentialsProvider = (
32
+ options?: CredentialsProviderOptions,
33
+ ) => Promise<{ credentials: AWSTemporaryCredentials }>;
34
+
14
35
  export interface BucketInfo {
15
36
  bucketName: string;
16
37
  region: string;
@@ -23,6 +44,14 @@ interface CommonOptions {
23
44
  * @default false
24
45
  */
25
46
  useAccelerateEndpoint?: boolean;
47
+
48
+ /**
49
+ * Async function returning AWS credentials for an API call. This function
50
+ * is invoked with S3 locations(bucket and path).
51
+ * If omitted, the global credentials configured in Amplify Auth
52
+ * would be used.
53
+ */
54
+ locationCredentialsProvider?: LocationCredentialsProvider;
26
55
  bucket?: StorageBucket;
27
56
  }
28
57
 
@@ -190,6 +219,11 @@ export type UploadDataOptions = CommonOptions &
190
219
  * @see https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingMetadata.html#UserMetadata
191
220
  */
192
221
  metadata?: Record<string, string>;
222
+ /**
223
+ * Enforces target key does not already exist in S3 before committing upload.
224
+ * @default false
225
+ */
226
+ preventOverwrite?: boolean;
193
227
  };
194
228
 
195
229
  /** @deprecated Use {@link UploadDataOptionsWithPath} instead. */
@@ -0,0 +1,97 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import {
5
+ AmplifyUrl,
6
+ getAmplifyUserAgent,
7
+ } from '@aws-amplify/core/internals/utils';
8
+ import {
9
+ EndpointResolverOptions,
10
+ getDnsSuffix,
11
+ jitteredBackoff,
12
+ } from '@aws-amplify/core/internals/aws-client-utils';
13
+
14
+ import { createRetryDecider, createXmlErrorParser } from '../utils';
15
+
16
+ /**
17
+ * The service name used to sign requests if the API requires authentication.
18
+ */
19
+ export const SERVICE_NAME = 's3';
20
+
21
+ /**
22
+ * Options for endpoint resolver.
23
+ *
24
+ * @internal
25
+ */
26
+ export type S3EndpointResolverOptions = EndpointResolverOptions & {
27
+ /**
28
+ * Fully qualified custom endpoint for S3. If this is set, this endpoint will be used regardless of region.
29
+ */
30
+ customEndpoint?: string;
31
+ };
32
+
33
+ /**
34
+ * The endpoint resolver function that returns the endpoint URL for a given region, and input parameters.
35
+ */
36
+ const endpointResolver = (
37
+ options: S3EndpointResolverOptions,
38
+ apiInput?: { AccountId?: string },
39
+ ) => {
40
+ const { region, customEndpoint } = options;
41
+ const { AccountId: accountId } = apiInput || {};
42
+ let endpoint: URL;
43
+ // 1. get base endpoint
44
+ if (customEndpoint) {
45
+ endpoint = new AmplifyUrl(customEndpoint);
46
+ } else if (accountId) {
47
+ // Control plane operations
48
+ endpoint = new AmplifyUrl(
49
+ `https://${accountId}.s3-control.${region}.${getDnsSuffix(region)}`,
50
+ );
51
+ } else {
52
+ endpoint = new AmplifyUrl(
53
+ `https://s3-control.${region}.${getDnsSuffix(region)}`,
54
+ );
55
+ }
56
+
57
+ return { url: endpoint };
58
+ };
59
+
60
+ /**
61
+ * Error parser for the XML payload of S3 control plane error response. The
62
+ * error's `Code` and `Message` locates at the nested `Error` element instead of
63
+ * the XML root element.
64
+ *
65
+ * @example
66
+ * ```
67
+ * <?xml version="1.0" encoding="UTF-8"?>
68
+ * <ErrorResponse>
69
+ * <Error>
70
+ * <Code>AccessDenied</Code>
71
+ * <Message>Access Denied</Message>
72
+ * </Error>
73
+ * <RequestId>656c76696e6727732072657175657374</RequestId>
74
+ * <HostId>Uuag1LuByRx9e6j5Onimru9pO4ZVKnJ2Qz7/C1NPcfTWAtRPfTaOFg==</HostId>
75
+ * </ErrorResponse>
76
+ * ```
77
+ *
78
+ * @internal
79
+ */
80
+ export const parseXmlError = createXmlErrorParser();
81
+
82
+ /**
83
+ * @internal
84
+ */
85
+ export const retryDecider = createRetryDecider(parseXmlError);
86
+
87
+ /**
88
+ * @internal
89
+ */
90
+ export const defaultConfig = {
91
+ service: SERVICE_NAME,
92
+ endpointResolver,
93
+ retryDecider,
94
+ computeDelay: jitteredBackoff,
95
+ userAgentValue: getAmplifyUserAgent(),
96
+ uriEscapePath: false, // Required by S3. See https://github.com/aws/aws-sdk-js-v3/blob/9ba012dfa3a3429aa2db0f90b3b0b3a7a31f9bc3/packages/signature-v4/src/SignatureV4.ts#L76-L83
97
+ };