@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.
Files changed (361) 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 +20 -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 +59 -14
  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 +45 -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 +59 -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} +1 -1
  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} +2 -2
  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} +14 -9
  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} +1 -1
  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} +7 -2
  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} +1 -1
  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} +1 -1
  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} +1 -1
  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} +1 -1
  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} +2 -1
  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} +2 -1
  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} +3 -2
  64. package/dist/cjs/providers/s3/utils/client/s3data/uploadPart.js.map +1 -0
  65. package/dist/cjs/providers/s3/utils/client/utils/index.js +3 -1
  66. package/dist/cjs/providers/s3/utils/client/utils/index.js.map +1 -1
  67. package/dist/cjs/providers/s3/utils/client/utils/retryDecider.js +61 -0
  68. package/dist/cjs/providers/s3/utils/client/utils/retryDecider.js.map +1 -0
  69. package/dist/cjs/providers/s3/utils/crc32.js +37 -0
  70. package/dist/cjs/providers/s3/utils/crc32.js.map +1 -0
  71. package/dist/cjs/providers/s3/utils/crc32.native.js +11 -0
  72. package/dist/cjs/providers/s3/utils/crc32.native.js.map +1 -0
  73. package/dist/cjs/providers/s3/utils/resolveIdentityId.js +14 -0
  74. package/dist/cjs/providers/s3/utils/resolveIdentityId.js.map +1 -0
  75. package/dist/cjs/providers/s3/utils/resolveS3ConfigAndInput.js +74 -14
  76. package/dist/cjs/providers/s3/utils/resolveS3ConfigAndInput.js.map +1 -1
  77. package/dist/cjs/providers/s3/utils/validateStorageOperationInput.js +4 -1
  78. package/dist/cjs/providers/s3/utils/validateStorageOperationInput.js.map +1 -1
  79. package/dist/cjs/providers/s3/utils/validateStorageOperationInputWithPrefix.js +4 -1
  80. package/dist/cjs/providers/s3/utils/validateStorageOperationInputWithPrefix.js.map +1 -1
  81. package/dist/cjs/storageBrowser/apis/constants.js +9 -0
  82. package/dist/cjs/storageBrowser/apis/constants.js.map +1 -0
  83. package/dist/cjs/storageBrowser/apis/getDataAccess.js +57 -0
  84. package/dist/cjs/storageBrowser/apis/getDataAccess.js.map +1 -0
  85. package/dist/cjs/storageBrowser/apis/listCallerAccessGrants.js +79 -0
  86. package/dist/cjs/storageBrowser/apis/listCallerAccessGrants.js.map +1 -0
  87. package/dist/cjs/storageBrowser/apis/types.js +6 -0
  88. package/dist/cjs/storageBrowser/apis/types.js.map +1 -0
  89. package/dist/cjs/storageBrowser/index.js +11 -0
  90. package/dist/cjs/storageBrowser/index.js.map +1 -0
  91. package/dist/cjs/storageBrowser/locationCredentialsStore/constants.js +9 -0
  92. package/dist/cjs/storageBrowser/locationCredentialsStore/constants.js.map +1 -0
  93. package/dist/cjs/storageBrowser/locationCredentialsStore/create.js +36 -0
  94. package/dist/cjs/storageBrowser/locationCredentialsStore/create.js.map +1 -0
  95. package/dist/cjs/storageBrowser/locationCredentialsStore/index.js +9 -0
  96. package/dist/cjs/storageBrowser/locationCredentialsStore/index.js.map +1 -0
  97. package/dist/cjs/storageBrowser/locationCredentialsStore/registry.js +58 -0
  98. package/dist/cjs/storageBrowser/locationCredentialsStore/registry.js.map +1 -0
  99. package/dist/cjs/storageBrowser/locationCredentialsStore/store.js +99 -0
  100. package/dist/cjs/storageBrowser/locationCredentialsStore/store.js.map +1 -0
  101. package/dist/cjs/storageBrowser/managedAuthConfigAdapter/createListLocationsHandler.js +15 -0
  102. package/dist/cjs/storageBrowser/managedAuthConfigAdapter/createListLocationsHandler.js.map +1 -0
  103. package/dist/cjs/storageBrowser/managedAuthConfigAdapter/createLocationCredentialsHandler.js +29 -0
  104. package/dist/cjs/storageBrowser/managedAuthConfigAdapter/createLocationCredentialsHandler.js.map +1 -0
  105. package/dist/cjs/storageBrowser/managedAuthConfigAdapter/createManagedAuthConfigAdapter.js +32 -0
  106. package/dist/cjs/storageBrowser/managedAuthConfigAdapter/createManagedAuthConfigAdapter.js.map +1 -0
  107. package/dist/cjs/storageBrowser/managedAuthConfigAdapter/index.js +9 -0
  108. package/dist/cjs/storageBrowser/managedAuthConfigAdapter/index.js.map +1 -0
  109. package/dist/cjs/storageBrowser/types.js +6 -0
  110. package/dist/cjs/storageBrowser/types.js.map +1 -0
  111. package/dist/esm/errors/constants.d.ts +1 -0
  112. package/dist/esm/errors/constants.mjs +6 -0
  113. package/dist/esm/errors/constants.mjs.map +1 -0
  114. package/dist/esm/errors/types/validation.d.ts +6 -1
  115. package/dist/esm/errors/types/validation.mjs +20 -0
  116. package/dist/esm/errors/types/validation.mjs.map +1 -1
  117. package/dist/esm/providers/s3/apis/downloadData.mjs +13 -13
  118. package/dist/esm/providers/s3/apis/downloadData.mjs.map +1 -1
  119. package/dist/esm/providers/s3/apis/internal/copy.mjs +69 -24
  120. package/dist/esm/providers/s3/apis/internal/copy.mjs.map +1 -1
  121. package/dist/esm/providers/s3/apis/internal/getProperties.mjs +13 -14
  122. package/dist/esm/providers/s3/apis/internal/getProperties.mjs.map +1 -1
  123. package/dist/esm/providers/s3/apis/internal/getUrl.mjs +13 -13
  124. package/dist/esm/providers/s3/apis/internal/getUrl.mjs.map +1 -1
  125. package/dist/esm/providers/s3/apis/internal/list.mjs +13 -13
  126. package/dist/esm/providers/s3/apis/internal/list.mjs.map +1 -1
  127. package/dist/esm/providers/s3/apis/internal/remove.mjs +13 -14
  128. package/dist/esm/providers/s3/apis/internal/remove.mjs.map +1 -1
  129. package/dist/esm/providers/s3/apis/uploadData/multipart/initialUpload.d.ts +2 -1
  130. package/dist/esm/providers/s3/apis/uploadData/multipart/initialUpload.mjs +32 -12
  131. package/dist/esm/providers/s3/apis/uploadData/multipart/initialUpload.mjs.map +1 -1
  132. package/dist/esm/providers/s3/apis/uploadData/multipart/uploadCache.d.ts +3 -1
  133. package/dist/esm/providers/s3/apis/uploadData/multipart/uploadCache.mjs +13 -12
  134. package/dist/esm/providers/s3/apis/uploadData/multipart/uploadCache.mjs.map +1 -1
  135. package/dist/esm/providers/s3/apis/uploadData/multipart/uploadHandlers.mjs +27 -16
  136. package/dist/esm/providers/s3/apis/uploadData/multipart/uploadHandlers.mjs.map +1 -1
  137. package/dist/esm/providers/s3/apis/uploadData/multipart/uploadPartExecutor.d.ts +3 -2
  138. package/dist/esm/providers/s3/apis/uploadData/multipart/uploadPartExecutor.mjs +27 -18
  139. package/dist/esm/providers/s3/apis/uploadData/multipart/uploadPartExecutor.mjs.map +1 -1
  140. package/dist/esm/providers/s3/apis/uploadData/putObjectJob.mjs +30 -17
  141. package/dist/esm/providers/s3/apis/uploadData/putObjectJob.mjs.map +1 -1
  142. package/dist/esm/providers/s3/apis/uploadData/validateObjectNotExists.d.ts +3 -0
  143. package/dist/esm/providers/s3/apis/uploadData/validateObjectNotExists.mjs +34 -0
  144. package/dist/esm/providers/s3/apis/uploadData/validateObjectNotExists.mjs.map +1 -0
  145. package/dist/esm/providers/s3/types/index.d.ts +1 -1
  146. package/dist/esm/providers/s3/types/inputs.d.ts +5 -2
  147. package/dist/esm/providers/s3/types/options.d.ts +38 -1
  148. package/dist/esm/providers/s3/utils/client/s3control/base.d.ts +31 -0
  149. package/dist/esm/providers/s3/utils/client/s3control/base.mjs +48 -0
  150. package/dist/esm/providers/s3/utils/client/s3control/base.mjs.map +1 -0
  151. package/dist/esm/providers/s3/utils/client/s3control/getDataAccess.d.ts +26 -0
  152. package/dist/esm/providers/s3/utils/client/s3control/getDataAccess.mjs +63 -0
  153. package/dist/esm/providers/s3/utils/client/s3control/getDataAccess.mjs.map +1 -0
  154. package/dist/esm/providers/s3/utils/client/s3control/index.d.ts +2 -0
  155. package/dist/esm/providers/s3/utils/client/s3control/index.mjs +3 -0
  156. package/dist/esm/providers/s3/utils/client/s3control/index.mjs.map +1 -0
  157. package/dist/esm/providers/s3/utils/client/s3control/listCallerAccessGrants.d.ts +26 -0
  158. package/dist/esm/providers/s3/utils/client/s3control/listCallerAccessGrants.mjs +64 -0
  159. package/dist/esm/providers/s3/utils/client/s3control/listCallerAccessGrants.mjs.map +1 -0
  160. package/dist/esm/providers/s3/utils/client/s3control/types.d.ts +176 -0
  161. package/dist/esm/providers/s3/utils/client/{abortMultipartUpload.d.ts → s3data/abortMultipartUpload.d.ts} +4 -4
  162. package/dist/esm/providers/s3/utils/client/{abortMultipartUpload.mjs → s3data/abortMultipartUpload.mjs} +6 -6
  163. package/dist/esm/providers/s3/utils/client/s3data/abortMultipartUpload.mjs.map +1 -0
  164. package/dist/esm/providers/s3/utils/client/{base.d.ts → s3data/base.d.ts} +1 -1
  165. package/dist/esm/providers/s3/utils/client/{base.mjs → s3data/base.mjs} +5 -5
  166. package/dist/esm/providers/s3/utils/client/s3data/base.mjs.map +1 -0
  167. package/dist/esm/providers/s3/utils/client/{completeMultipartUpload.d.ts → s3data/completeMultipartUpload.d.ts} +6 -6
  168. package/dist/esm/providers/s3/utils/client/{completeMultipartUpload.mjs → s3data/completeMultipartUpload.mjs} +20 -14
  169. package/dist/esm/providers/s3/utils/client/s3data/completeMultipartUpload.mjs.map +1 -0
  170. package/dist/esm/providers/s3/utils/client/{copyObject.d.ts → s3data/copyObject.d.ts} +4 -4
  171. package/dist/esm/providers/s3/utils/client/{copyObject.mjs → s3data/copyObject.mjs} +6 -6
  172. package/dist/esm/providers/s3/utils/client/s3data/copyObject.mjs.map +1 -0
  173. package/dist/esm/providers/s3/utils/client/{createMultipartUpload.d.ts → s3data/createMultipartUpload.d.ts} +4 -4
  174. package/dist/esm/providers/s3/utils/client/{createMultipartUpload.mjs → s3data/createMultipartUpload.mjs} +12 -7
  175. package/dist/esm/providers/s3/utils/client/s3data/createMultipartUpload.mjs.map +1 -0
  176. package/dist/esm/providers/s3/utils/client/{deleteObject.d.ts → s3data/deleteObject.d.ts} +4 -4
  177. package/dist/esm/providers/s3/utils/client/{deleteObject.mjs → s3data/deleteObject.mjs} +6 -6
  178. package/dist/esm/providers/s3/utils/client/s3data/deleteObject.mjs.map +1 -0
  179. package/dist/esm/providers/s3/utils/client/{getObject.d.ts → s3data/getObject.d.ts} +4 -4
  180. package/dist/esm/providers/s3/utils/client/{getObject.mjs → s3data/getObject.mjs} +7 -7
  181. package/dist/esm/providers/s3/utils/client/s3data/getObject.mjs.map +1 -0
  182. package/dist/esm/providers/s3/utils/client/{headObject.d.ts → s3data/headObject.d.ts} +4 -4
  183. package/dist/esm/providers/s3/utils/client/{headObject.mjs → s3data/headObject.mjs} +6 -6
  184. package/dist/esm/providers/s3/utils/client/s3data/headObject.mjs.map +1 -0
  185. package/dist/esm/providers/s3/utils/client/{listObjectsV2.d.ts → s3data/listObjectsV2.d.ts} +4 -4
  186. package/dist/esm/providers/s3/utils/client/{listObjectsV2.mjs → s3data/listObjectsV2.mjs} +6 -6
  187. package/dist/esm/providers/s3/utils/client/s3data/listObjectsV2.mjs.map +1 -0
  188. package/dist/esm/providers/s3/utils/client/{listParts.d.ts → s3data/listParts.d.ts} +4 -4
  189. package/dist/esm/providers/s3/utils/client/{listParts.mjs → s3data/listParts.mjs} +7 -6
  190. package/dist/esm/providers/s3/utils/client/s3data/listParts.mjs.map +1 -0
  191. package/dist/esm/providers/s3/utils/client/{putObject.d.ts → s3data/putObject.d.ts} +5 -5
  192. package/dist/esm/providers/s3/utils/client/{putObject.mjs → s3data/putObject.mjs} +7 -6
  193. package/dist/esm/providers/s3/utils/client/s3data/putObject.mjs.map +1 -0
  194. package/dist/esm/providers/s3/utils/client/s3data/types.mjs +2 -0
  195. package/dist/esm/providers/s3/utils/client/s3data/types.mjs.map +1 -0
  196. package/dist/esm/providers/s3/utils/client/{uploadPart.d.ts → s3data/uploadPart.d.ts} +5 -5
  197. package/dist/esm/providers/s3/utils/client/{uploadPart.mjs → s3data/uploadPart.mjs} +8 -7
  198. package/dist/esm/providers/s3/utils/client/s3data/uploadPart.mjs.map +1 -0
  199. package/dist/esm/providers/s3/utils/client/utils/index.d.ts +1 -0
  200. package/dist/esm/providers/s3/utils/client/utils/index.mjs +1 -0
  201. package/dist/esm/providers/s3/utils/client/utils/index.mjs.map +1 -1
  202. package/dist/esm/providers/s3/utils/client/utils/retryDecider.d.ts +13 -0
  203. package/dist/esm/providers/s3/utils/client/utils/retryDecider.mjs +59 -0
  204. package/dist/esm/providers/s3/utils/client/utils/retryDecider.mjs.map +1 -0
  205. package/dist/esm/providers/s3/utils/crc32.d.ts +6 -0
  206. package/dist/esm/providers/s3/utils/crc32.mjs +34 -0
  207. package/dist/esm/providers/s3/utils/crc32.mjs.map +1 -0
  208. package/dist/esm/providers/s3/utils/crc32.native.d.ts +2 -0
  209. package/dist/esm/providers/s3/utils/crc32.native.mjs +8 -0
  210. package/dist/esm/providers/s3/utils/crc32.native.mjs.map +1 -0
  211. package/dist/esm/providers/s3/utils/resolveIdentityId.d.ts +1 -0
  212. package/dist/esm/providers/s3/utils/resolveIdentityId.mjs +12 -0
  213. package/dist/esm/providers/s3/utils/resolveIdentityId.mjs.map +1 -0
  214. package/dist/esm/providers/s3/utils/resolveS3ConfigAndInput.d.ts +11 -2
  215. package/dist/esm/providers/s3/utils/resolveS3ConfigAndInput.mjs +72 -12
  216. package/dist/esm/providers/s3/utils/resolveS3ConfigAndInput.mjs.map +1 -1
  217. package/dist/esm/providers/s3/utils/validateStorageOperationInput.mjs +4 -1
  218. package/dist/esm/providers/s3/utils/validateStorageOperationInput.mjs.map +1 -1
  219. package/dist/esm/providers/s3/utils/validateStorageOperationInputWithPrefix.mjs +4 -1
  220. package/dist/esm/providers/s3/utils/validateStorageOperationInputWithPrefix.mjs.map +1 -1
  221. package/dist/esm/storageBrowser/apis/constants.d.ts +2 -0
  222. package/dist/esm/storageBrowser/apis/constants.mjs +7 -0
  223. package/dist/esm/storageBrowser/apis/constants.mjs.map +1 -0
  224. package/dist/esm/storageBrowser/apis/getDataAccess.d.ts +2 -0
  225. package/dist/esm/storageBrowser/apis/getDataAccess.mjs +57 -0
  226. package/dist/esm/storageBrowser/apis/getDataAccess.mjs.map +1 -0
  227. package/dist/esm/storageBrowser/apis/listCallerAccessGrants.d.ts +2 -0
  228. package/dist/esm/storageBrowser/apis/listCallerAccessGrants.mjs +79 -0
  229. package/dist/esm/storageBrowser/apis/listCallerAccessGrants.mjs.map +1 -0
  230. package/dist/esm/storageBrowser/apis/types.d.ts +18 -0
  231. package/dist/esm/storageBrowser/apis/types.mjs +2 -0
  232. package/dist/esm/storageBrowser/apis/types.mjs.map +1 -0
  233. package/dist/esm/storageBrowser/index.d.ts +6 -0
  234. package/dist/esm/storageBrowser/index.mjs +3 -0
  235. package/dist/esm/storageBrowser/index.mjs.map +1 -0
  236. package/dist/esm/storageBrowser/locationCredentialsStore/constants.d.ts +2 -0
  237. package/dist/esm/storageBrowser/locationCredentialsStore/constants.mjs +7 -0
  238. package/dist/esm/storageBrowser/locationCredentialsStore/constants.mjs.map +1 -0
  239. package/dist/esm/storageBrowser/locationCredentialsStore/create.d.ts +2 -0
  240. package/dist/esm/storageBrowser/locationCredentialsStore/create.mjs +34 -0
  241. package/dist/esm/storageBrowser/locationCredentialsStore/create.mjs.map +1 -0
  242. package/dist/esm/storageBrowser/locationCredentialsStore/index.d.ts +1 -0
  243. package/dist/esm/storageBrowser/locationCredentialsStore/index.mjs +2 -0
  244. package/dist/esm/storageBrowser/locationCredentialsStore/index.mjs.map +1 -0
  245. package/dist/esm/storageBrowser/locationCredentialsStore/registry.d.ts +23 -0
  246. package/dist/esm/storageBrowser/locationCredentialsStore/registry.mjs +54 -0
  247. package/dist/esm/storageBrowser/locationCredentialsStore/registry.mjs.map +1 -0
  248. package/dist/esm/storageBrowser/locationCredentialsStore/store.d.ts +35 -0
  249. package/dist/esm/storageBrowser/locationCredentialsStore/store.mjs +95 -0
  250. package/dist/esm/storageBrowser/locationCredentialsStore/store.mjs.map +1 -0
  251. package/dist/esm/storageBrowser/managedAuthConfigAdapter/createListLocationsHandler.d.ts +8 -0
  252. package/dist/esm/storageBrowser/managedAuthConfigAdapter/createListLocationsHandler.mjs +13 -0
  253. package/dist/esm/storageBrowser/managedAuthConfigAdapter/createListLocationsHandler.mjs.map +1 -0
  254. package/dist/esm/storageBrowser/managedAuthConfigAdapter/createLocationCredentialsHandler.d.ts +8 -0
  255. package/dist/esm/storageBrowser/managedAuthConfigAdapter/createLocationCredentialsHandler.mjs +27 -0
  256. package/dist/esm/storageBrowser/managedAuthConfigAdapter/createLocationCredentialsHandler.mjs.map +1 -0
  257. package/dist/esm/storageBrowser/managedAuthConfigAdapter/createManagedAuthConfigAdapter.d.ts +19 -0
  258. package/dist/esm/storageBrowser/managedAuthConfigAdapter/createManagedAuthConfigAdapter.mjs +30 -0
  259. package/dist/esm/storageBrowser/managedAuthConfigAdapter/createManagedAuthConfigAdapter.mjs.map +1 -0
  260. package/dist/esm/storageBrowser/managedAuthConfigAdapter/index.d.ts +1 -0
  261. package/dist/esm/storageBrowser/managedAuthConfigAdapter/index.mjs +2 -0
  262. package/dist/esm/storageBrowser/managedAuthConfigAdapter/index.mjs.map +1 -0
  263. package/dist/esm/storageBrowser/types.d.ts +92 -0
  264. package/dist/esm/storageBrowser/types.mjs +2 -0
  265. package/dist/esm/storageBrowser/types.mjs.map +1 -0
  266. package/dist/esm/types/inputs.d.ts +3 -3
  267. package/package.json +117 -107
  268. package/src/errors/constants.ts +4 -0
  269. package/src/errors/types/validation.ts +21 -0
  270. package/src/providers/s3/apis/downloadData.ts +2 -2
  271. package/src/providers/s3/apis/internal/copy.ts +77 -23
  272. package/src/providers/s3/apis/internal/getProperties.ts +2 -3
  273. package/src/providers/s3/apis/internal/getUrl.ts +2 -2
  274. package/src/providers/s3/apis/internal/list.ts +3 -3
  275. package/src/providers/s3/apis/internal/remove.ts +2 -3
  276. package/src/providers/s3/apis/uploadData/multipart/initialUpload.ts +30 -1
  277. package/src/providers/s3/apis/uploadData/multipart/uploadCache.ts +4 -1
  278. package/src/providers/s3/apis/uploadData/multipart/uploadHandlers.ts +36 -17
  279. package/src/providers/s3/apis/uploadData/multipart/uploadPartExecutor.ts +23 -7
  280. package/src/providers/s3/apis/uploadData/putObjectJob.ts +22 -5
  281. package/src/providers/s3/apis/uploadData/validateObjectNotExists.ts +25 -0
  282. package/src/providers/s3/types/index.ts +2 -0
  283. package/src/providers/s3/types/inputs.ts +11 -1
  284. package/src/providers/s3/types/options.ts +51 -1
  285. package/src/providers/s3/utils/client/s3control/base.ts +70 -0
  286. package/src/providers/s3/utils/client/s3control/getDataAccess.ts +97 -0
  287. package/src/providers/s3/utils/client/s3control/index.ts +13 -0
  288. package/src/providers/s3/utils/client/s3control/listCallerAccessGrants.ts +104 -0
  289. package/src/providers/s3/utils/client/s3control/types.ts +213 -0
  290. package/src/providers/s3/utils/client/{abortMultipartUpload.ts → s3data/abortMultipartUpload.ts} +4 -3
  291. package/src/providers/s3/utils/client/{base.ts → s3data/base.ts} +2 -3
  292. package/src/providers/s3/utils/client/{completeMultipartUpload.ts → s3data/completeMultipartUpload.ts} +29 -18
  293. package/src/providers/s3/utils/client/{copyObject.ts → s3data/copyObject.ts} +4 -3
  294. package/src/providers/s3/utils/client/{createMultipartUpload.ts → s3data/createMultipartUpload.ts} +15 -8
  295. package/src/providers/s3/utils/client/{deleteObject.ts → s3data/deleteObject.ts} +7 -6
  296. package/src/providers/s3/utils/client/{getObject.ts → s3data/getObject.ts} +8 -7
  297. package/src/providers/s3/utils/client/{headObject.ts → s3data/headObject.ts} +4 -3
  298. package/src/providers/s3/utils/client/{listObjectsV2.ts → s3data/listObjectsV2.ts} +7 -6
  299. package/src/providers/s3/utils/client/{listParts.ts → s3data/listParts.ts} +9 -7
  300. package/src/providers/s3/utils/client/{putObject.ts → s3data/putObject.ts} +6 -3
  301. package/src/providers/s3/utils/client/{uploadPart.ts → s3data/uploadPart.ts} +13 -5
  302. package/src/providers/s3/utils/client/utils/index.ts +1 -0
  303. package/src/providers/s3/utils/client/utils/retryDecider.ts +81 -0
  304. package/src/providers/s3/utils/crc32.native.ts +11 -0
  305. package/src/providers/s3/utils/crc32.ts +51 -0
  306. package/src/providers/s3/utils/resolveIdentityId.ts +11 -0
  307. package/src/providers/s3/utils/resolveS3ConfigAndInput.ts +142 -16
  308. package/src/providers/s3/utils/validateStorageOperationInput.ts +5 -1
  309. package/src/providers/s3/utils/validateStorageOperationInputWithPrefix.ts +5 -1
  310. package/src/storageBrowser/apis/constants.ts +5 -0
  311. package/src/storageBrowser/apis/getDataAccess.ts +79 -0
  312. package/src/storageBrowser/apis/listCallerAccessGrants.ts +107 -0
  313. package/src/storageBrowser/apis/types.ts +33 -0
  314. package/src/storageBrowser/index.ts +25 -0
  315. package/src/storageBrowser/locationCredentialsStore/constants.ts +5 -0
  316. package/src/storageBrowser/locationCredentialsStore/create.ts +54 -0
  317. package/src/storageBrowser/locationCredentialsStore/index.ts +4 -0
  318. package/src/storageBrowser/locationCredentialsStore/registry.ts +88 -0
  319. package/src/storageBrowser/locationCredentialsStore/store.ts +161 -0
  320. package/src/storageBrowser/managedAuthConfigAdapter/createListLocationsHandler.ts +21 -0
  321. package/src/storageBrowser/managedAuthConfigAdapter/createLocationCredentialsHandler.ts +40 -0
  322. package/src/storageBrowser/managedAuthConfigAdapter/createManagedAuthConfigAdapter.ts +53 -0
  323. package/src/storageBrowser/managedAuthConfigAdapter/index.ts +8 -0
  324. package/src/storageBrowser/types.ts +117 -0
  325. package/src/types/inputs.ts +7 -3
  326. package/dist/cjs/providers/s3/utils/client/abortMultipartUpload.js.map +0 -1
  327. package/dist/cjs/providers/s3/utils/client/base.js.map +0 -1
  328. package/dist/cjs/providers/s3/utils/client/completeMultipartUpload.js.map +0 -1
  329. package/dist/cjs/providers/s3/utils/client/copyObject.js.map +0 -1
  330. package/dist/cjs/providers/s3/utils/client/createMultipartUpload.js.map +0 -1
  331. package/dist/cjs/providers/s3/utils/client/deleteObject.js.map +0 -1
  332. package/dist/cjs/providers/s3/utils/client/getObject.js.map +0 -1
  333. package/dist/cjs/providers/s3/utils/client/headObject.js.map +0 -1
  334. package/dist/cjs/providers/s3/utils/client/index.js.map +0 -1
  335. package/dist/cjs/providers/s3/utils/client/listObjectsV2.js.map +0 -1
  336. package/dist/cjs/providers/s3/utils/client/listParts.js.map +0 -1
  337. package/dist/cjs/providers/s3/utils/client/putObject.js.map +0 -1
  338. package/dist/cjs/providers/s3/utils/client/types.js.map +0 -1
  339. package/dist/cjs/providers/s3/utils/client/uploadPart.js.map +0 -1
  340. package/dist/esm/providers/s3/utils/client/abortMultipartUpload.mjs.map +0 -1
  341. package/dist/esm/providers/s3/utils/client/base.mjs.map +0 -1
  342. package/dist/esm/providers/s3/utils/client/completeMultipartUpload.mjs.map +0 -1
  343. package/dist/esm/providers/s3/utils/client/copyObject.mjs.map +0 -1
  344. package/dist/esm/providers/s3/utils/client/createMultipartUpload.mjs.map +0 -1
  345. package/dist/esm/providers/s3/utils/client/deleteObject.mjs.map +0 -1
  346. package/dist/esm/providers/s3/utils/client/getObject.mjs.map +0 -1
  347. package/dist/esm/providers/s3/utils/client/headObject.mjs.map +0 -1
  348. package/dist/esm/providers/s3/utils/client/listObjectsV2.mjs.map +0 -1
  349. package/dist/esm/providers/s3/utils/client/listParts.mjs.map +0 -1
  350. package/dist/esm/providers/s3/utils/client/putObject.mjs.map +0 -1
  351. package/dist/esm/providers/s3/utils/client/uploadPart.mjs.map +0 -1
  352. /package/dist/cjs/providers/s3/utils/client/{types.js → s3control/types.js} +0 -0
  353. /package/dist/cjs/providers/s3/utils/client/{index.js → s3data/index.js} +0 -0
  354. /package/dist/esm/providers/s3/utils/client/{types.mjs → s3control/types.mjs} +0 -0
  355. /package/dist/esm/providers/s3/utils/client/{types.mjs.map → s3control/types.mjs.map} +0 -0
  356. /package/dist/esm/providers/s3/utils/client/{index.d.ts → s3data/index.d.ts} +0 -0
  357. /package/dist/esm/providers/s3/utils/client/{index.mjs → s3data/index.mjs} +0 -0
  358. /package/dist/esm/providers/s3/utils/client/{index.mjs.map → s3data/index.mjs.map} +0 -0
  359. /package/dist/esm/providers/s3/utils/client/{types.d.ts → s3data/types.d.ts} +0 -0
  360. /package/src/providers/s3/utils/client/{index.ts → s3data/index.ts} +0 -0
  361. /package/src/providers/s3/utils/client/{types.ts → s3data/types.ts} +0 -0
