@aws-amplify/storage 6.6.5 → 6.6.6-storage-browser.4949269.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (369) hide show
  1. package/dist/cjs/errors/constants.js +8 -0
  2. package/dist/cjs/errors/constants.js.map +1 -0
  3. package/dist/cjs/errors/types/validation.js +12 -0
  4. package/dist/cjs/errors/types/validation.js.map +1 -1
  5. package/dist/cjs/providers/s3/apis/downloadData.js +3 -3
  6. package/dist/cjs/providers/s3/apis/downloadData.js.map +1 -1
  7. package/dist/cjs/providers/s3/apis/internal/copy.js +38 -6
  8. package/dist/cjs/providers/s3/apis/internal/copy.js.map +1 -1
  9. package/dist/cjs/providers/s3/apis/internal/getProperties.js +3 -4
  10. package/dist/cjs/providers/s3/apis/internal/getProperties.js.map +1 -1
  11. package/dist/cjs/providers/s3/apis/internal/getUrl.js +3 -3
  12. package/dist/cjs/providers/s3/apis/internal/getUrl.js.map +1 -1
  13. package/dist/cjs/providers/s3/apis/internal/list.js +4 -4
  14. package/dist/cjs/providers/s3/apis/internal/list.js.map +1 -1
  15. package/dist/cjs/providers/s3/apis/internal/remove.js +3 -4
  16. package/dist/cjs/providers/s3/apis/internal/remove.js.map +1 -1
  17. package/dist/cjs/providers/s3/apis/uploadData/multipart/initialUpload.js +22 -2
  18. package/dist/cjs/providers/s3/apis/uploadData/multipart/initialUpload.js.map +1 -1
  19. package/dist/cjs/providers/s3/apis/uploadData/multipart/uploadCache.js +3 -2
  20. package/dist/cjs/providers/s3/apis/uploadData/multipart/uploadCache.js.map +1 -1
  21. package/dist/cjs/providers/s3/apis/uploadData/multipart/uploadHandlers.js +19 -8
  22. package/dist/cjs/providers/s3/apis/uploadData/multipart/uploadHandlers.js.map +1 -1
  23. package/dist/cjs/providers/s3/apis/uploadData/multipart/uploadPartExecutor.js +20 -11
  24. package/dist/cjs/providers/s3/apis/uploadData/multipart/uploadPartExecutor.js.map +1 -1
  25. package/dist/cjs/providers/s3/apis/uploadData/putObjectJob.js +20 -7
  26. package/dist/cjs/providers/s3/apis/uploadData/putObjectJob.js.map +1 -1
  27. package/dist/cjs/providers/s3/apis/uploadData/validateObjectNotExists.js +25 -0
  28. package/dist/cjs/providers/s3/apis/uploadData/validateObjectNotExists.js.map +1 -0
  29. package/dist/cjs/providers/s3/utils/client/s3control/base.js +70 -0
  30. package/dist/cjs/providers/s3/utils/client/s3control/base.js.map +1 -0
  31. package/dist/cjs/providers/s3/utils/client/s3control/getDataAccess.js +58 -0
  32. package/dist/cjs/providers/s3/utils/client/s3control/getDataAccess.js.map +1 -0
  33. package/dist/cjs/providers/s3/utils/client/s3control/index.js +11 -0
  34. package/dist/cjs/providers/s3/utils/client/s3control/index.js.map +1 -0
  35. package/dist/cjs/providers/s3/utils/client/s3control/listCallerAccessGrants.js +63 -0
  36. package/dist/cjs/providers/s3/utils/client/s3control/listCallerAccessGrants.js.map +1 -0
  37. package/dist/cjs/providers/s3/utils/client/s3control/types.js.map +1 -0
  38. package/dist/cjs/providers/s3/utils/client/{abortMultipartUpload.js → s3data/abortMultipartUpload.js} +2 -2
  39. package/dist/cjs/providers/s3/utils/client/s3data/abortMultipartUpload.js.map +1 -0
  40. package/dist/cjs/providers/s3/utils/client/{base.js → s3data/base.js} +25 -3
  41. package/dist/cjs/providers/s3/utils/client/s3data/base.js.map +1 -0
  42. package/dist/cjs/providers/s3/utils/client/{completeMultipartUpload.js → s3data/completeMultipartUpload.js} +16 -11
  43. package/dist/cjs/providers/s3/utils/client/s3data/completeMultipartUpload.js.map +1 -0
  44. package/dist/cjs/providers/s3/utils/client/{copyObject.js → s3data/copyObject.js} +2 -2
  45. package/dist/cjs/providers/s3/utils/client/s3data/copyObject.js.map +1 -0
  46. package/dist/cjs/providers/s3/utils/client/{createMultipartUpload.js → s3data/createMultipartUpload.js} +8 -3
  47. package/dist/cjs/providers/s3/utils/client/s3data/createMultipartUpload.js.map +1 -0
  48. package/dist/cjs/providers/s3/utils/client/{deleteObject.js → s3data/deleteObject.js} +2 -2
  49. package/dist/cjs/providers/s3/utils/client/s3data/deleteObject.js.map +1 -0
  50. package/dist/cjs/providers/s3/utils/client/{getObject.js → s3data/getObject.js} +3 -3
  51. package/dist/cjs/providers/s3/utils/client/s3data/getObject.js.map +1 -0
  52. package/dist/cjs/providers/s3/utils/client/{headObject.js → s3data/headObject.js} +2 -2
  53. package/dist/cjs/providers/s3/utils/client/s3data/headObject.js.map +1 -0
  54. package/dist/cjs/providers/s3/utils/client/s3data/index.js.map +1 -0
  55. package/dist/cjs/providers/s3/utils/client/{listObjectsV2.js → s3data/listObjectsV2.js} +2 -2
  56. package/dist/cjs/providers/s3/utils/client/s3data/listObjectsV2.js.map +1 -0
  57. package/dist/cjs/providers/s3/utils/client/{listParts.js → s3data/listParts.js} +3 -2
  58. package/dist/cjs/providers/s3/utils/client/s3data/listParts.js.map +1 -0
  59. package/dist/cjs/providers/s3/utils/client/{putObject.js → s3data/putObject.js} +3 -2
  60. package/dist/cjs/providers/s3/utils/client/s3data/putObject.js.map +1 -0
  61. package/dist/cjs/providers/s3/utils/client/s3data/types.js +6 -0
  62. package/dist/cjs/providers/s3/utils/client/s3data/types.js.map +1 -0
  63. package/dist/cjs/providers/s3/utils/client/{uploadPart.js → s3data/uploadPart.js} +4 -3
  64. package/dist/cjs/providers/s3/utils/client/s3data/uploadPart.js.map +1 -0
  65. package/dist/cjs/providers/s3/utils/client/utils/createRetryDecider.js +57 -0
  66. package/dist/cjs/providers/s3/utils/client/utils/createRetryDecider.js.map +1 -0
  67. package/dist/cjs/providers/s3/utils/client/utils/deserializeHelpers.js +34 -1
  68. package/dist/cjs/providers/s3/utils/client/utils/deserializeHelpers.js.map +1 -1
  69. package/dist/cjs/providers/s3/utils/client/utils/index.js +4 -2
  70. package/dist/cjs/providers/s3/utils/client/utils/index.js.map +1 -1
  71. package/dist/cjs/providers/s3/utils/client/utils/parsePayload.js +20 -6
  72. package/dist/cjs/providers/s3/utils/client/utils/parsePayload.js.map +1 -1
  73. package/dist/cjs/providers/s3/utils/crc32.js +37 -0
  74. package/dist/cjs/providers/s3/utils/crc32.js.map +1 -0
  75. package/dist/cjs/providers/s3/utils/crc32.native.js +11 -0
  76. package/dist/cjs/providers/s3/utils/crc32.native.js.map +1 -0
  77. package/dist/cjs/providers/s3/utils/resolveIdentityId.js +14 -0
  78. package/dist/cjs/providers/s3/utils/resolveIdentityId.js.map +1 -0
  79. package/dist/cjs/providers/s3/utils/resolveS3ConfigAndInput.js +59 -13
  80. package/dist/cjs/providers/s3/utils/resolveS3ConfigAndInput.js.map +1 -1
  81. package/dist/cjs/providers/s3/utils/validateStorageOperationInput.js +4 -1
  82. package/dist/cjs/providers/s3/utils/validateStorageOperationInput.js.map +1 -1
  83. package/dist/cjs/providers/s3/utils/validateStorageOperationInputWithPrefix.js +4 -1
  84. package/dist/cjs/providers/s3/utils/validateStorageOperationInputWithPrefix.js.map +1 -1
  85. package/dist/cjs/storageBrowser/apis/constants.js +9 -0
  86. package/dist/cjs/storageBrowser/apis/constants.js.map +1 -0
  87. package/dist/cjs/storageBrowser/apis/getDataAccess.js +57 -0
  88. package/dist/cjs/storageBrowser/apis/getDataAccess.js.map +1 -0
  89. package/dist/cjs/storageBrowser/apis/listCallerAccessGrants.js +69 -0
  90. package/dist/cjs/storageBrowser/apis/listCallerAccessGrants.js.map +1 -0
  91. package/dist/cjs/storageBrowser/apis/types.js +6 -0
  92. package/dist/cjs/storageBrowser/apis/types.js.map +1 -0
  93. package/dist/cjs/storageBrowser/index.js +11 -0
  94. package/dist/cjs/storageBrowser/index.js.map +1 -0
  95. package/dist/cjs/storageBrowser/locationCredentialsStore/constants.js +9 -0
  96. package/dist/cjs/storageBrowser/locationCredentialsStore/constants.js.map +1 -0
  97. package/dist/cjs/storageBrowser/locationCredentialsStore/create.js +36 -0
  98. package/dist/cjs/storageBrowser/locationCredentialsStore/create.js.map +1 -0
  99. package/dist/cjs/storageBrowser/locationCredentialsStore/index.js +9 -0
  100. package/dist/cjs/storageBrowser/locationCredentialsStore/index.js.map +1 -0
  101. package/dist/cjs/storageBrowser/locationCredentialsStore/registry.js +58 -0
  102. package/dist/cjs/storageBrowser/locationCredentialsStore/registry.js.map +1 -0
  103. package/dist/cjs/storageBrowser/locationCredentialsStore/store.js +99 -0
  104. package/dist/cjs/storageBrowser/locationCredentialsStore/store.js.map +1 -0
  105. package/dist/cjs/storageBrowser/managedAuthConfigAdapter/createListLocationsHandler.js +15 -0
  106. package/dist/cjs/storageBrowser/managedAuthConfigAdapter/createListLocationsHandler.js.map +1 -0
  107. package/dist/cjs/storageBrowser/managedAuthConfigAdapter/createLocationCredentialsHandler.js +29 -0
  108. package/dist/cjs/storageBrowser/managedAuthConfigAdapter/createLocationCredentialsHandler.js.map +1 -0
  109. package/dist/cjs/storageBrowser/managedAuthConfigAdapter/createManagedAuthConfigAdapter.js +32 -0
  110. package/dist/cjs/storageBrowser/managedAuthConfigAdapter/createManagedAuthConfigAdapter.js.map +1 -0
  111. package/dist/cjs/storageBrowser/managedAuthConfigAdapter/index.js +9 -0
  112. package/dist/cjs/storageBrowser/managedAuthConfigAdapter/index.js.map +1 -0
  113. package/dist/cjs/storageBrowser/types.js +6 -0
  114. package/dist/cjs/storageBrowser/types.js.map +1 -0
  115. package/dist/esm/errors/constants.d.ts +1 -0
  116. package/dist/esm/errors/constants.mjs +6 -0
  117. package/dist/esm/errors/constants.mjs.map +1 -0
  118. package/dist/esm/errors/types/validation.d.ts +4 -1
  119. package/dist/esm/errors/types/validation.mjs +12 -0
  120. package/dist/esm/errors/types/validation.mjs.map +1 -1
  121. package/dist/esm/providers/s3/apis/downloadData.mjs +13 -13
  122. package/dist/esm/providers/s3/apis/downloadData.mjs.map +1 -1
  123. package/dist/esm/providers/s3/apis/internal/copy.mjs +48 -16
  124. package/dist/esm/providers/s3/apis/internal/copy.mjs.map +1 -1
  125. package/dist/esm/providers/s3/apis/internal/getProperties.mjs +13 -14
  126. package/dist/esm/providers/s3/apis/internal/getProperties.mjs.map +1 -1
  127. package/dist/esm/providers/s3/apis/internal/getUrl.mjs +13 -13
  128. package/dist/esm/providers/s3/apis/internal/getUrl.mjs.map +1 -1
  129. package/dist/esm/providers/s3/apis/internal/list.mjs +13 -13
  130. package/dist/esm/providers/s3/apis/internal/list.mjs.map +1 -1
  131. package/dist/esm/providers/s3/apis/internal/remove.mjs +13 -14
  132. package/dist/esm/providers/s3/apis/internal/remove.mjs.map +1 -1
  133. package/dist/esm/providers/s3/apis/uploadData/multipart/initialUpload.d.ts +2 -1
  134. package/dist/esm/providers/s3/apis/uploadData/multipart/initialUpload.mjs +32 -12
  135. package/dist/esm/providers/s3/apis/uploadData/multipart/initialUpload.mjs.map +1 -1
  136. package/dist/esm/providers/s3/apis/uploadData/multipart/uploadCache.d.ts +3 -1
  137. package/dist/esm/providers/s3/apis/uploadData/multipart/uploadCache.mjs +13 -12
  138. package/dist/esm/providers/s3/apis/uploadData/multipart/uploadCache.mjs.map +1 -1
  139. package/dist/esm/providers/s3/apis/uploadData/multipart/uploadHandlers.mjs +27 -16
  140. package/dist/esm/providers/s3/apis/uploadData/multipart/uploadHandlers.mjs.map +1 -1
  141. package/dist/esm/providers/s3/apis/uploadData/multipart/uploadPartExecutor.d.ts +3 -2
  142. package/dist/esm/providers/s3/apis/uploadData/multipart/uploadPartExecutor.mjs +27 -18
  143. package/dist/esm/providers/s3/apis/uploadData/multipart/uploadPartExecutor.mjs.map +1 -1
  144. package/dist/esm/providers/s3/apis/uploadData/putObjectJob.mjs +30 -17
  145. package/dist/esm/providers/s3/apis/uploadData/putObjectJob.mjs.map +1 -1
  146. package/dist/esm/providers/s3/apis/uploadData/validateObjectNotExists.d.ts +3 -0
  147. package/dist/esm/providers/s3/apis/uploadData/validateObjectNotExists.mjs +34 -0
  148. package/dist/esm/providers/s3/apis/uploadData/validateObjectNotExists.mjs.map +1 -0
  149. package/dist/esm/providers/s3/types/inputs.d.ts +5 -1
  150. package/dist/esm/providers/s3/types/options.d.ts +24 -1
  151. package/dist/esm/providers/s3/utils/client/s3control/base.d.ts +56 -0
  152. package/dist/esm/providers/s3/utils/client/s3control/base.mjs +74 -0
  153. package/dist/esm/providers/s3/utils/client/s3control/base.mjs.map +1 -0
  154. package/dist/esm/providers/s3/utils/client/s3control/getDataAccess.d.ts +26 -0
  155. package/dist/esm/providers/s3/utils/client/s3control/getDataAccess.mjs +63 -0
  156. package/dist/esm/providers/s3/utils/client/s3control/getDataAccess.mjs.map +1 -0
  157. package/dist/esm/providers/s3/utils/client/s3control/index.d.ts +2 -0
  158. package/dist/esm/providers/s3/utils/client/s3control/index.mjs +3 -0
  159. package/dist/esm/providers/s3/utils/client/s3control/index.mjs.map +1 -0
  160. package/dist/esm/providers/s3/utils/client/s3control/listCallerAccessGrants.d.ts +26 -0
  161. package/dist/esm/providers/s3/utils/client/s3control/listCallerAccessGrants.mjs +67 -0
  162. package/dist/esm/providers/s3/utils/client/s3control/listCallerAccessGrants.mjs.map +1 -0
  163. package/dist/esm/providers/s3/utils/client/s3control/types.d.ts +188 -0
  164. package/dist/esm/providers/s3/utils/client/{abortMultipartUpload.d.ts → s3data/abortMultipartUpload.d.ts} +4 -4
  165. package/dist/esm/providers/s3/utils/client/{abortMultipartUpload.mjs → s3data/abortMultipartUpload.mjs} +5 -6
  166. package/dist/esm/providers/s3/utils/client/s3data/abortMultipartUpload.mjs.map +1 -0
  167. package/dist/esm/providers/s3/utils/client/{base.d.ts → s3data/base.d.ts} +23 -1
  168. package/dist/esm/providers/s3/utils/client/{base.mjs → s3data/base.mjs} +29 -6
  169. package/dist/esm/providers/s3/utils/client/s3data/base.mjs.map +1 -0
  170. package/dist/esm/providers/s3/utils/client/{completeMultipartUpload.d.ts → s3data/completeMultipartUpload.d.ts} +6 -6
  171. package/dist/esm/providers/s3/utils/client/{completeMultipartUpload.mjs → s3data/completeMultipartUpload.mjs} +19 -14
  172. package/dist/esm/providers/s3/utils/client/s3data/completeMultipartUpload.mjs.map +1 -0
  173. package/dist/esm/providers/s3/utils/client/{copyObject.d.ts → s3data/copyObject.d.ts} +4 -4
  174. package/dist/esm/providers/s3/utils/client/{copyObject.mjs → s3data/copyObject.mjs} +6 -6
  175. package/dist/esm/providers/s3/utils/client/s3data/copyObject.mjs.map +1 -0
  176. package/dist/esm/providers/s3/utils/client/{createMultipartUpload.d.ts → s3data/createMultipartUpload.d.ts} +4 -4
  177. package/dist/esm/providers/s3/utils/client/{createMultipartUpload.mjs → s3data/createMultipartUpload.mjs} +12 -7
  178. package/dist/esm/providers/s3/utils/client/s3data/createMultipartUpload.mjs.map +1 -0
  179. package/dist/esm/providers/s3/utils/client/{deleteObject.d.ts → s3data/deleteObject.d.ts} +4 -4
  180. package/dist/esm/providers/s3/utils/client/{deleteObject.mjs → s3data/deleteObject.mjs} +5 -6
  181. package/dist/esm/providers/s3/utils/client/s3data/deleteObject.mjs.map +1 -0
  182. package/dist/esm/providers/s3/utils/client/{getObject.d.ts → s3data/getObject.d.ts} +4 -4
  183. package/dist/esm/providers/s3/utils/client/{getObject.mjs → s3data/getObject.mjs} +7 -8
  184. package/dist/esm/providers/s3/utils/client/s3data/getObject.mjs.map +1 -0
  185. package/dist/esm/providers/s3/utils/client/{headObject.d.ts → s3data/headObject.d.ts} +4 -4
  186. package/dist/esm/providers/s3/utils/client/{headObject.mjs → s3data/headObject.mjs} +5 -6
  187. package/dist/esm/providers/s3/utils/client/s3data/headObject.mjs.map +1 -0
  188. package/dist/esm/providers/s3/utils/client/{listObjectsV2.d.ts → s3data/listObjectsV2.d.ts} +4 -4
  189. package/dist/esm/providers/s3/utils/client/{listObjectsV2.mjs → s3data/listObjectsV2.mjs} +6 -6
  190. package/dist/esm/providers/s3/utils/client/s3data/listObjectsV2.mjs.map +1 -0
  191. package/dist/esm/providers/s3/utils/client/{listParts.d.ts → s3data/listParts.d.ts} +4 -4
  192. package/dist/esm/providers/s3/utils/client/{listParts.mjs → s3data/listParts.mjs} +7 -6
  193. package/dist/esm/providers/s3/utils/client/s3data/listParts.mjs.map +1 -0
  194. package/dist/esm/providers/s3/utils/client/{putObject.d.ts → s3data/putObject.d.ts} +5 -5
  195. package/dist/esm/providers/s3/utils/client/{putObject.mjs → s3data/putObject.mjs} +6 -6
  196. package/dist/esm/providers/s3/utils/client/s3data/putObject.mjs.map +1 -0
  197. package/dist/esm/providers/s3/utils/client/s3data/types.mjs +2 -0
  198. package/dist/esm/providers/s3/utils/client/s3data/types.mjs.map +1 -0
  199. package/dist/esm/providers/s3/utils/client/{uploadPart.d.ts → s3data/uploadPart.d.ts} +5 -5
  200. package/dist/esm/providers/s3/utils/client/{uploadPart.mjs → s3data/uploadPart.mjs} +7 -7
  201. package/dist/esm/providers/s3/utils/client/s3data/uploadPart.mjs.map +1 -0
  202. package/dist/esm/providers/s3/utils/client/utils/createRetryDecider.d.ts +22 -0
  203. package/dist/esm/providers/s3/utils/client/utils/createRetryDecider.mjs +55 -0
  204. package/dist/esm/providers/s3/utils/client/utils/createRetryDecider.mjs.map +1 -0
  205. package/dist/esm/providers/s3/utils/client/utils/deserializeHelpers.d.ts +17 -0
  206. package/dist/esm/providers/s3/utils/client/utils/deserializeHelpers.mjs +33 -1
  207. package/dist/esm/providers/s3/utils/client/utils/deserializeHelpers.mjs.map +1 -1
  208. package/dist/esm/providers/s3/utils/client/utils/index.d.ts +2 -1
  209. package/dist/esm/providers/s3/utils/client/utils/index.mjs +2 -1
  210. package/dist/esm/providers/s3/utils/client/utils/index.mjs.map +1 -1
  211. package/dist/esm/providers/s3/utils/client/utils/parsePayload.d.ts +16 -1
  212. package/dist/esm/providers/s3/utils/client/utils/parsePayload.mjs +19 -5
  213. package/dist/esm/providers/s3/utils/client/utils/parsePayload.mjs.map +1 -1
  214. package/dist/esm/providers/s3/utils/crc32.d.ts +6 -0
  215. package/dist/esm/providers/s3/utils/crc32.mjs +34 -0
  216. package/dist/esm/providers/s3/utils/crc32.mjs.map +1 -0
  217. package/dist/esm/providers/s3/utils/crc32.native.d.ts +2 -0
  218. package/dist/esm/providers/s3/utils/crc32.native.mjs +8 -0
  219. package/dist/esm/providers/s3/utils/crc32.native.mjs.map +1 -0
  220. package/dist/esm/providers/s3/utils/resolveIdentityId.d.ts +1 -0
  221. package/dist/esm/providers/s3/utils/resolveIdentityId.mjs +12 -0
  222. package/dist/esm/providers/s3/utils/resolveIdentityId.mjs.map +1 -0
  223. package/dist/esm/providers/s3/utils/resolveS3ConfigAndInput.d.ts +10 -2
  224. package/dist/esm/providers/s3/utils/resolveS3ConfigAndInput.mjs +57 -11
  225. package/dist/esm/providers/s3/utils/resolveS3ConfigAndInput.mjs.map +1 -1
  226. package/dist/esm/providers/s3/utils/validateStorageOperationInput.mjs +4 -1
  227. package/dist/esm/providers/s3/utils/validateStorageOperationInput.mjs.map +1 -1
  228. package/dist/esm/providers/s3/utils/validateStorageOperationInputWithPrefix.mjs +4 -1
  229. package/dist/esm/providers/s3/utils/validateStorageOperationInputWithPrefix.mjs.map +1 -1
  230. package/dist/esm/storageBrowser/apis/constants.d.ts +2 -0
  231. package/dist/esm/storageBrowser/apis/constants.mjs +7 -0
  232. package/dist/esm/storageBrowser/apis/constants.mjs.map +1 -0
  233. package/dist/esm/storageBrowser/apis/getDataAccess.d.ts +2 -0
  234. package/dist/esm/storageBrowser/apis/getDataAccess.mjs +57 -0
  235. package/dist/esm/storageBrowser/apis/getDataAccess.mjs.map +1 -0
  236. package/dist/esm/storageBrowser/apis/listCallerAccessGrants.d.ts +2 -0
  237. package/dist/esm/storageBrowser/apis/listCallerAccessGrants.mjs +69 -0
  238. package/dist/esm/storageBrowser/apis/listCallerAccessGrants.mjs.map +1 -0
  239. package/dist/esm/storageBrowser/apis/types.d.ts +18 -0
  240. package/dist/esm/storageBrowser/apis/types.mjs +2 -0
  241. package/dist/esm/storageBrowser/apis/types.mjs.map +1 -0
  242. package/dist/esm/storageBrowser/index.d.ts +6 -0
  243. package/dist/esm/storageBrowser/index.mjs +3 -0
  244. package/dist/esm/storageBrowser/index.mjs.map +1 -0
  245. package/dist/esm/storageBrowser/locationCredentialsStore/constants.d.ts +2 -0
  246. package/dist/esm/storageBrowser/locationCredentialsStore/constants.mjs +7 -0
  247. package/dist/esm/storageBrowser/locationCredentialsStore/constants.mjs.map +1 -0
  248. package/dist/esm/storageBrowser/locationCredentialsStore/create.d.ts +2 -0
  249. package/dist/esm/storageBrowser/locationCredentialsStore/create.mjs +34 -0
  250. package/dist/esm/storageBrowser/locationCredentialsStore/create.mjs.map +1 -0
  251. package/dist/esm/storageBrowser/locationCredentialsStore/index.d.ts +1 -0
  252. package/dist/esm/storageBrowser/locationCredentialsStore/index.mjs +2 -0
  253. package/dist/esm/storageBrowser/locationCredentialsStore/index.mjs.map +1 -0
  254. package/dist/esm/storageBrowser/locationCredentialsStore/registry.d.ts +23 -0
  255. package/dist/esm/storageBrowser/locationCredentialsStore/registry.mjs +54 -0
  256. package/dist/esm/storageBrowser/locationCredentialsStore/registry.mjs.map +1 -0
  257. package/dist/esm/storageBrowser/locationCredentialsStore/store.d.ts +35 -0
  258. package/dist/esm/storageBrowser/locationCredentialsStore/store.mjs +95 -0
  259. package/dist/esm/storageBrowser/locationCredentialsStore/store.mjs.map +1 -0
  260. package/dist/esm/storageBrowser/managedAuthConfigAdapter/createListLocationsHandler.d.ts +8 -0
  261. package/dist/esm/storageBrowser/managedAuthConfigAdapter/createListLocationsHandler.mjs +13 -0
  262. package/dist/esm/storageBrowser/managedAuthConfigAdapter/createListLocationsHandler.mjs.map +1 -0
  263. package/dist/esm/storageBrowser/managedAuthConfigAdapter/createLocationCredentialsHandler.d.ts +8 -0
  264. package/dist/esm/storageBrowser/managedAuthConfigAdapter/createLocationCredentialsHandler.mjs +27 -0
  265. package/dist/esm/storageBrowser/managedAuthConfigAdapter/createLocationCredentialsHandler.mjs.map +1 -0
  266. package/dist/esm/storageBrowser/managedAuthConfigAdapter/createManagedAuthConfigAdapter.d.ts +19 -0
  267. package/dist/esm/storageBrowser/managedAuthConfigAdapter/createManagedAuthConfigAdapter.mjs +30 -0
  268. package/dist/esm/storageBrowser/managedAuthConfigAdapter/createManagedAuthConfigAdapter.mjs.map +1 -0
  269. package/dist/esm/storageBrowser/managedAuthConfigAdapter/index.d.ts +1 -0
  270. package/dist/esm/storageBrowser/managedAuthConfigAdapter/index.mjs +2 -0
  271. package/dist/esm/storageBrowser/managedAuthConfigAdapter/index.mjs.map +1 -0
  272. package/dist/esm/storageBrowser/types.d.ts +92 -0
  273. package/dist/esm/storageBrowser/types.mjs +2 -0
  274. package/dist/esm/storageBrowser/types.mjs.map +1 -0
  275. package/package.json +117 -107
  276. package/src/errors/constants.ts +4 -0
  277. package/src/errors/types/validation.ts +12 -0
  278. package/src/providers/s3/apis/downloadData.ts +2 -2
  279. package/src/providers/s3/apis/internal/copy.ts +42 -12
  280. package/src/providers/s3/apis/internal/getProperties.ts +2 -3
  281. package/src/providers/s3/apis/internal/getUrl.ts +2 -2
  282. package/src/providers/s3/apis/internal/list.ts +3 -3
  283. package/src/providers/s3/apis/internal/remove.ts +2 -3
  284. package/src/providers/s3/apis/uploadData/multipart/initialUpload.ts +30 -1
  285. package/src/providers/s3/apis/uploadData/multipart/uploadCache.ts +4 -1
  286. package/src/providers/s3/apis/uploadData/multipart/uploadHandlers.ts +36 -17
  287. package/src/providers/s3/apis/uploadData/multipart/uploadPartExecutor.ts +23 -7
  288. package/src/providers/s3/apis/uploadData/putObjectJob.ts +22 -5
  289. package/src/providers/s3/apis/uploadData/validateObjectNotExists.ts +25 -0
  290. package/src/providers/s3/types/inputs.ts +7 -1
  291. package/src/providers/s3/types/options.ts +35 -1
  292. package/src/providers/s3/utils/client/s3control/base.ts +97 -0
  293. package/src/providers/s3/utils/client/s3control/getDataAccess.ts +96 -0
  294. package/src/providers/s3/utils/client/s3control/index.ts +13 -0
  295. package/src/providers/s3/utils/client/s3control/listCallerAccessGrants.ts +107 -0
  296. package/src/providers/s3/utils/client/s3control/types.ts +216 -0
  297. package/src/providers/s3/utils/client/{abortMultipartUpload.ts → s3data/abortMultipartUpload.ts} +4 -4
  298. package/src/providers/s3/utils/client/{base.ts → s3data/base.ts} +26 -3
  299. package/src/providers/s3/utils/client/{completeMultipartUpload.ts → s3data/completeMultipartUpload.ts} +28 -19
  300. package/src/providers/s3/utils/client/{copyObject.ts → s3data/copyObject.ts} +4 -4
  301. package/src/providers/s3/utils/client/{createMultipartUpload.ts → s3data/createMultipartUpload.ts} +15 -9
  302. package/src/providers/s3/utils/client/{deleteObject.ts → s3data/deleteObject.ts} +7 -7
  303. package/src/providers/s3/utils/client/{getObject.ts → s3data/getObject.ts} +13 -9
  304. package/src/providers/s3/utils/client/{headObject.ts → s3data/headObject.ts} +4 -4
  305. package/src/providers/s3/utils/client/{listObjectsV2.ts → s3data/listObjectsV2.ts} +7 -7
  306. package/src/providers/s3/utils/client/{listParts.ts → s3data/listParts.ts} +9 -8
  307. package/src/providers/s3/utils/client/{putObject.ts → s3data/putObject.ts} +6 -4
  308. package/src/providers/s3/utils/client/{uploadPart.ts → s3data/uploadPart.ts} +13 -6
  309. package/src/providers/s3/utils/client/utils/createRetryDecider.ts +96 -0
  310. package/src/providers/s3/utils/client/utils/deserializeHelpers.ts +41 -0
  311. package/src/providers/s3/utils/client/utils/index.ts +2 -1
  312. package/src/providers/s3/utils/client/utils/parsePayload.ts +36 -18
  313. package/src/providers/s3/utils/crc32.native.ts +11 -0
  314. package/src/providers/s3/utils/crc32.ts +51 -0
  315. package/src/providers/s3/utils/resolveIdentityId.ts +11 -0
  316. package/src/providers/s3/utils/resolveS3ConfigAndInput.ts +109 -14
  317. package/src/providers/s3/utils/validateStorageOperationInput.ts +5 -1
  318. package/src/providers/s3/utils/validateStorageOperationInputWithPrefix.ts +5 -1
  319. package/src/storageBrowser/apis/constants.ts +5 -0
  320. package/src/storageBrowser/apis/getDataAccess.ts +79 -0
  321. package/src/storageBrowser/apis/listCallerAccessGrants.ts +94 -0
  322. package/src/storageBrowser/apis/types.ts +33 -0
  323. package/src/storageBrowser/index.ts +25 -0
  324. package/src/storageBrowser/locationCredentialsStore/constants.ts +5 -0
  325. package/src/storageBrowser/locationCredentialsStore/create.ts +54 -0
  326. package/src/storageBrowser/locationCredentialsStore/index.ts +4 -0
  327. package/src/storageBrowser/locationCredentialsStore/registry.ts +88 -0
  328. package/src/storageBrowser/locationCredentialsStore/store.ts +161 -0
  329. package/src/storageBrowser/managedAuthConfigAdapter/createListLocationsHandler.ts +21 -0
  330. package/src/storageBrowser/managedAuthConfigAdapter/createLocationCredentialsHandler.ts +40 -0
  331. package/src/storageBrowser/managedAuthConfigAdapter/createManagedAuthConfigAdapter.ts +53 -0
  332. package/src/storageBrowser/managedAuthConfigAdapter/index.ts +8 -0
  333. package/src/storageBrowser/types.ts +117 -0
  334. package/dist/cjs/providers/s3/utils/client/abortMultipartUpload.js.map +0 -1
  335. package/dist/cjs/providers/s3/utils/client/base.js.map +0 -1
  336. package/dist/cjs/providers/s3/utils/client/completeMultipartUpload.js.map +0 -1
  337. package/dist/cjs/providers/s3/utils/client/copyObject.js.map +0 -1
  338. package/dist/cjs/providers/s3/utils/client/createMultipartUpload.js.map +0 -1
  339. package/dist/cjs/providers/s3/utils/client/deleteObject.js.map +0 -1
  340. package/dist/cjs/providers/s3/utils/client/getObject.js.map +0 -1
  341. package/dist/cjs/providers/s3/utils/client/headObject.js.map +0 -1
  342. package/dist/cjs/providers/s3/utils/client/index.js.map +0 -1
  343. package/dist/cjs/providers/s3/utils/client/listObjectsV2.js.map +0 -1
  344. package/dist/cjs/providers/s3/utils/client/listParts.js.map +0 -1
  345. package/dist/cjs/providers/s3/utils/client/putObject.js.map +0 -1
  346. package/dist/cjs/providers/s3/utils/client/types.js.map +0 -1
  347. package/dist/cjs/providers/s3/utils/client/uploadPart.js.map +0 -1
  348. package/dist/esm/providers/s3/utils/client/abortMultipartUpload.mjs.map +0 -1
  349. package/dist/esm/providers/s3/utils/client/base.mjs.map +0 -1
  350. package/dist/esm/providers/s3/utils/client/completeMultipartUpload.mjs.map +0 -1
  351. package/dist/esm/providers/s3/utils/client/copyObject.mjs.map +0 -1
  352. package/dist/esm/providers/s3/utils/client/createMultipartUpload.mjs.map +0 -1
  353. package/dist/esm/providers/s3/utils/client/deleteObject.mjs.map +0 -1
  354. package/dist/esm/providers/s3/utils/client/getObject.mjs.map +0 -1
  355. package/dist/esm/providers/s3/utils/client/headObject.mjs.map +0 -1
  356. package/dist/esm/providers/s3/utils/client/listObjectsV2.mjs.map +0 -1
  357. package/dist/esm/providers/s3/utils/client/listParts.mjs.map +0 -1
  358. package/dist/esm/providers/s3/utils/client/putObject.mjs.map +0 -1
  359. package/dist/esm/providers/s3/utils/client/uploadPart.mjs.map +0 -1
  360. /package/dist/cjs/providers/s3/utils/client/{types.js → s3control/types.js} +0 -0
  361. /package/dist/cjs/providers/s3/utils/client/{index.js → s3data/index.js} +0 -0
  362. /package/dist/esm/providers/s3/utils/client/{types.mjs → s3control/types.mjs} +0 -0
  363. /package/dist/esm/providers/s3/utils/client/{types.mjs.map → s3control/types.mjs.map} +0 -0
  364. /package/dist/esm/providers/s3/utils/client/{index.d.ts → s3data/index.d.ts} +0 -0
  365. /package/dist/esm/providers/s3/utils/client/{index.mjs → s3data/index.mjs} +0 -0
  366. /package/dist/esm/providers/s3/utils/client/{index.mjs.map → s3data/index.mjs.map} +0 -0
  367. /package/dist/esm/providers/s3/utils/client/{types.d.ts → s3data/types.d.ts} +0 -0
  368. /package/src/providers/s3/utils/client/{index.ts → s3data/index.ts} +0 -0
  369. /package/src/providers/s3/utils/client/{types.ts → s3data/types.ts} +0 -0
