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