@@ -13,12 +13,17 @@ export enum StorageValidationErrorCode {
13
13
  NoDestinationPath = 'NoDestinationPath',
14
14
  NoBucket = 'NoBucket',
15
15
  NoRegion = 'NoRegion',
16
+ InvalidStorageBucket = 'InvalidStorageBucket',
17
+ InvalidCopyOperationStorageBucket = 'InvalidCopyOperationStorageBucket',
16
18
  InvalidStorageOperationPrefixInput = 'InvalidStorageOperationPrefixInput',
17
19
  InvalidStorageOperationInput = 'InvalidStorageOperationInput',
18
20
  InvalidStoragePathInput = 'InvalidStoragePathInput',
19
21
  InvalidUploadSource = 'InvalidUploadSource',
20
22
  ObjectIsTooLarge = 'ObjectIsTooLarge',
21
23
  UrlExpirationMaxLimitExceed = 'UrlExpirationMaxLimitExceed',
24
+ InvalidLocationCredentialsCacheSize = 'InvalidLocationCredentialsCacheSize',
25
+ LocationCredentialsStoreDestroyed = 'LocationCredentialsStoreDestroyed',
26
+ InvalidS3Uri = 'InvalidS3Uri',
22
27
  }
23
28
 
24
29
  export const validationErrorMap: AmplifyErrorMap<StorageValidationErrorCode> = {
@@ -70,4 +75,20 @@ export const validationErrorMap: AmplifyErrorMap<StorageValidationErrorCode> = {
70
75
  [StorageValidationErrorCode.InvalidStoragePathInput]: {
71
76
  message: 'Input `path` does not allow a leading slash (/).',
72
77
  },
78
+ [StorageValidationErrorCode.InvalidLocationCredentialsCacheSize]: {
79
+ message: 'locationCredentialsCacheSize must be a positive integer.',
80
+ },
81
+ [StorageValidationErrorCode.LocationCredentialsStoreDestroyed]: {
82
+ message: `Location-specific credentials store has been destroyed.`,
83
+ },
84
+ [StorageValidationErrorCode.InvalidS3Uri]: {
85
+ message: 'Invalid S3 URI.',
86
+ },
87
+ [StorageValidationErrorCode.InvalidStorageBucket]: {
88
+ message:
89
+ 'Unable to lookup bucket from provided name in Amplify configuration.',
90
+ },
91
+ [StorageValidationErrorCode.InvalidCopyOperationStorageBucket]: {
92
+ message: 'Missing bucket option in either source or destination.',
93
+ },
73
94
  };
@@ -12,7 +12,7 @@ import {
12
12
  } from '../types';
13
13
  import { resolveS3ConfigAndInput } from '../utils/resolveS3ConfigAndInput';
14
14
  import { createDownloadTask, validateStorageOperationInput } from '../utils';
15
- import { getObject } from '../utils/client';
15
+ import { getObject } from '../utils/client/s3data';
16
16
  import { getStorageUserAgentValue } from '../utils/userAgent';
17
17
  import { logger } from '../../../utils';
18
18
  import {
@@ -115,7 +115,7 @@ const downloadDataJob =
115
115
  > => {
116
116
  const { options: downloadDataOptions } = downloadDataInput;
117
117
  const { bucket, keyPrefix, s3Config, identityId } =
118
- await resolveS3ConfigAndInput(Amplify, downloadDataOptions);
118
+ await resolveS3ConfigAndInput(Amplify, downloadDataInput);
119
119
  const { inputType, objectKey } = validateStorageOperationInput(
120
120
  downloadDataInput,
121
121
  identityId,
@@ -10,7 +10,7 @@ import {
10
10
  CopyWithPathInput,
11
11
  CopyWithPathOutput,
12
12
  } from '../../types';
13
- import { ResolvedS3Config } from '../../types/options';
13
+ import { ResolvedS3Config, StorageBucket } from '../../types/options';
14
14
  import {
15
15
  isInputWithPath,
16
16
  resolveS3ConfigAndInput,
@@ -18,7 +18,7 @@ import {
18
18
  } from '../../utils';
19
19
  import { StorageValidationErrorCode } from '../../../../errors/types/validation';
20
20
  import { assertValidationError } from '../../../../errors/utils/assertValidationError';
21
- import { copyObject } from '../../utils/client';
21
+ import { copyObject } from '../../utils/client/s3data';
22
22
  import { getStorageUserAgentValue } from '../../utils/userAgent';
23
23
  import { logger } from '../../../../utils';
24
24
 
@@ -26,6 +26,22 @@ const isCopyInputWithPath = (
26
26
  input: CopyInput | CopyWithPathInput,
27
27
  ): input is CopyWithPathInput => isInputWithPath(input.source);
28
28
 
29
+ const storageBucketAssertion = (
30
+ sourceBucket?: StorageBucket,
31
+ destBucket?: StorageBucket,
32
+ ) => {
33
+ /** For multi-bucket, both source and destination bucket needs to be passed in
34
+ * or both can be undefined and we fallback to singleton's default value
35
+ */
36
+ assertValidationError(
37
+ // Both src & dest bucket option is present is acceptable
38
+ (sourceBucket !== undefined && destBucket !== undefined) ||
39
+ // or both are undefined is also acceptable
40
+ (!destBucket && !sourceBucket),
41
+ StorageValidationErrorCode.InvalidCopyOperationStorageBucket,
42
+ );
43
+ };
44
+
29
45
  export const copy = async (
30
46
  amplify: AmplifyClassV6,
31
47
  input: CopyInput | CopyWithPathInput,
@@ -40,8 +56,30 @@ const copyWithPath = async (
40
56
  input: CopyWithPathInput,
41
57
  ): Promise<CopyWithPathOutput> => {
42
58
  const { source, destination } = input;
43
- const { s3Config, bucket, identityId } =
44
- await resolveS3ConfigAndInput(amplify);
59
+
60
+ storageBucketAssertion(source.bucket, destination.bucket);
61
+
62
+ const { bucket: sourceBucket } = await resolveS3ConfigAndInput(amplify, {
63
+ path: input.source.path,
64
+ options: {
65
+ locationCredentialsProvider: input.options?.locationCredentialsProvider,
66
+ ...input.source,
67
+ },
68
+ });
69
+
70
+ // The bucket, region, credentials of s3 client are resolved from destination.
71
+ // Whereas the source bucket and path are a input parameter of S3 copy operation.
72
+ const {
73
+ s3Config,
74
+ bucket: destBucket,
75
+ identityId,
76
+ } = await resolveS3ConfigAndInput(amplify, {
77
+ path: input.destination.path,
78
+ options: {
79
+ locationCredentialsProvider: input.options?.locationCredentialsProvider,
80
+ ...input.destination,
81
+ },
82
+ }); // resolveS3ConfigAndInput does not make extra API calls or storage access if called repeatedly.
45
83
 
46
84
  assertValidationError(!!source.path, StorageValidationErrorCode.NoSourcePath);
47
85
  assertValidationError(
@@ -58,14 +96,14 @@ const copyWithPath = async (
58
96
  identityId,
59
97
  );
60
98
 
61
- const finalCopySource = `${bucket}/${sourcePath}`;
99
+ const finalCopySource = `${sourceBucket}/${sourcePath}`;
62
100
  const finalCopyDestination = destinationPath;
63
101
  logger.debug(`copying "${finalCopySource}" to "${finalCopyDestination}".`);
64
102
 
65
103
  await serviceCopy({
66
104
  source: finalCopySource,
67
105
  destination: finalCopyDestination,
68
- bucket,
106
+ bucket: destBucket,
69
107
  s3Config,
70
108
  });
71
109
 
@@ -77,41 +115,57 @@ export const copyWithKey = async (
77
115
  amplify: AmplifyClassV6,
78
116
  input: CopyInput,
79
117
  ): Promise<CopyOutput> => {
80
- const {
81
- source: { key: sourceKey },
82
- destination: { key: destinationKey },
83
- } = input;
118
+ const { source, destination } = input;
84
119
 
85
- assertValidationError(!!sourceKey, StorageValidationErrorCode.NoSourceKey);
120
+ storageBucketAssertion(source.bucket, destination.bucket);
121
+
122
+ assertValidationError(!!source.key, StorageValidationErrorCode.NoSourceKey);
86
123
  assertValidationError(
87
- !!destinationKey,
124
+ !!destination.key,
88
125
  StorageValidationErrorCode.NoDestinationKey,
89
126
  );
90
127
 
128
+ const { bucket: sourceBucket, keyPrefix: sourceKeyPrefix } =
129
+ await resolveS3ConfigAndInput(amplify, {
130
+ ...input,
131
+ options: {
132
+ // @ts-expect-error: 'options' does not exist on type 'CopyInput'. In case of JS users set the location
133
+ // credentials provider option, resolveS3ConfigAndInput will throw validation error.
134
+ locationCredentialsProvider: input.options?.locationCredentialsProvider,
135
+ ...input.source,
136
+ },
137
+ });
138
+
139
+ // The bucket, region, credentials of s3 client are resolved from destination.
140
+ // Whereas the source bucket and path are a input parameter of S3 copy operation.
91
141
  const {
92
142
  s3Config,
93
- bucket,
94
- keyPrefix: sourceKeyPrefix,
95
- } = await resolveS3ConfigAndInput(amplify, input.source);
96
- const { keyPrefix: destinationKeyPrefix } = await resolveS3ConfigAndInput(
97
- amplify,
98
- input.destination,
99
- ); // resolveS3ConfigAndInput does not make extra API calls or storage access if called repeatedly.
143
+ bucket: destBucket,
144
+ keyPrefix: destinationKeyPrefix,
145
+ } = await resolveS3ConfigAndInput(amplify, {
146
+ ...input,
147
+ options: {
148
+ // @ts-expect-error: 'options' does not exist on type 'CopyInput'. In case of JS users set the location
149
+ // credentials provider option, resolveS3ConfigAndInput will throw validation error.
150
+ locationCredentialsProvider: input.options?.locationCredentialsProvider,
151
+ ...input.destination,
152
+ },
153
+ }); // resolveS3ConfigAndInput does not make extra API calls or storage access if called repeatedly.
100
154
 
101
155
  // TODO(ashwinkumar6) V6-logger: warn `You may copy files from another user if the source level is "protected", currently it's ${srcLevel}`
102
- const finalCopySource = `${bucket}/${sourceKeyPrefix}${sourceKey}`;
103
- const finalCopyDestination = `${destinationKeyPrefix}${destinationKey}`;
156
+ const finalCopySource = `${sourceBucket}/${sourceKeyPrefix}${source.key}`;
157
+ const finalCopyDestination = `${destinationKeyPrefix}${destination.key}`;
104
158
  logger.debug(`copying "${finalCopySource}" to "${finalCopyDestination}".`);
105
159
 
106
160
  await serviceCopy({
107
161
  source: finalCopySource,
108
162
  destination: finalCopyDestination,
109
- bucket,
163
+ bucket: destBucket,
110
164
  s3Config,
111
165
  });
112
166
 
113
167
  return {
114
- key: destinationKey,
168
+ key: destination.key,
115
169
  };
116
170
  };
117
171
 
@@ -14,7 +14,7 @@ import {
14
14
  resolveS3ConfigAndInput,
15
15
  validateStorageOperationInput,
16
16
  } from '../../utils';
17
- import { headObject } from '../../utils/client';
17
+ import { headObject } 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';
@@ -24,9 +24,8 @@ export const getProperties = async (
24
24
  input: GetPropertiesInput | GetPropertiesWithPathInput,
25
25
  action?: StorageAction,
26
26
  ): Promise<GetPropertiesOutput | GetPropertiesWithPathOutput> => {
27
- const { options: getPropertiesOptions } = input;
28
27
  const { s3Config, bucket, keyPrefix, identityId } =
29
- await resolveS3ConfigAndInput(amplify, getPropertiesOptions);
28
+ await resolveS3ConfigAndInput(amplify, input);
30
29
  const { inputType, objectKey } = validateStorageOperationInput(
31
30
  input,
32
31
  identityId,
@@ -11,7 +11,7 @@ import {
11
11
  GetUrlWithPathOutput,
12
12
  } from '../../types';
13
13
  import { StorageValidationErrorCode } from '../../../../errors/types/validation';
14
- import { getPresignedGetObjectUrl } from '../../utils/client';
14
+ import { getPresignedGetObjectUrl } from '../../utils/client/s3data';
15
15
  import {
16
16
  resolveS3ConfigAndInput,
17
17
  validateStorageOperationInput,
@@ -32,7 +32,7 @@ export const getUrl = async (
32
32
  ): Promise<GetUrlOutput | GetUrlWithPathOutput> => {
33
33
  const { options: getUrlOptions } = input;
34
34
  const { s3Config, keyPrefix, bucket, identityId } =
35
- await resolveS3ConfigAndInput(amplify, getUrlOptions);
35
+ await resolveS3ConfigAndInput(amplify, input);
36
36
  const { inputType, objectKey } = validateStorageOperationInput(
37
37
  input,
38
38
  identityId,
@@ -29,11 +29,11 @@ import {
29
29
  ListObjectsV2Input,
30
30
  ListObjectsV2Output,
31
31
  listObjectsV2,
32
- } from '../../utils/client';
32
+ } from '../../utils/client/s3data';
33
33
  import { getStorageUserAgentValue } from '../../utils/userAgent';
34
34
  import { logger } from '../../../../utils';
35
35
  import { DEFAULT_DELIMITER, STORAGE_INPUT_PREFIX } from '../../utils/constants';
36
- import { CommonPrefix } from '../../utils/client/types';
36
+ import { CommonPrefix } from '../../utils/client/s3data/types';
37
37
 
38
38
  const MAX_PAGE_SIZE = 1000;
39
39
 
@@ -62,7 +62,7 @@ export const list = async (
62
62
  bucket,
63
63
  keyPrefix: generatedPrefix,
64
64
  identityId,
65
- } = await resolveS3ConfigAndInput(amplify, options);
65
+ } = await resolveS3ConfigAndInput(amplify, input);
66
66
 
67
67
  const { inputType, objectKey } = validateStorageOperationInputWithPrefix(
68
68
  input,
@@ -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
  };