@@ -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 { BucketInfo, ResolvedS3Config, StorageBucket } 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,7 @@ interface S3ApiOptions {
14
28
  accessLevel?: StorageAccessLevel;
15
29
  targetIdentityId?: string;
16
30
  useAccelerateEndpoint?: boolean;
31
+ locationCredentialsProvider?: LocationCredentialsProvider;
17
32
  bucket?: StorageBucket;
18
33
  }
19
34
 
@@ -24,6 +39,16 @@ interface ResolvedS3ConfigAndInput {
24
39
  isObjectLockEnabled?: boolean;
25
40
  identityId?: string;
26
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;
27
52
 
28
53
  /**
29
54
  * resolve the common input options for S3 API handlers from Amplify configuration and library options.
@@ -38,23 +63,35 @@ interface ResolvedS3ConfigAndInput {
38
63
  */
39
64
  export const resolveS3ConfigAndInput = async (
40
65
  amplify: AmplifyClassV6,
41
- apiOptions?: S3ApiOptions,
66
+ apiInput?: StorageInput & { options?: S3ApiOptions },
42
67
  ): Promise<ResolvedS3ConfigAndInput> => {
68
+ const { options: apiOptions } = apiInput ?? {};
43
69
  /**
44
70
  * IdentityId is always cached in memory so we can safely make calls here. It
45
71
  * should be stable even for unauthenticated users, regardless of credentials.
46
72
  */
47
73
  const { identityId } = await amplify.Auth.fetchAuthSession();
48
- assertValidationError(!!identityId, StorageValidationErrorCode.NoIdentityId);
49
74
 
50
75
  /**
51
76
  * A credentials provider function instead of a static credentials object is
52
77
  * used because the long-running tasks like multipart upload may span over the
53
78
  * credentials expiry. Auth.fetchAuthSession() automatically refreshes the
54
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.
55
83
  */
56
- const credentialsProvider = async () => {
57
- 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();
58
95
  assertValidationError(
59
96
  !!credentials,
60
97
  StorageValidationErrorCode.NoCredentials,
@@ -82,15 +119,14 @@ export const resolveS3ConfigAndInput = async (
82
119
  isObjectLockEnabled,
83
120
  } = amplify.libraryOptions?.Storage?.S3 ?? {};
84
121
 
85
- const keyPrefix = await prefixResolver({
86
- accessLevel:
87
- apiOptions?.accessLevel ?? defaultAccessLevel ?? DEFAULT_ACCESS_LEVEL,
88
- // use conditional assign to make tsc happy because StorageOptions is a union type that may not have targetIdentityId
89
- targetIdentityId:
90
- apiOptions?.accessLevel === 'protected'
91
- ? (apiOptions?.targetIdentityId ?? identityId)
92
- : identityId,
93
- });
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 });
94
130
 
95
131
  return {
96
132
  s3Config: {
@@ -111,6 +147,65 @@ export const resolveS3ConfigAndInput = async (
111
147
  };
112
148
  };
113
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
+ };
114
209
  const resolveBucketConfig = (
115
210
  apiOptions: S3ApiOptions,
116
211
  buckets: Record<string, BucketInfo> | undefined,
@@ -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,94 @@
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 } 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
+ assertGrantScope(grant.GrantScope);
57
+
58
+ return {
59
+ scope: grant.GrantScope,
60
+ permission: grant.Permission!,
61
+ type: parseGrantType(grant.GrantScope!),
62
+ };
63
+ }) ?? [];
64
+
65
+ return {
66
+ locations: accessGrants,
67
+ nextToken: NextToken,
68
+ };
69
+ };
70
+
71
+ const parseGrantType = (grantScope: string): LocationType => {
72
+ const bucketScopeReg = /^s3:\/\/(.*)\/\*$/;
73
+ const possibleBucketName = grantScope.match(bucketScopeReg)?.[1];
74
+ if (!grantScope.endsWith('*')) {
75
+ return 'OBJECT';
76
+ } else if (
77
+ grantScope.endsWith('/*') &&
78
+ possibleBucketName &&
79
+ possibleBucketName.indexOf('/') === -1
80
+ ) {
81
+ return 'BUCKET';
82
+ } else {
83
+ return 'PREFIX';
84
+ }
85
+ };
86
+
87
+ function assertGrantScope(value: unknown): asserts value is string {
88
+ if (typeof value !== 'string' || !value.startsWith('s3://')) {
89
+ throw new StorageError({
90
+ name: 'InvalidGrantScope',
91
+ message: `Expected a valid grant scope, got ${value}`,
92
+ });
93
+ }
94
+ }
@@ -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;
@@ -0,0 +1,54 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import {
5
+ CreateLocationCredentialsStoreInput,
6
+ CredentialsLocation,
7
+ LocationCredentialsStore,
8
+ } from '../types';
9
+ import { StorageValidationErrorCode } from '../../errors/types/validation';
10
+ import { assertValidationError } from '../../errors/utils/assertValidationError';
11
+ import { LocationCredentialsProvider } from '../../providers/s3/types/options';
12
+
13
+ import { createStore, getValue, removeStore } from './registry';
14
+
15
+ export const createLocationCredentialsStore = (
16
+ input: CreateLocationCredentialsStoreInput,
17
+ ): LocationCredentialsStore => {
18
+ const storeSymbol = createStore(input.handler);
19
+
20
+ const store = {
21
+ getProvider(providerLocation: CredentialsLocation) {
22
+ const locationCredentialsProvider = async ({
23
+ forceRefresh = false,
24
+ }: Parameters<LocationCredentialsProvider>[0] = {}) => {
25
+ validateS3Uri(providerLocation.scope);
26
+
27
+ // TODO(@AllanZhengYP): validate the action bucket and paths matches provider scope.
28
+ return getValue({
29
+ storeSymbol,
30
+ location: { ...providerLocation },
31
+ forceRefresh,
32
+ });
33
+ };
34
+
35
+ return locationCredentialsProvider;
36
+ },
37
+
38
+ destroy() {
39
+ removeStore(storeSymbol);
40
+ },
41
+ };
42
+
43
+ return store;
44
+ };
45
+
46
+ type S3Uri = string;
47
+
48
+ const validateS3Uri = (uri: S3Uri): void => {
49
+ const s3UrlSchemaRegex = /^s3:\/\/[^/]+/;
50
+ assertValidationError(
51
+ s3UrlSchemaRegex.test(uri),
52
+ StorageValidationErrorCode.InvalidS3Uri,
53
+ );
54
+ };
@@ -0,0 +1,4 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ export { createLocationCredentialsStore } from './create';
@@ -0,0 +1,88 @@
1
+ /* eslint-disable unused-imports/no-unused-vars */
2
+
3
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
4
+ // SPDX-License-Identifier: Apache-2.0
5
+ import { AWSTemporaryCredentials } from '../../providers/s3/types/options';
6
+ import { CredentialsLocation, GetLocationCredentials } from '../types';
7
+ import { assertValidationError } from '../../errors/utils/assertValidationError';
8
+ import { StorageValidationErrorCode } from '../../errors/types/validation';
9
+
10
+ import {
11
+ LruLocationCredentialsStore,
12
+ fetchNewValue,
13
+ getCacheValue,
14
+ initStore,
15
+ } from './store';
16
+
17
+ interface StoreRegistrySymbol {
18
+ readonly value: symbol;
19
+ }
20
+
21
+ /**
22
+ * Keep all cache records for all instances of credentials store in a singleton
23
+ * so we can reliably de-reference from the memory when we destroy a store
24
+ * instance.
25
+ */
26
+ const storeRegistry = new WeakMap<
27
+ StoreRegistrySymbol,
28
+ LruLocationCredentialsStore
29
+ >();
30
+
31
+ /**
32
+ * @internal
33
+ */
34
+ export const createStore = (
35
+ refreshHandler: GetLocationCredentials,
36
+ size?: number,
37
+ ) => {
38
+ const storeSymbol = { value: Symbol('LocationCredentialsStore') };
39
+ storeRegistry.set(storeSymbol, initStore(refreshHandler, size));
40
+
41
+ return storeSymbol;
42
+ };
43
+
44
+ const getLookUpLocations = (location: CredentialsLocation) => {
45
+ const { scope, permission } = location;
46
+ const locations = [{ scope, permission }];
47
+ if (permission === 'READ' || permission === 'WRITE') {
48
+ locations.push({ scope, permission: 'READWRITE' });
49
+ }
50
+
51
+ return locations;
52
+ };
53
+
54
+ const getCredentialsStore = (storeSymbol: StoreRegistrySymbol) => {
55
+ assertValidationError(
56
+ storeRegistry.has(storeSymbol),
57
+ StorageValidationErrorCode.LocationCredentialsStoreDestroyed,
58
+ );
59
+
60
+ return storeRegistry.get(storeSymbol)!;
61
+ };
62
+
63
+ /**
64
+ * @internal
65
+ */
66
+ export const getValue = async (input: {
67
+ storeSymbol: StoreRegistrySymbol;
68
+ location: CredentialsLocation;
69
+ forceRefresh: boolean;
70
+ }): Promise<{ credentials: AWSTemporaryCredentials }> => {
71
+ const { storeSymbol: storeReference, location, forceRefresh } = input;
72
+ const store = getCredentialsStore(storeReference);
73
+ if (!forceRefresh) {
74
+ const lookupLocations = getLookUpLocations(location);
75
+ for (const lookupLocation of lookupLocations) {
76
+ const credentials = getCacheValue(store, lookupLocation);
77
+ if (credentials !== null) {
78
+ return { credentials };
79
+ }
80
+ }
81
+ }
82
+
83
+ return fetchNewValue(store, location);
84
+ };
85
+
86
+ export const removeStore = (storeSymbol: StoreRegistrySymbol) => {
87
+ storeRegistry.delete(storeSymbol);
88
+ };