@webiny/api-sync-system 0.0.0-unstable.9bd236cf5e → 0.0.0-unstable.9f53ea597d

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 (321) hide show
  1. package/README.md +6 -108
  2. package/constants.js +2 -7
  3. package/constants.js.map +1 -1
  4. package/index.js +3 -40
  5. package/package.json +29 -26
  6. package/resolver/app/RecordHandler.d.ts +6 -6
  7. package/resolver/app/RecordHandler.js +84 -114
  8. package/resolver/app/RecordHandler.js.map +1 -1
  9. package/resolver/app/RecordsValidation.js +13 -24
  10. package/resolver/app/RecordsValidation.js.map +1 -1
  11. package/resolver/app/ResolverApplication.d.ts +1 -1
  12. package/resolver/app/ResolverApplication.js +27 -42
  13. package/resolver/app/ResolverApplication.js.map +1 -1
  14. package/resolver/app/abstractions/RecordHandler.d.ts +1 -1
  15. package/resolver/app/abstractions/RecordHandler.js +0 -7
  16. package/resolver/app/abstractions/RecordsValidation.d.ts +2 -2
  17. package/resolver/app/abstractions/RecordsValidation.js +0 -7
  18. package/resolver/app/abstractions/ResolverApplication.js +0 -7
  19. package/resolver/app/abstractions/ResolverRecord.d.ts +1 -1
  20. package/resolver/app/abstractions/ResolverRecord.js +0 -7
  21. package/resolver/app/bundler/BaseBundle.d.ts +6 -6
  22. package/resolver/app/bundler/BaseBundle.js +16 -22
  23. package/resolver/app/bundler/BaseBundle.js.map +1 -1
  24. package/resolver/app/bundler/Bundler.d.ts +1 -1
  25. package/resolver/app/bundler/Bundler.js +12 -25
  26. package/resolver/app/bundler/Bundler.js.map +1 -1
  27. package/resolver/app/bundler/Bundles.d.ts +2 -2
  28. package/resolver/app/bundler/Bundles.js +20 -33
  29. package/resolver/app/bundler/Bundles.js.map +1 -1
  30. package/resolver/app/bundler/CommandBundle.d.ts +1 -1
  31. package/resolver/app/bundler/CommandBundle.js +8 -25
  32. package/resolver/app/bundler/CommandBundle.js.map +1 -1
  33. package/resolver/app/bundler/TableBundle.d.ts +1 -1
  34. package/resolver/app/bundler/TableBundle.js +7 -22
  35. package/resolver/app/bundler/TableBundle.js.map +1 -1
  36. package/resolver/app/bundler/types.d.ts +2 -2
  37. package/resolver/app/bundler/types.js +0 -7
  38. package/resolver/app/commandHandler/DeleteCommandHandler.d.ts +3 -3
  39. package/resolver/app/commandHandler/DeleteCommandHandler.js +21 -35
  40. package/resolver/app/commandHandler/DeleteCommandHandler.js.map +1 -1
  41. package/resolver/app/commandHandler/PutCommandHandler.d.ts +4 -4
  42. package/resolver/app/commandHandler/PutCommandHandler.js +15 -28
  43. package/resolver/app/commandHandler/PutCommandHandler.js.map +1 -1
  44. package/resolver/app/commandHandler/delete.d.ts +1 -1
  45. package/resolver/app/commandHandler/delete.js +13 -21
  46. package/resolver/app/commandHandler/delete.js.map +1 -1
  47. package/resolver/app/commandHandler/put.d.ts +1 -1
  48. package/resolver/app/commandHandler/put.js +13 -21
  49. package/resolver/app/commandHandler/put.js.map +1 -1
  50. package/resolver/app/data/SourceDataContainer.d.ts +3 -3
  51. package/resolver/app/data/SourceDataContainer.js +27 -36
  52. package/resolver/app/data/SourceDataContainer.js.map +1 -1
  53. package/resolver/app/data/types.d.ts +2 -2
  54. package/resolver/app/data/types.js +0 -7
  55. package/resolver/app/fetcher/Fetcher.d.ts +3 -3
  56. package/resolver/app/fetcher/Fetcher.js +87 -121
  57. package/resolver/app/fetcher/Fetcher.js.map +1 -1
  58. package/resolver/app/fetcher/types.d.ts +2 -2
  59. package/resolver/app/fetcher/types.js +0 -7
  60. package/resolver/app/ingestor/Ingestor.d.ts +1 -1
  61. package/resolver/app/ingestor/Ingestor.js +26 -39
  62. package/resolver/app/ingestor/Ingestor.js.map +1 -1
  63. package/resolver/app/ingestor/IngestorResult.js +27 -39
  64. package/resolver/app/ingestor/IngestorResult.js.map +1 -1
  65. package/resolver/app/ingestor/types.d.ts +2 -2
  66. package/resolver/app/ingestor/types.js +0 -7
  67. package/resolver/app/storer/Storer.d.ts +3 -3
  68. package/resolver/app/storer/Storer.js +73 -95
  69. package/resolver/app/storer/Storer.js.map +1 -1
  70. package/resolver/app/storer/types.d.ts +2 -2
  71. package/resolver/app/storer/types.js +0 -7
  72. package/resolver/app/transform/TransformHandler.d.ts +4 -4
  73. package/resolver/app/transform/TransformHandler.js +46 -64
  74. package/resolver/app/transform/TransformHandler.js.map +1 -1
  75. package/resolver/app/transform/middleware.d.ts +1 -1
  76. package/resolver/app/transform/middleware.js +12 -25
  77. package/resolver/app/transform/middleware.js.map +1 -1
  78. package/resolver/app/utils/Retry.js +21 -32
  79. package/resolver/app/utils/Retry.js.map +1 -1
  80. package/resolver/app/utils/sleep.js +4 -12
  81. package/resolver/app/utils/sleep.js.map +1 -1
  82. package/resolver/app/validation/body.d.ts +25 -124
  83. package/resolver/app/validation/body.js +31 -44
  84. package/resolver/app/validation/body.js.map +1 -1
  85. package/resolver/app/validation/createJsonTransform.d.ts +1 -1
  86. package/resolver/app/validation/createJsonTransform.js +13 -22
  87. package/resolver/app/validation/createJsonTransform.js.map +1 -1
  88. package/resolver/app/validation/detail.d.ts +19 -72
  89. package/resolver/app/validation/detail.js +33 -46
  90. package/resolver/app/validation/detail.js.map +1 -1
  91. package/resolver/app/validation/event.d.ts +29 -188
  92. package/resolver/app/validation/event.js +21 -30
  93. package/resolver/app/validation/event.js.map +1 -1
  94. package/resolver/app/validation/numericString.d.ts +1 -1
  95. package/resolver/app/validation/numericString.js +9 -20
  96. package/resolver/app/validation/numericString.js.map +1 -1
  97. package/resolver/app/validation/system.d.ts +2 -14
  98. package/resolver/app/validation/system.js +9 -18
  99. package/resolver/app/validation/system.js.map +1 -1
  100. package/resolver/createEventHandlerPlugin.d.ts +2 -1
  101. package/resolver/createEventHandlerPlugin.js +85 -121
  102. package/resolver/createEventHandlerPlugin.js.map +1 -1
  103. package/resolver/createResolverHandler.d.ts +1 -1
  104. package/resolver/createResolverHandler.js +60 -75
  105. package/resolver/createResolverHandler.js.map +1 -1
  106. package/resolver/deployment/Deployment.d.ts +2 -3
  107. package/resolver/deployment/Deployment.js +27 -44
  108. package/resolver/deployment/Deployment.js.map +1 -1
  109. package/resolver/deployment/Deployments.js +19 -30
  110. package/resolver/deployment/Deployments.js.map +1 -1
  111. package/resolver/deployment/DeploymentsFetcher.js +82 -102
  112. package/resolver/deployment/DeploymentsFetcher.js.map +1 -1
  113. package/resolver/deployment/types.d.ts +4 -6
  114. package/resolver/deployment/types.js +0 -7
  115. package/resolver/lambda/LambdaTrigger.js +25 -34
  116. package/resolver/lambda/LambdaTrigger.js.map +1 -1
  117. package/resolver/plugins/CommandHandlerPlugin.d.ts +3 -3
  118. package/resolver/plugins/CommandHandlerPlugin.js +17 -24
  119. package/resolver/plugins/CommandHandlerPlugin.js.map +1 -1
  120. package/resolver/plugins/StorerAfterEachPlugin.d.ts +2 -2
  121. package/resolver/plugins/StorerAfterEachPlugin.js +21 -29
  122. package/resolver/plugins/StorerAfterEachPlugin.js.map +1 -1
  123. package/resolver/plugins/TransformRecordPlugin.d.ts +3 -3
  124. package/resolver/plugins/TransformRecordPlugin.js +20 -27
  125. package/resolver/plugins/TransformRecordPlugin.js.map +1 -1
  126. package/resolver/recordTypes/fileManager/CopyFile.js +44 -74
  127. package/resolver/recordTypes/fileManager/CopyFile.js.map +1 -1
  128. package/resolver/recordTypes/fileManager/DeleteFile.d.ts +1 -1
  129. package/resolver/recordTypes/fileManager/DeleteFile.js +40 -65
  130. package/resolver/recordTypes/fileManager/DeleteFile.js.map +1 -1
  131. package/resolver/recordTypes/fileManager/fileManager.d.ts +1 -1
  132. package/resolver/recordTypes/fileManager/fileManager.js +7 -12
  133. package/resolver/recordTypes/fileManager/fileManager.js.map +1 -1
  134. package/resolver/recordTypes/fileManager/fileManagerOnDelete.d.ts +1 -1
  135. package/resolver/recordTypes/fileManager/fileManagerOnDelete.js +27 -45
  136. package/resolver/recordTypes/fileManager/fileManagerOnDelete.js.map +1 -1
  137. package/resolver/recordTypes/fileManager/fileManagerOnPut.d.ts +1 -1
  138. package/resolver/recordTypes/fileManager/fileManagerOnPut.js +27 -45
  139. package/resolver/recordTypes/fileManager/fileManagerOnPut.js.map +1 -1
  140. package/resolver/recordTypes/fileManager/shouldBeHandled.d.ts +1 -1
  141. package/resolver/recordTypes/fileManager/shouldBeHandled.js +10 -34
  142. package/resolver/recordTypes/fileManager/shouldBeHandled.js.map +1 -1
  143. package/resolver/recordTypes/fileManager/types.d.ts +2 -2
  144. package/resolver/recordTypes/fileManager/types.js +0 -7
  145. package/resolver/recordTypes/users/CopyUser.d.ts +2 -2
  146. package/resolver/recordTypes/users/CopyUser.js +44 -61
  147. package/resolver/recordTypes/users/CopyUser.js.map +1 -1
  148. package/resolver/recordTypes/users/DeleteUser.d.ts +2 -2
  149. package/resolver/recordTypes/users/DeleteUser.js +40 -58
  150. package/resolver/recordTypes/users/DeleteUser.js.map +1 -1
  151. package/resolver/recordTypes/users/shouldBeHandled.d.ts +1 -1
  152. package/resolver/recordTypes/users/shouldBeHandled.js +10 -33
  153. package/resolver/recordTypes/users/shouldBeHandled.js.map +1 -1
  154. package/resolver/recordTypes/users/types.d.ts +1 -1
  155. package/resolver/recordTypes/users/types.js +0 -7
  156. package/resolver/recordTypes/users/users.js +7 -12
  157. package/resolver/recordTypes/users/users.js.map +1 -1
  158. package/resolver/recordTypes/users/usersOnDelete.d.ts +2 -2
  159. package/resolver/recordTypes/users/usersOnDelete.js +26 -44
  160. package/resolver/recordTypes/users/usersOnDelete.js.map +1 -1
  161. package/resolver/recordTypes/users/usersOnPut.d.ts +2 -2
  162. package/resolver/recordTypes/users/usersOnPut.js +27 -45
  163. package/resolver/recordTypes/users/usersOnPut.js.map +1 -1
  164. package/sync/FilterOutRecord.d.ts +2 -2
  165. package/sync/FilterOutRecord.js +8 -24
  166. package/sync/FilterOutRecord.js.map +1 -1
  167. package/sync/attachToDynamoDbDocument.d.ts +1 -1
  168. package/sync/attachToDynamoDbDocument.js +48 -75
  169. package/sync/attachToDynamoDbDocument.js.map +1 -1
  170. package/sync/createHandler.js +44 -60
  171. package/sync/createHandler.js.map +1 -1
  172. package/sync/createSendDataToEventBridgeOnRequestEnd.js +34 -46
  173. package/sync/createSendDataToEventBridgeOnRequestEnd.js.map +1 -1
  174. package/sync/createSyncSystem.d.ts +1 -1
  175. package/sync/createSyncSystem.js +27 -36
  176. package/sync/createSyncSystem.js.map +1 -1
  177. package/sync/filter/createDefaultFilterOutRecordPlugins.d.ts +1 -1
  178. package/sync/filter/createDefaultFilterOutRecordPlugins.js +37 -86
  179. package/sync/filter/createDefaultFilterOutRecordPlugins.js.map +1 -1
  180. package/sync/handler/Handler.d.ts +2 -2
  181. package/sync/handler/Handler.js +66 -86
  182. package/sync/handler/Handler.js.map +1 -1
  183. package/sync/handler/HandlerConverter.js +20 -36
  184. package/sync/handler/HandlerConverter.js.map +1 -1
  185. package/sync/handler/converter/BatchGetCommandConverter.js +13 -20
  186. package/sync/handler/converter/BatchGetCommandConverter.js.map +1 -1
  187. package/sync/handler/converter/BatchWriteCommandConverter.js +13 -20
  188. package/sync/handler/converter/BatchWriteCommandConverter.js.map +1 -1
  189. package/sync/handler/converter/DeleteCommandConverter.js +13 -20
  190. package/sync/handler/converter/DeleteCommandConverter.js.map +1 -1
  191. package/sync/handler/converter/GetCommandConverter.js +13 -20
  192. package/sync/handler/converter/GetCommandConverter.js.map +1 -1
  193. package/sync/handler/converter/PutCommandConverter.js +13 -20
  194. package/sync/handler/converter/PutCommandConverter.js.map +1 -1
  195. package/sync/handler/converter/QueryCommandConverter.js +13 -20
  196. package/sync/handler/converter/QueryCommandConverter.js.map +1 -1
  197. package/sync/handler/converter/ScanCommandConverter.js +13 -20
  198. package/sync/handler/converter/ScanCommandConverter.js.map +1 -1
  199. package/sync/handler/converter/UpdateCommandConverter.js +13 -20
  200. package/sync/handler/converter/UpdateCommandConverter.js.map +1 -1
  201. package/sync/handler/converter/commands/BatchWriteCommandValue.d.ts +2 -2
  202. package/sync/handler/converter/commands/BatchWriteCommandValue.js +34 -44
  203. package/sync/handler/converter/commands/BatchWriteCommandValue.js.map +1 -1
  204. package/sync/handler/converter/commands/DeleteCommandValue.d.ts +2 -2
  205. package/sync/handler/converter/commands/DeleteCommandValue.js +19 -23
  206. package/sync/handler/converter/commands/DeleteCommandValue.js.map +1 -1
  207. package/sync/handler/converter/commands/NullCommandValue.d.ts +1 -1
  208. package/sync/handler/converter/commands/NullCommandValue.js +7 -14
  209. package/sync/handler/converter/commands/NullCommandValue.js.map +1 -1
  210. package/sync/handler/converter/commands/PutCommandValue.d.ts +2 -2
  211. package/sync/handler/converter/commands/PutCommandValue.js +19 -23
  212. package/sync/handler/converter/commands/PutCommandValue.js.map +1 -1
  213. package/sync/handler/converter/commands/UpdateCommandValue.d.ts +2 -2
  214. package/sync/handler/converter/commands/UpdateCommandValue.js +19 -23
  215. package/sync/handler/converter/commands/UpdateCommandValue.js.map +1 -1
  216. package/sync/handler/types.d.ts +3 -3
  217. package/sync/handler/types.js +0 -7
  218. package/sync/plugins/FilterOutRecordPlugin.d.ts +1 -1
  219. package/sync/plugins/FilterOutRecordPlugin.js +18 -28
  220. package/sync/plugins/FilterOutRecordPlugin.js.map +1 -1
  221. package/sync/requestPlugin.d.ts +1 -1
  222. package/sync/requestPlugin.js +39 -55
  223. package/sync/requestPlugin.js.map +1 -1
  224. package/sync/types.js +0 -7
  225. package/sync/utils/getTableType.js +11 -19
  226. package/sync/utils/getTableType.js.map +1 -1
  227. package/sync/utils/manifest.d.ts +3 -7
  228. package/sync/utils/manifest.js +30 -47
  229. package/sync/utils/manifest.js.map +1 -1
  230. package/sync/utils/validateSystemInput.d.ts +1 -1
  231. package/sync/utils/validateSystemInput.js +22 -37
  232. package/sync/utils/validateSystemInput.js.map +1 -1
  233. package/types.d.ts +3 -5
  234. package/types.js +6 -12
  235. package/types.js.map +1 -1
  236. package/utils/createSystemName.js +5 -10
  237. package/utils/createSystemName.js.map +1 -1
  238. package/worker/actions/copyFile/CopyFile.js +185 -268
  239. package/worker/actions/copyFile/CopyFile.js.map +1 -1
  240. package/worker/actions/copyFile/copyFileAction.d.ts +1 -1
  241. package/worker/actions/copyFile/copyFileAction.js +30 -45
  242. package/worker/actions/copyFile/copyFileAction.js.map +1 -1
  243. package/worker/actions/copyFile/copyFileSchema.d.ts +6 -38
  244. package/worker/actions/copyFile/copyFileSchema.js +14 -23
  245. package/worker/actions/copyFile/copyFileSchema.js.map +1 -1
  246. package/worker/actions/copyFile/types.js +0 -7
  247. package/worker/actions/createUser/CreateUser.d.ts +1 -1
  248. package/worker/actions/createUser/CreateUser.js +53 -83
  249. package/worker/actions/createUser/CreateUser.js.map +1 -1
  250. package/worker/actions/createUser/createUserAction.d.ts +2 -2
  251. package/worker/actions/createUser/createUserAction.js +28 -39
  252. package/worker/actions/createUser/createUserAction.js.map +1 -1
  253. package/worker/actions/createUser/createUserSchema.d.ts +6 -38
  254. package/worker/actions/createUser/createUserSchema.js +14 -23
  255. package/worker/actions/createUser/createUserSchema.js.map +1 -1
  256. package/worker/actions/createUser/types.js +0 -7
  257. package/worker/actions/deleteFile/DeleteFile.js +52 -74
  258. package/worker/actions/deleteFile/DeleteFile.js.map +1 -1
  259. package/worker/actions/deleteFile/deleteFileAction.d.ts +1 -1
  260. package/worker/actions/deleteFile/deleteFileAction.js +25 -40
  261. package/worker/actions/deleteFile/deleteFileAction.js.map +1 -1
  262. package/worker/actions/deleteFile/deleteFileSchema.d.ts +6 -38
  263. package/worker/actions/deleteFile/deleteFileSchema.js +14 -23
  264. package/worker/actions/deleteFile/deleteFileSchema.js.map +1 -1
  265. package/worker/actions/deleteFile/types.js +0 -7
  266. package/worker/actions/deleteUser/DeleteUser.d.ts +2 -2
  267. package/worker/actions/deleteUser/DeleteUser.js +39 -60
  268. package/worker/actions/deleteUser/DeleteUser.js.map +1 -1
  269. package/worker/actions/deleteUser/deleteUserAction.d.ts +1 -1
  270. package/worker/actions/deleteUser/deleteUserAction.js +26 -37
  271. package/worker/actions/deleteUser/deleteUserAction.js.map +1 -1
  272. package/worker/actions/deleteUser/deleteUserSchema.d.ts +5 -23
  273. package/worker/actions/deleteUser/deleteUserSchema.js +13 -22
  274. package/worker/actions/deleteUser/deleteUserSchema.js.map +1 -1
  275. package/worker/actions/deleteUser/types.js +0 -7
  276. package/worker/actions/logValidationError.js +6 -14
  277. package/worker/actions/logValidationError.js.map +1 -1
  278. package/worker/actions/removeCognitoUserAttributes.js +9 -22
  279. package/worker/actions/removeCognitoUserAttributes.js.map +1 -1
  280. package/worker/actions/updateUser/UpdateUser.d.ts +1 -1
  281. package/worker/actions/updateUser/UpdateUser.js +50 -74
  282. package/worker/actions/updateUser/UpdateUser.js.map +1 -1
  283. package/worker/actions/updateUser/types.js +0 -7
  284. package/worker/actions/updateUser/updateUserAction.d.ts +2 -2
  285. package/worker/actions/updateUser/updateUserAction.js +28 -39
  286. package/worker/actions/updateUser/updateUserAction.js.map +1 -1
  287. package/worker/actions/updateUser/updateUserSchema.d.ts +6 -38
  288. package/worker/actions/updateUser/updateUserSchema.js +14 -23
  289. package/worker/actions/updateUser/updateUserSchema.js.map +1 -1
  290. package/worker/createWorkerHandler.js +32 -45
  291. package/worker/createWorkerHandler.js.map +1 -1
  292. package/worker/handler/WorkerActionHandler.d.ts +2 -2
  293. package/worker/handler/WorkerActionHandler.js +19 -28
  294. package/worker/handler/WorkerActionHandler.js.map +1 -1
  295. package/worker/handler/eventHandler.js +18 -27
  296. package/worker/handler/eventHandler.js.map +1 -1
  297. package/worker/plugins/WorkerActionPlugin.d.ts +1 -1
  298. package/worker/plugins/WorkerActionPlugin.js +18 -25
  299. package/worker/plugins/WorkerActionPlugin.js.map +1 -1
  300. package/worker/types.js +0 -7
  301. package/index.js.map +0 -1
  302. package/resolver/app/abstractions/RecordHandler.js.map +0 -1
  303. package/resolver/app/abstractions/RecordsValidation.js.map +0 -1
  304. package/resolver/app/abstractions/ResolverApplication.js.map +0 -1
  305. package/resolver/app/abstractions/ResolverRecord.js.map +0 -1
  306. package/resolver/app/bundler/types.js.map +0 -1
  307. package/resolver/app/data/types.js.map +0 -1
  308. package/resolver/app/fetcher/types.js.map +0 -1
  309. package/resolver/app/ingestor/types.js.map +0 -1
  310. package/resolver/app/storer/types.js.map +0 -1
  311. package/resolver/deployment/types.js.map +0 -1
  312. package/resolver/recordTypes/fileManager/types.js.map +0 -1
  313. package/resolver/recordTypes/users/types.js.map +0 -1
  314. package/sync/handler/types.js.map +0 -1
  315. package/sync/types.js.map +0 -1
  316. package/worker/actions/copyFile/types.js.map +0 -1
  317. package/worker/actions/createUser/types.js.map +0 -1
  318. package/worker/actions/deleteFile/types.js.map +0 -1
  319. package/worker/actions/deleteUser/types.js.map +0 -1
  320. package/worker/actions/updateUser/types.js.map +0 -1
  321. package/worker/types.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"names":["_index","require","_bytes","_interopRequireDefault","_utils","CopyFile","constructor","params","createS3Client","sourceRegion","targetRegion","maxConcurrency","minPartSize","maxPartSize","sourceClient","region","targetClient","minPartSizeBytes","parseByteSize","maxPartSizeBytes","Error","copy","key","sourceBucket","targetBucket","sourceHead","headObject","client","bucket","ContentLength","ETag","targetHead","totalSize","partSize","Math","max","min","ceil","uploadId","createMultipartUpload","targetKey","completedParts","partNumber","start","promises","active","end","copyPromise","uploadPartCopy","sourceKey","push","Promise","race","all","completeMultipartUpload","ex","abortMultipartUpload","copyMetadata","console","error","log","convertException","value","parsed","bytes","parse","typeOfValue","input","Bucket","Key","command","HeadObjectCommand","result","send","$metadata","httpStatusCode","name","CreateMultipartUploadCommand","response","UploadId","PartNumber","CopySource","encodeURIComponent","CopySourceRange","UploadPartCopyCommand","CopyPartResult","sortedParts","sort","a","b","MultipartUpload","Parts","CompleteMultipartUploadCommand","AbortMultipartUploadCommand","metadataKey","sourceMetadata","targetMetadata","catch","CopyObjectCommand","exports"],"sources":["CopyFile.ts"],"sourcesContent":["import type {\n AbortMultipartUploadCommandInput,\n CompletedPart,\n CompleteMultipartUploadCommandInput,\n CopyObjectCommandInput,\n CopyObjectCommandOutput,\n CreateMultipartUploadCommandInput,\n HeadObjectCommandInput,\n S3Client,\n S3ClientConfig,\n UploadPartCopyCommandInput\n} from \"@webiny/aws-sdk/client-s3/index.js\";\nimport {\n AbortMultipartUploadCommand,\n CompleteMultipartUploadCommand,\n CopyObjectCommand,\n CreateMultipartUploadCommand,\n HeadObjectCommand,\n UploadPartCopyCommand\n} from \"@webiny/aws-sdk/client-s3/index.js\";\nimport bytes from \"bytes\";\nimport { convertException } from \"@webiny/utils\";\n\ntype ByteSize = number | `${number}B` | `${number}KB` | `${number}MB` | `${number}GB`;\n\nexport interface ICopyFileParams {\n createS3Client: (config: Partial<S3ClientConfig>) => Pick<S3Client, \"send\">;\n sourceRegion: string;\n targetRegion: string;\n maxConcurrency?: number;\n minPartSize?: ByteSize;\n maxPartSize?: ByteSize;\n}\n\nexport interface ICopyParams {\n key: string;\n sourceBucket: string;\n targetBucket: string;\n}\n\nexport interface IHeadObjectParams {\n client: Pick<S3Client, \"send\">;\n bucket: string;\n key: string;\n}\n\nexport interface ICreateMultipartUploadParams {\n targetBucket: string;\n targetKey: string;\n}\n\nexport interface IUploadPartCopyParams {\n sourceBucket: string;\n sourceKey: string;\n targetBucket: string;\n targetKey: string;\n uploadId: string;\n partNumber: number;\n start: number;\n end: number;\n completedParts: CompletedPart[];\n}\n\nexport interface ICompleteMultipartUploadParams {\n targetBucket: string;\n targetKey: string;\n uploadId: string;\n completedParts: CompletedPart[];\n}\n\nexport interface IAbortMultipartUploadParams {\n targetBucket: string;\n targetKey: string;\n uploadId: string;\n}\n\ninterface ICopyMetadataParams {\n sourceBucket: string;\n targetBucket: string;\n key: string;\n}\n\nexport class CopyFile {\n private readonly sourceClient: Pick<S3Client, \"send\">;\n private readonly targetClient: Pick<S3Client, \"send\">;\n private readonly maxConcurrency: number;\n private readonly minPartSizeBytes: number;\n private readonly maxPartSizeBytes: number;\n\n public constructor(params: ICopyFileParams) {\n const {\n createS3Client,\n sourceRegion,\n targetRegion,\n maxConcurrency = 100,\n minPartSize = \"5MB\",\n maxPartSize = \"1GB\"\n } = params;\n\n this.sourceClient = createS3Client({\n region: sourceRegion\n });\n this.targetClient = createS3Client({\n region: targetRegion\n });\n this.maxConcurrency = maxConcurrency;\n\n this.minPartSizeBytes = this.parseByteSize(minPartSize);\n this.maxPartSizeBytes = this.parseByteSize(maxPartSize);\n\n if (this.minPartSizeBytes < 5 * 1024 * 1024) {\n throw new Error(\"minPartSize must be at least 5MB.\");\n }\n }\n\n public async copy(params: ICopyParams): Promise<void> {\n const { key, sourceBucket, targetBucket } = params;\n\n const sourceHead = await this.headObject({\n client: this.sourceClient,\n bucket: sourceBucket,\n key\n });\n\n if (!sourceHead?.ContentLength || !sourceHead.ETag) {\n throw new Error(\"Source object metadata is invalid or missing.\");\n }\n /**\n * If the target object already exists, we can skip the copy operation.\n */\n const targetHead = await this.headObject({\n client: this.targetClient,\n bucket: targetBucket,\n key\n });\n\n if (targetHead) {\n return;\n }\n\n const totalSize = sourceHead.ContentLength;\n let partSize = Math.max(\n this.minPartSizeBytes,\n Math.min(this.maxPartSizeBytes, Math.ceil(totalSize / this.maxConcurrency))\n );\n partSize = Math.min(partSize, totalSize);\n\n const uploadId = await this.createMultipartUpload({\n targetBucket,\n targetKey: key\n });\n const completedParts: CompletedPart[] = [];\n\n try {\n let partNumber = 1;\n let start = 0;\n const promises: Promise<void>[] = [];\n let active = 0;\n\n while (start < totalSize) {\n const end = Math.min(start + partSize - 1, totalSize - 1);\n\n const copyPromise = this.uploadPartCopy({\n sourceBucket,\n sourceKey: key,\n targetBucket,\n targetKey: key,\n uploadId,\n partNumber,\n start,\n end,\n completedParts\n });\n\n promises.push(copyPromise);\n active++;\n\n if (active >= this.maxConcurrency) {\n await Promise.race(promises);\n active--;\n }\n\n partNumber++;\n start += partSize;\n }\n\n await Promise.all(promises);\n /**\n * Complete the multipart upload with all the completed parts.\n */\n await this.completeMultipartUpload({\n targetBucket,\n targetKey: key,\n uploadId,\n completedParts\n });\n } catch (ex) {\n await this.abortMultipartUpload({ targetBucket, targetKey: key, uploadId });\n throw ex;\n }\n /**\n * And then copy the metadata file.\n */\n\n try {\n await this.copyMetadata({\n sourceBucket,\n targetBucket,\n key\n });\n } catch (ex) {\n console.error(\n `Failed to copy metadata for ${key} from ${sourceBucket} to ${targetBucket}.`\n );\n console.log(convertException(ex));\n }\n }\n\n private parseByteSize(value: ByteSize): number {\n if (typeof value === \"number\") {\n return value;\n }\n const parsed = bytes.parse(value);\n if (typeof parsed === \"number\") {\n return parsed;\n }\n const typeOfValue = typeof value;\n throw new Error(`Invalid byte size value type \"${typeOfValue}\".`);\n }\n\n private async headObject(params: IHeadObjectParams) {\n const { client, bucket, key } = params;\n const input: HeadObjectCommandInput = {\n Bucket: bucket,\n Key: key\n };\n const command = new HeadObjectCommand(input);\n try {\n const result = await client.send(command);\n if (result.$metadata?.httpStatusCode === 200) {\n return result;\n }\n } catch (ex) {\n if (ex.name === \"NotFound\" || ex.$metadata?.httpStatusCode === 404) {\n return null;\n }\n console.error(`Failed to head object ${key} in bucket ${bucket}.`);\n console.log(convertException(ex));\n }\n return null;\n }\n\n private async createMultipartUpload(params: ICreateMultipartUploadParams): Promise<string> {\n const { targetBucket, targetKey } = params;\n const input: CreateMultipartUploadCommandInput = {\n Bucket: targetBucket,\n Key: targetKey\n };\n const command = new CreateMultipartUploadCommand(input);\n const response = await this.targetClient.send(command);\n if (!response.UploadId) {\n throw new Error(\"Failed to create multipart upload.\");\n }\n return response.UploadId;\n }\n\n private async uploadPartCopy(params: IUploadPartCopyParams): Promise<void> {\n const {\n sourceBucket,\n sourceKey,\n targetBucket,\n targetKey,\n uploadId,\n partNumber,\n start,\n end,\n completedParts\n } = params;\n\n const input: UploadPartCopyCommandInput = {\n Bucket: targetBucket,\n Key: targetKey,\n UploadId: uploadId,\n PartNumber: partNumber,\n CopySource: encodeURIComponent(`${sourceBucket}/${sourceKey}`),\n CopySourceRange: `bytes=${start}-${end}`\n };\n\n const command = new UploadPartCopyCommand(input);\n const response = await this.targetClient.send(command);\n\n if (!response.CopyPartResult?.ETag) {\n throw new Error(`UploadPartCopy failed for part ${partNumber}`);\n }\n\n completedParts.push({\n ETag: response.CopyPartResult.ETag,\n PartNumber: partNumber\n });\n }\n\n private async completeMultipartUpload(params: ICompleteMultipartUploadParams) {\n const { targetBucket, targetKey, uploadId, completedParts } = params;\n\n const sortedParts = [...completedParts].sort((a, b) => {\n return a.PartNumber! - b.PartNumber!;\n });\n\n const input: CompleteMultipartUploadCommandInput = {\n Bucket: targetBucket,\n Key: targetKey,\n UploadId: uploadId,\n MultipartUpload: { Parts: sortedParts }\n };\n\n const command = new CompleteMultipartUploadCommand(input);\n return await this.targetClient.send(command);\n }\n\n private async abortMultipartUpload(params: IAbortMultipartUploadParams) {\n const { targetBucket, targetKey, uploadId } = params;\n\n const input: AbortMultipartUploadCommandInput = {\n Bucket: targetBucket,\n Key: targetKey,\n UploadId: uploadId\n };\n const command = new AbortMultipartUploadCommand(input);\n await this.targetClient.send(command);\n }\n\n private async copyMetadata(\n params: ICopyMetadataParams\n ): Promise<CopyObjectCommandOutput | null> {\n const { sourceBucket, targetBucket, key } = params;\n\n const metadataKey = `${key}.metadata`;\n\n const [sourceMetadata, targetMetadata] = await Promise.all([\n this.headObject({\n client: this.sourceClient,\n bucket: sourceBucket,\n key: metadataKey\n }).catch(() => null),\n this.headObject({\n client: this.targetClient,\n bucket: targetBucket,\n key: metadataKey\n }).catch(() => null)\n ]);\n /**\n * If the source metadata does not exist, we cannot copy it.\n */\n if (!sourceMetadata?.ETag) {\n return null;\n }\n /**\n * If the target metadata already exists, we can skip copying it.\n */\n if (targetMetadata) {\n return null;\n }\n\n const input: CopyObjectCommandInput = {\n Bucket: targetBucket,\n Key: metadataKey,\n CopySource: encodeURIComponent(`${sourceBucket}/${metadataKey}`)\n };\n\n const command = new CopyObjectCommand(input);\n\n return await this.targetClient.send(command);\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"worker/actions/copyFile/CopyFile.js","sources":["../../../../src/worker/actions/copyFile/CopyFile.ts"],"sourcesContent":["import type {\n AbortMultipartUploadCommandInput,\n CompletedPart,\n CompleteMultipartUploadCommandInput,\n CopyObjectCommandInput,\n CopyObjectCommandOutput,\n CreateMultipartUploadCommandInput,\n HeadObjectCommandInput,\n S3Client,\n S3ClientConfig,\n UploadPartCopyCommandInput\n} from \"@webiny/aws-sdk/client-s3/index.js\";\nimport {\n AbortMultipartUploadCommand,\n CompleteMultipartUploadCommand,\n CopyObjectCommand,\n CreateMultipartUploadCommand,\n HeadObjectCommand,\n UploadPartCopyCommand\n} from \"@webiny/aws-sdk/client-s3/index.js\";\nimport bytes from \"bytes\";\nimport { convertException } from \"@webiny/utils\";\n\ntype ByteSize = number | `${number}B` | `${number}KB` | `${number}MB` | `${number}GB`;\n\nexport interface ICopyFileParams {\n createS3Client: (config: Partial<S3ClientConfig>) => Pick<S3Client, \"send\">;\n sourceRegion: string;\n targetRegion: string;\n maxConcurrency?: number;\n minPartSize?: ByteSize;\n maxPartSize?: ByteSize;\n}\n\nexport interface ICopyParams {\n key: string;\n sourceBucket: string;\n targetBucket: string;\n}\n\nexport interface IHeadObjectParams {\n client: Pick<S3Client, \"send\">;\n bucket: string;\n key: string;\n}\n\nexport interface ICreateMultipartUploadParams {\n targetBucket: string;\n targetKey: string;\n}\n\nexport interface IUploadPartCopyParams {\n sourceBucket: string;\n sourceKey: string;\n targetBucket: string;\n targetKey: string;\n uploadId: string;\n partNumber: number;\n start: number;\n end: number;\n completedParts: CompletedPart[];\n}\n\nexport interface ICompleteMultipartUploadParams {\n targetBucket: string;\n targetKey: string;\n uploadId: string;\n completedParts: CompletedPart[];\n}\n\nexport interface IAbortMultipartUploadParams {\n targetBucket: string;\n targetKey: string;\n uploadId: string;\n}\n\ninterface ICopyMetadataParams {\n sourceBucket: string;\n targetBucket: string;\n key: string;\n}\n\nexport class CopyFile {\n private readonly sourceClient: Pick<S3Client, \"send\">;\n private readonly targetClient: Pick<S3Client, \"send\">;\n private readonly maxConcurrency: number;\n private readonly minPartSizeBytes: number;\n private readonly maxPartSizeBytes: number;\n\n public constructor(params: ICopyFileParams) {\n const {\n createS3Client,\n sourceRegion,\n targetRegion,\n maxConcurrency = 100,\n minPartSize = \"5MB\",\n maxPartSize = \"1GB\"\n } = params;\n\n this.sourceClient = createS3Client({\n region: sourceRegion\n });\n this.targetClient = createS3Client({\n region: targetRegion\n });\n this.maxConcurrency = maxConcurrency;\n\n this.minPartSizeBytes = this.parseByteSize(minPartSize);\n this.maxPartSizeBytes = this.parseByteSize(maxPartSize);\n\n if (this.minPartSizeBytes < 5 * 1024 * 1024) {\n throw new Error(\"minPartSize must be at least 5MB.\");\n }\n }\n\n public async copy(params: ICopyParams): Promise<void> {\n const { key, sourceBucket, targetBucket } = params;\n\n const sourceHead = await this.headObject({\n client: this.sourceClient,\n bucket: sourceBucket,\n key\n });\n\n if (!sourceHead?.ContentLength || !sourceHead.ETag) {\n throw new Error(\"Source object metadata is invalid or missing.\");\n }\n /**\n * If the target object already exists, we can skip the copy operation.\n */\n const targetHead = await this.headObject({\n client: this.targetClient,\n bucket: targetBucket,\n key\n });\n\n if (targetHead) {\n return;\n }\n\n const totalSize = sourceHead.ContentLength;\n let partSize = Math.max(\n this.minPartSizeBytes,\n Math.min(this.maxPartSizeBytes, Math.ceil(totalSize / this.maxConcurrency))\n );\n partSize = Math.min(partSize, totalSize);\n\n const uploadId = await this.createMultipartUpload({\n targetBucket,\n targetKey: key\n });\n const completedParts: CompletedPart[] = [];\n\n try {\n let partNumber = 1;\n let start = 0;\n const promises: Promise<void>[] = [];\n let active = 0;\n\n while (start < totalSize) {\n const end = Math.min(start + partSize - 1, totalSize - 1);\n\n const copyPromise = this.uploadPartCopy({\n sourceBucket,\n sourceKey: key,\n targetBucket,\n targetKey: key,\n uploadId,\n partNumber,\n start,\n end,\n completedParts\n });\n\n promises.push(copyPromise);\n active++;\n\n if (active >= this.maxConcurrency) {\n await Promise.race(promises);\n active--;\n }\n\n partNumber++;\n start += partSize;\n }\n\n await Promise.all(promises);\n /**\n * Complete the multipart upload with all the completed parts.\n */\n await this.completeMultipartUpload({\n targetBucket,\n targetKey: key,\n uploadId,\n completedParts\n });\n } catch (ex) {\n await this.abortMultipartUpload({ targetBucket, targetKey: key, uploadId });\n throw ex;\n }\n /**\n * And then copy the metadata file.\n */\n\n try {\n await this.copyMetadata({\n sourceBucket,\n targetBucket,\n key\n });\n } catch (ex) {\n console.error(\n `Failed to copy metadata for ${key} from ${sourceBucket} to ${targetBucket}.`\n );\n console.log(convertException(ex));\n }\n }\n\n private parseByteSize(value: ByteSize): number {\n if (typeof value === \"number\") {\n return value;\n }\n const parsed = bytes.parse(value);\n if (typeof parsed === \"number\") {\n return parsed;\n }\n const typeOfValue = typeof value;\n throw new Error(`Invalid byte size value type \"${typeOfValue}\".`);\n }\n\n private async headObject(params: IHeadObjectParams) {\n const { client, bucket, key } = params;\n const input: HeadObjectCommandInput = {\n Bucket: bucket,\n Key: key\n };\n const command = new HeadObjectCommand(input);\n try {\n const result = await client.send(command);\n if (result.$metadata?.httpStatusCode === 200) {\n return result;\n }\n } catch (ex) {\n if (ex.name === \"NotFound\" || ex.$metadata?.httpStatusCode === 404) {\n return null;\n }\n console.error(`Failed to head object ${key} in bucket ${bucket}.`);\n console.log(convertException(ex));\n }\n return null;\n }\n\n private async createMultipartUpload(params: ICreateMultipartUploadParams): Promise<string> {\n const { targetBucket, targetKey } = params;\n const input: CreateMultipartUploadCommandInput = {\n Bucket: targetBucket,\n Key: targetKey\n };\n const command = new CreateMultipartUploadCommand(input);\n const response = await this.targetClient.send(command);\n if (!response.UploadId) {\n throw new Error(\"Failed to create multipart upload.\");\n }\n return response.UploadId;\n }\n\n private async uploadPartCopy(params: IUploadPartCopyParams): Promise<void> {\n const {\n sourceBucket,\n sourceKey,\n targetBucket,\n targetKey,\n uploadId,\n partNumber,\n start,\n end,\n completedParts\n } = params;\n\n const input: UploadPartCopyCommandInput = {\n Bucket: targetBucket,\n Key: targetKey,\n UploadId: uploadId,\n PartNumber: partNumber,\n CopySource: encodeURIComponent(`${sourceBucket}/${sourceKey}`),\n CopySourceRange: `bytes=${start}-${end}`\n };\n\n const command = new UploadPartCopyCommand(input);\n const response = await this.targetClient.send(command);\n\n if (!response.CopyPartResult?.ETag) {\n throw new Error(`UploadPartCopy failed for part ${partNumber}`);\n }\n\n completedParts.push({\n ETag: response.CopyPartResult.ETag,\n PartNumber: partNumber\n });\n }\n\n private async completeMultipartUpload(params: ICompleteMultipartUploadParams) {\n const { targetBucket, targetKey, uploadId, completedParts } = params;\n\n const sortedParts = [...completedParts].sort((a, b) => {\n return a.PartNumber! - b.PartNumber!;\n });\n\n const input: CompleteMultipartUploadCommandInput = {\n Bucket: targetBucket,\n Key: targetKey,\n UploadId: uploadId,\n MultipartUpload: { Parts: sortedParts }\n };\n\n const command = new CompleteMultipartUploadCommand(input);\n return await this.targetClient.send(command);\n }\n\n private async abortMultipartUpload(params: IAbortMultipartUploadParams) {\n const { targetBucket, targetKey, uploadId } = params;\n\n const input: AbortMultipartUploadCommandInput = {\n Bucket: targetBucket,\n Key: targetKey,\n UploadId: uploadId\n };\n const command = new AbortMultipartUploadCommand(input);\n await this.targetClient.send(command);\n }\n\n private async copyMetadata(\n params: ICopyMetadataParams\n ): Promise<CopyObjectCommandOutput | null> {\n const { sourceBucket, targetBucket, key } = params;\n\n const metadataKey = `${key}.metadata`;\n\n const [sourceMetadata, targetMetadata] = await Promise.all([\n this.headObject({\n client: this.sourceClient,\n bucket: sourceBucket,\n key: metadataKey\n }).catch(() => null),\n this.headObject({\n client: this.targetClient,\n bucket: targetBucket,\n key: metadataKey\n }).catch(() => null)\n ]);\n /**\n * If the source metadata does not exist, we cannot copy it.\n */\n if (!sourceMetadata?.ETag) {\n return null;\n }\n /**\n * If the target metadata already exists, we can skip copying it.\n */\n if (targetMetadata) {\n return null;\n }\n\n const input: CopyObjectCommandInput = {\n Bucket: targetBucket,\n Key: metadataKey,\n CopySource: encodeURIComponent(`${sourceBucket}/${metadataKey}`)\n };\n\n const command = new CopyObjectCommand(input);\n\n return await this.targetClient.send(command);\n }\n}\n"],"names":["CopyFile","params","createS3Client","sourceRegion","targetRegion","maxConcurrency","minPartSize","maxPartSize","Error","key","sourceBucket","targetBucket","sourceHead","targetHead","totalSize","partSize","Math","uploadId","completedParts","partNumber","start","promises","active","end","copyPromise","Promise","ex","console","convertException","value","parsed","bytes","typeOfValue","client","bucket","input","command","HeadObjectCommand","result","targetKey","CreateMultipartUploadCommand","response","sourceKey","encodeURIComponent","UploadPartCopyCommand","sortedParts","a","b","CompleteMultipartUploadCommand","AbortMultipartUploadCommand","metadataKey","sourceMetadata","targetMetadata","CopyObjectCommand"],"mappings":"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"}
@@ -3,4 +3,4 @@ import type { ICopyFileActionEvent } from "./types.js";
3
3
  export interface ICreateCopyFileActionParams {
4
4
  createS3Client: (config: Partial<S3ClientConfig>) => Pick<S3Client, "send">;
5
5
  }
6
- export declare const createCopyFileAction: ({ createS3Client }: ICreateCopyFileActionParams) => import("../../plugins/WorkerActionPlugin.js").WorkerActionPlugin<ICopyFileActionEvent>;
6
+ export declare const createCopyFileAction: ({ createS3Client }: ICreateCopyFileActionParams) => import("~/worker/plugins/WorkerActionPlugin.js").WorkerActionPlugin<ICopyFileActionEvent>;
@@ -1,47 +1,32 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.createCopyFileAction = void 0;
7
- var _WorkerActionPlugin = require("../../plugins/WorkerActionPlugin.js");
8
- var _CopyFile = require("./CopyFile.js");
9
- var _copyFileSchema = require("./copyFileSchema.js");
10
- var _logValidationError = require("../logValidationError.js");
11
- const createCopyFileAction = ({
12
- createS3Client
13
- }) => {
14
- return (0, _WorkerActionPlugin.createWorkerActionPlugin)({
15
- name: "sync.worker.action.copyFile",
16
- parse(input) {
17
- const schema = (0, _copyFileSchema.createCopyFileSchema)();
18
- const result = schema.safeParse(input);
19
- if (!result.success || result.error) {
20
- (0, _logValidationError.logValidationError)(result.error);
21
- return undefined;
22
- }
23
- return result.data;
24
- },
25
- async handle(params) {
26
- const {
27
- data
28
- } = params;
29
- const copyFile = new _CopyFile.CopyFile({
30
- createS3Client,
31
- sourceRegion: data.source.region,
32
- targetRegion: data.target.region,
33
- maxConcurrency: undefined,
34
- maxPartSize: undefined,
35
- minPartSize: undefined
36
- });
37
- return copyFile.copy({
38
- key: data.key,
39
- sourceBucket: data.source.bucket,
40
- targetBucket: data.target.bucket
41
- });
42
- }
43
- });
44
- };
45
- exports.createCopyFileAction = createCopyFileAction;
1
+ import { createWorkerActionPlugin } from "../../plugins/WorkerActionPlugin.js";
2
+ import { CopyFile } from "./CopyFile.js";
3
+ import { createCopyFileSchema } from "./copyFileSchema.js";
4
+ import { logValidationError } from "../logValidationError.js";
5
+ const createCopyFileAction = ({ createS3Client })=>createWorkerActionPlugin({
6
+ name: "sync.worker.action.copyFile",
7
+ parse (input) {
8
+ const schema = createCopyFileSchema();
9
+ const result = schema.safeParse(input);
10
+ if (!result.success || result.error) return void logValidationError(result.error);
11
+ return result.data;
12
+ },
13
+ async handle (params) {
14
+ const { data } = params;
15
+ const copyFile = new CopyFile({
16
+ createS3Client,
17
+ sourceRegion: data.source.region,
18
+ targetRegion: data.target.region,
19
+ maxConcurrency: void 0,
20
+ maxPartSize: void 0,
21
+ minPartSize: void 0
22
+ });
23
+ return copyFile.copy({
24
+ key: data.key,
25
+ sourceBucket: data.source.bucket,
26
+ targetBucket: data.target.bucket
27
+ });
28
+ }
29
+ });
30
+ export { createCopyFileAction };
46
31
 
47
32
  //# sourceMappingURL=copyFileAction.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_WorkerActionPlugin","require","_CopyFile","_copyFileSchema","_logValidationError","createCopyFileAction","createS3Client","createWorkerActionPlugin","name","parse","input","schema","createCopyFileSchema","result","safeParse","success","error","logValidationError","undefined","data","handle","params","copyFile","CopyFile","sourceRegion","source","region","targetRegion","target","maxConcurrency","maxPartSize","minPartSize","copy","key","sourceBucket","bucket","targetBucket","exports"],"sources":["copyFileAction.ts"],"sourcesContent":["import { createWorkerActionPlugin } from \"~/worker/plugins/WorkerActionPlugin.js\";\nimport { CopyFile } from \"./CopyFile.js\";\nimport type { S3Client, S3ClientConfig } from \"@webiny/aws-sdk/client-s3/index.js\";\nimport type { ICopyFileActionEvent } from \"./types.js\";\nimport { createCopyFileSchema } from \"./copyFileSchema.js\";\nimport { logValidationError } from \"~/worker/actions/logValidationError.js\";\n\nexport interface ICreateCopyFileActionParams {\n createS3Client: (config: Partial<S3ClientConfig>) => Pick<S3Client, \"send\">;\n}\n\nexport const createCopyFileAction = ({ createS3Client }: ICreateCopyFileActionParams) => {\n return createWorkerActionPlugin<ICopyFileActionEvent>({\n name: \"sync.worker.action.copyFile\",\n parse(input) {\n const schema = createCopyFileSchema();\n const result = schema.safeParse(input);\n if (!result.success || result.error) {\n logValidationError(result.error);\n return undefined;\n }\n return result.data;\n },\n async handle(params) {\n const { data } = params;\n const copyFile = new CopyFile({\n createS3Client,\n sourceRegion: data.source.region,\n targetRegion: data.target.region,\n maxConcurrency: undefined,\n maxPartSize: undefined,\n minPartSize: undefined\n });\n return copyFile.copy({\n key: data.key,\n sourceBucket: data.source.bucket,\n targetBucket: data.target.bucket\n });\n }\n });\n};\n"],"mappings":";;;;;;AAAA,IAAAA,mBAAA,GAAAC,OAAA;AACA,IAAAC,SAAA,GAAAD,OAAA;AAGA,IAAAE,eAAA,GAAAF,OAAA;AACA,IAAAG,mBAAA,GAAAH,OAAA;AAMO,MAAMI,oBAAoB,GAAGA,CAAC;EAAEC;AAA4C,CAAC,KAAK;EACrF,OAAO,IAAAC,4CAAwB,EAAuB;IAClDC,IAAI,EAAE,6BAA6B;IACnCC,KAAKA,CAACC,KAAK,EAAE;MACT,MAAMC,MAAM,GAAG,IAAAC,oCAAoB,EAAC,CAAC;MACrC,MAAMC,MAAM,GAAGF,MAAM,CAACG,SAAS,CAACJ,KAAK,CAAC;MACtC,IAAI,CAACG,MAAM,CAACE,OAAO,IAAIF,MAAM,CAACG,KAAK,EAAE;QACjC,IAAAC,sCAAkB,EAACJ,MAAM,CAACG,KAAK,CAAC;QAChC,OAAOE,SAAS;MACpB;MACA,OAAOL,MAAM,CAACM,IAAI;IACtB,CAAC;IACD,MAAMC,MAAMA,CAACC,MAAM,EAAE;MACjB,MAAM;QAAEF;MAAK,CAAC,GAAGE,MAAM;MACvB,MAAMC,QAAQ,GAAG,IAAIC,kBAAQ,CAAC;QAC1BjB,cAAc;QACdkB,YAAY,EAAEL,IAAI,CAACM,MAAM,CAACC,MAAM;QAChCC,YAAY,EAAER,IAAI,CAACS,MAAM,CAACF,MAAM;QAChCG,cAAc,EAAEX,SAAS;QACzBY,WAAW,EAAEZ,SAAS;QACtBa,WAAW,EAAEb;MACjB,CAAC,CAAC;MACF,OAAOI,QAAQ,CAACU,IAAI,CAAC;QACjBC,GAAG,EAAEd,IAAI,CAACc,GAAG;QACbC,YAAY,EAAEf,IAAI,CAACM,MAAM,CAACU,MAAM;QAChCC,YAAY,EAAEjB,IAAI,CAACS,MAAM,CAACO;MAC9B,CAAC,CAAC;IACN;EACJ,CAAC,CAAC;AACN,CAAC;AAACE,OAAA,CAAAhC,oBAAA,GAAAA,oBAAA","ignoreList":[]}
1
+ {"version":3,"file":"worker/actions/copyFile/copyFileAction.js","sources":["../../../../src/worker/actions/copyFile/copyFileAction.ts"],"sourcesContent":["import { createWorkerActionPlugin } from \"~/worker/plugins/WorkerActionPlugin.js\";\nimport { CopyFile } from \"./CopyFile.js\";\nimport type { S3Client, S3ClientConfig } from \"@webiny/aws-sdk/client-s3/index.js\";\nimport type { ICopyFileActionEvent } from \"./types.js\";\nimport { createCopyFileSchema } from \"./copyFileSchema.js\";\nimport { logValidationError } from \"~/worker/actions/logValidationError.js\";\n\nexport interface ICreateCopyFileActionParams {\n createS3Client: (config: Partial<S3ClientConfig>) => Pick<S3Client, \"send\">;\n}\n\nexport const createCopyFileAction = ({ createS3Client }: ICreateCopyFileActionParams) => {\n return createWorkerActionPlugin<ICopyFileActionEvent>({\n name: \"sync.worker.action.copyFile\",\n parse(input) {\n const schema = createCopyFileSchema();\n const result = schema.safeParse(input);\n if (!result.success || result.error) {\n logValidationError(result.error);\n return undefined;\n }\n return result.data;\n },\n async handle(params) {\n const { data } = params;\n const copyFile = new CopyFile({\n createS3Client,\n sourceRegion: data.source.region,\n targetRegion: data.target.region,\n maxConcurrency: undefined,\n maxPartSize: undefined,\n minPartSize: undefined\n });\n return copyFile.copy({\n key: data.key,\n sourceBucket: data.source.bucket,\n targetBucket: data.target.bucket\n });\n }\n });\n};\n"],"names":["createCopyFileAction","createS3Client","createWorkerActionPlugin","input","schema","createCopyFileSchema","result","logValidationError","params","data","copyFile","CopyFile","undefined"],"mappings":";;;;AAWO,MAAMA,uBAAuB,CAAC,EAAEC,cAAc,EAA+B,GACzEC,yBAA+C;QAClD,MAAM;QACN,OAAMC,KAAK;YACP,MAAMC,SAASC;YACf,MAAMC,SAASF,OAAO,SAAS,CAACD;YAChC,IAAI,CAACG,OAAO,OAAO,IAAIA,OAAO,KAAK,EAAE,YACjCC,mBAAmBD,OAAO,KAAK;YAGnC,OAAOA,OAAO,IAAI;QACtB;QACA,MAAM,QAAOE,MAAM;YACf,MAAM,EAAEC,IAAI,EAAE,GAAGD;YACjB,MAAME,WAAW,IAAIC,SAAS;gBAC1BV;gBACA,cAAcQ,KAAK,MAAM,CAAC,MAAM;gBAChC,cAAcA,KAAK,MAAM,CAAC,MAAM;gBAChC,gBAAgBG;gBAChB,aAAaA;gBACb,aAAaA;YACjB;YACA,OAAOF,SAAS,IAAI,CAAC;gBACjB,KAAKD,KAAK,GAAG;gBACb,cAAcA,KAAK,MAAM,CAAC,MAAM;gBAChC,cAAcA,KAAK,MAAM,CAAC,MAAM;YACpC;QACJ;IACJ"}
@@ -1,47 +1,15 @@
1
1
  import zod from "zod";
2
2
  export declare const createCopyFileSchema: () => zod.ZodObject<{
3
- action: zod.ZodEnum<["copyFile"]>;
3
+ action: zod.ZodEnum<{
4
+ copyFile: "copyFile";
5
+ }>;
4
6
  key: zod.ZodString;
5
7
  source: zod.ZodObject<{
6
8
  bucket: zod.ZodString;
7
9
  region: zod.ZodString;
8
- }, "strip", zod.ZodTypeAny, {
9
- region: string;
10
- bucket: string;
11
- }, {
12
- region: string;
13
- bucket: string;
14
- }>;
10
+ }, zod.core.$strip>;
15
11
  target: zod.ZodObject<{
16
12
  bucket: zod.ZodString;
17
13
  region: zod.ZodString;
18
- }, "strip", zod.ZodTypeAny, {
19
- region: string;
20
- bucket: string;
21
- }, {
22
- region: string;
23
- bucket: string;
24
- }>;
25
- }, "strip", zod.ZodTypeAny, {
26
- key: string;
27
- source: {
28
- region: string;
29
- bucket: string;
30
- };
31
- action: "copyFile";
32
- target: {
33
- region: string;
34
- bucket: string;
35
- };
36
- }, {
37
- key: string;
38
- source: {
39
- region: string;
40
- bucket: string;
41
- };
42
- action: "copyFile";
43
- target: {
44
- region: string;
45
- bucket: string;
46
- };
47
- }>;
14
+ }, zod.core.$strip>;
15
+ }, zod.core.$strip>;
@@ -1,25 +1,16 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.createCopyFileSchema = void 0;
8
- var _zod = _interopRequireDefault(require("zod"));
9
- const createDataSchema = type => {
10
- return _zod.default.object({
11
- bucket: _zod.default.string().min(1, `${type} Bucket is required.`),
12
- region: _zod.default.string().min(1, `${type} Region is required.`)
13
- });
14
- };
15
- const createCopyFileSchema = () => {
16
- return _zod.default.object({
17
- action: _zod.default.enum(["copyFile"]),
18
- key: _zod.default.string().min(1, "Key is required."),
19
- source: createDataSchema("Source"),
20
- target: createDataSchema("Target")
21
- });
22
- };
23
- exports.createCopyFileSchema = createCopyFileSchema;
1
+ import zod from "zod";
2
+ const createDataSchema = (type)=>zod.object({
3
+ bucket: zod.string().min(1, `${type} Bucket is required.`),
4
+ region: zod.string().min(1, `${type} Region is required.`)
5
+ });
6
+ const createCopyFileSchema = ()=>zod.object({
7
+ action: zod["enum"]([
8
+ "copyFile"
9
+ ]),
10
+ key: zod.string().min(1, "Key is required."),
11
+ source: createDataSchema("Source"),
12
+ target: createDataSchema("Target")
13
+ });
14
+ export { createCopyFileSchema };
24
15
 
25
16
  //# sourceMappingURL=copyFileSchema.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_zod","_interopRequireDefault","require","createDataSchema","type","zod","object","bucket","string","min","region","createCopyFileSchema","action","enum","key","source","target","exports"],"sources":["copyFileSchema.ts"],"sourcesContent":["import zod from \"zod\";\n\nconst createDataSchema = (type: string) => {\n return zod.object({\n bucket: zod.string().min(1, `${type} Bucket is required.`),\n region: zod.string().min(1, `${type} Region is required.`)\n });\n};\nexport const createCopyFileSchema = () => {\n return zod.object({\n action: zod.enum([\"copyFile\"]),\n key: zod.string().min(1, \"Key is required.\"),\n source: createDataSchema(\"Source\"),\n target: createDataSchema(\"Target\")\n });\n};\n"],"mappings":";;;;;;;AAAA,IAAAA,IAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEA,MAAMC,gBAAgB,GAAIC,IAAY,IAAK;EACvC,OAAOC,YAAG,CAACC,MAAM,CAAC;IACdC,MAAM,EAAEF,YAAG,CAACG,MAAM,CAAC,CAAC,CAACC,GAAG,CAAC,CAAC,EAAE,GAAGL,IAAI,sBAAsB,CAAC;IAC1DM,MAAM,EAAEL,YAAG,CAACG,MAAM,CAAC,CAAC,CAACC,GAAG,CAAC,CAAC,EAAE,GAAGL,IAAI,sBAAsB;EAC7D,CAAC,CAAC;AACN,CAAC;AACM,MAAMO,oBAAoB,GAAGA,CAAA,KAAM;EACtC,OAAON,YAAG,CAACC,MAAM,CAAC;IACdM,MAAM,EAAEP,YAAG,CAACQ,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC;IAC9BC,GAAG,EAAET,YAAG,CAACG,MAAM,CAAC,CAAC,CAACC,GAAG,CAAC,CAAC,EAAE,kBAAkB,CAAC;IAC5CM,MAAM,EAAEZ,gBAAgB,CAAC,QAAQ,CAAC;IAClCa,MAAM,EAAEb,gBAAgB,CAAC,QAAQ;EACrC,CAAC,CAAC;AACN,CAAC;AAACc,OAAA,CAAAN,oBAAA,GAAAA,oBAAA","ignoreList":[]}
1
+ {"version":3,"file":"worker/actions/copyFile/copyFileSchema.js","sources":["../../../../src/worker/actions/copyFile/copyFileSchema.ts"],"sourcesContent":["import zod from \"zod\";\n\nconst createDataSchema = (type: string) => {\n return zod.object({\n bucket: zod.string().min(1, `${type} Bucket is required.`),\n region: zod.string().min(1, `${type} Region is required.`)\n });\n};\nexport const createCopyFileSchema = () => {\n return zod.object({\n action: zod.enum([\"copyFile\"]),\n key: zod.string().min(1, \"Key is required.\"),\n source: createDataSchema(\"Source\"),\n target: createDataSchema(\"Target\")\n });\n};\n"],"names":["createDataSchema","type","zod","createCopyFileSchema"],"mappings":";AAEA,MAAMA,mBAAmB,CAACC,OACfC,IAAI,MAAM,CAAC;QACd,QAAQA,IAAI,MAAM,GAAG,GAAG,CAAC,GAAG,GAAGD,KAAK,oBAAoB,CAAC;QACzD,QAAQC,IAAI,MAAM,GAAG,GAAG,CAAC,GAAG,GAAGD,KAAK,oBAAoB,CAAC;IAC7D;AAEG,MAAME,uBAAuB,IACzBD,IAAI,MAAM,CAAC;QACd,QAAQA,GAAG,CAAHA,OAAQ,CAAC;YAAC;SAAW;QAC7B,KAAKA,IAAI,MAAM,GAAG,GAAG,CAAC,GAAG;QACzB,QAAQF,iBAAiB;QACzB,QAAQA,iBAAiB;IAC7B"}
@@ -1,7 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
-
7
- //# sourceMappingURL=types.js.map
@@ -1,4 +1,4 @@
1
- import type { CognitoIdentityProvider, CognitoIdentityProviderClientConfig } from "@webiny/aws-sdk/client-cognito-identity-provider";
1
+ import type { CognitoIdentityProvider, CognitoIdentityProviderClientConfig } from "@webiny/aws-sdk/client-cognito-identity-provider/index.js";
2
2
  export interface ICreateUserParams {
3
3
  createCognitoProvider: (config: Partial<CognitoIdentityProviderClientConfig>) => Pick<CognitoIdentityProvider, "send">;
4
4
  }
@@ -1,90 +1,60 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.CreateUser = void 0;
7
- var _clientCognitoIdentityProvider = require("@webiny/aws-sdk/client-cognito-identity-provider");
8
- var _exception = require("@webiny/utils/exception.js");
9
- var _removeCognitoUserAttributes = require("../removeCognitoUserAttributes.js");
1
+ import { AdminCreateUserCommand, AdminGetUserCommand } from "@webiny/aws-sdk/client-cognito-identity-provider/index.js";
2
+ import { convertException } from "@webiny/utils/exception.js";
3
+ import { removeCognitoUserAttributes } from "../removeCognitoUserAttributes.js";
10
4
  class CreateUser {
11
- constructor(params) {
12
- this.createCognitoProvider = params.createCognitoProvider;
13
- }
14
- async create(params) {
15
- const {
16
- sourceUserPoolId,
17
- targetUserPoolId,
18
- username,
19
- targetRegion,
20
- sourceRegion
21
- } = params;
22
- const sourceProvider = this.createCognitoProvider({
23
- region: sourceRegion
24
- });
25
- const sourceUser = await this.getUser({
26
- userPoolId: sourceUserPoolId,
27
- username,
28
- provider: sourceProvider
29
- });
30
- if (!sourceUser) {
31
- throw new Error(`Source user "${username}" not found in pool "${sourceUserPoolId}".`);
32
- }
33
- const targetProvider = this.createCognitoProvider({
34
- region: targetRegion
35
- });
36
- const targetUser = await this.getUser({
37
- userPoolId: targetUserPoolId,
38
- username,
39
- provider: targetProvider
40
- });
41
- if (targetUser) {
42
- console.log(`Target user "${username}" already exists in pool "${targetUserPoolId}".`);
43
- return;
5
+ constructor(params){
6
+ this.createCognitoProvider = params.createCognitoProvider;
44
7
  }
45
- /**
46
- * TODO: verify that this is everything that is required to create a user.
47
- * We cannot just spread the sourceUser as it causes an exception:
48
- * `Cannot modify the non-mutable attribute sub`
49
- */
50
- const input = {
51
- DesiredDeliveryMediums: [],
52
- ForceAliasCreation: false,
53
- MessageAction: "SUPPRESS",
54
- UserAttributes: (0, _removeCognitoUserAttributes.removeCognitoUserAttributes)(sourceUser.UserAttributes || []),
55
- UserPoolId: targetUserPoolId,
56
- Username: username
57
- };
58
- const cmd = new _clientCognitoIdentityProvider.AdminCreateUserCommand(input);
59
- try {
60
- await targetProvider.send(cmd);
61
- } catch (ex) {
62
- console.error(`Failed to create user "${username}" in pool "${targetUserPoolId}". More info in next log line.`);
63
- console.log((0, _exception.convertException)(ex));
8
+ async create(params) {
9
+ const { sourceUserPoolId, targetUserPoolId, username, targetRegion, sourceRegion } = params;
10
+ const sourceProvider = this.createCognitoProvider({
11
+ region: sourceRegion
12
+ });
13
+ const sourceUser = await this.getUser({
14
+ userPoolId: sourceUserPoolId,
15
+ username,
16
+ provider: sourceProvider
17
+ });
18
+ if (!sourceUser) throw new Error(`Source user "${username}" not found in pool "${sourceUserPoolId}".`);
19
+ const targetProvider = this.createCognitoProvider({
20
+ region: targetRegion
21
+ });
22
+ const targetUser = await this.getUser({
23
+ userPoolId: targetUserPoolId,
24
+ username,
25
+ provider: targetProvider
26
+ });
27
+ if (targetUser) return void console.log(`Target user "${username}" already exists in pool "${targetUserPoolId}".`);
28
+ const input = {
29
+ DesiredDeliveryMediums: [],
30
+ ForceAliasCreation: false,
31
+ MessageAction: "SUPPRESS",
32
+ UserAttributes: removeCognitoUserAttributes(sourceUser.UserAttributes || []),
33
+ UserPoolId: targetUserPoolId,
34
+ Username: username
35
+ };
36
+ const cmd = new AdminCreateUserCommand(input);
37
+ try {
38
+ await targetProvider.send(cmd);
39
+ } catch (ex) {
40
+ console.error(`Failed to create user "${username}" in pool "${targetUserPoolId}". More info in next log line.`);
41
+ console.log(convertException(ex));
42
+ }
64
43
  }
65
- }
66
- async getUser(params) {
67
- const {
68
- userPoolId,
69
- username,
70
- provider
71
- } = params;
72
- const input = {
73
- UserPoolId: userPoolId,
74
- Username: username
75
- };
76
- const cmd = new _clientCognitoIdentityProvider.AdminGetUserCommand(input);
77
- try {
78
- const result = await provider.send(cmd);
79
- if (result.$metadata?.httpStatusCode === 200) {
80
- return result;
81
- }
82
- } catch (ex) {
83
- //
44
+ async getUser(params) {
45
+ const { userPoolId, username, provider } = params;
46
+ const input = {
47
+ UserPoolId: userPoolId,
48
+ Username: username
49
+ };
50
+ const cmd = new AdminGetUserCommand(input);
51
+ try {
52
+ const result = await provider.send(cmd);
53
+ if (result.$metadata?.httpStatusCode === 200) return result;
54
+ } catch {}
55
+ return null;
84
56
  }
85
- return null;
86
- }
87
57
  }
88
- exports.CreateUser = CreateUser;
58
+ export { CreateUser };
89
59
 
90
60
  //# sourceMappingURL=CreateUser.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_clientCognitoIdentityProvider","require","_exception","_removeCognitoUserAttributes","CreateUser","constructor","params","createCognitoProvider","create","sourceUserPoolId","targetUserPoolId","username","targetRegion","sourceRegion","sourceProvider","region","sourceUser","getUser","userPoolId","provider","Error","targetProvider","targetUser","console","log","input","DesiredDeliveryMediums","ForceAliasCreation","MessageAction","UserAttributes","removeCognitoUserAttributes","UserPoolId","Username","cmd","AdminCreateUserCommand","send","ex","error","convertException","AdminGetUserCommand","result","$metadata","httpStatusCode","exports"],"sources":["CreateUser.ts"],"sourcesContent":["import type {\n AdminCreateUserCommandInput,\n AdminGetUserCommandInput,\n AdminGetUserCommandOutput,\n CognitoIdentityProvider,\n CognitoIdentityProviderClientConfig\n} from \"@webiny/aws-sdk/client-cognito-identity-provider\";\nimport {\n AdminCreateUserCommand,\n AdminGetUserCommand\n} from \"@webiny/aws-sdk/client-cognito-identity-provider\";\nimport { convertException } from \"@webiny/utils/exception.js\";\nimport { removeCognitoUserAttributes } from \"~/worker/actions/removeCognitoUserAttributes.js\";\n\nexport interface ICreateUserParams {\n createCognitoProvider: (\n config: Partial<CognitoIdentityProviderClientConfig>\n ) => Pick<CognitoIdentityProvider, \"send\">;\n}\n\nexport interface ICreateUserCreateParams {\n username: string;\n sourceRegion: string;\n targetRegion: string;\n sourceUserPoolId: string;\n targetUserPoolId: string;\n}\n\ninterface ICreateUserGetUserParams {\n userPoolId: string;\n username: string;\n provider: Pick<CognitoIdentityProvider, \"send\">;\n}\n\nexport class CreateUser {\n private readonly createCognitoProvider: (\n config: Partial<CognitoIdentityProviderClientConfig>\n ) => Pick<CognitoIdentityProvider, \"send\">;\n\n public constructor(params: ICreateUserParams) {\n this.createCognitoProvider = params.createCognitoProvider;\n }\n\n public async create(params: ICreateUserCreateParams): Promise<void> {\n const { sourceUserPoolId, targetUserPoolId, username, targetRegion, sourceRegion } = params;\n\n const sourceProvider = this.createCognitoProvider({\n region: sourceRegion\n });\n\n const sourceUser = await this.getUser({\n userPoolId: sourceUserPoolId,\n username,\n provider: sourceProvider\n });\n if (!sourceUser) {\n throw new Error(`Source user \"${username}\" not found in pool \"${sourceUserPoolId}\".`);\n }\n const targetProvider = this.createCognitoProvider({\n region: targetRegion\n });\n const targetUser = await this.getUser({\n userPoolId: targetUserPoolId,\n username,\n provider: targetProvider\n });\n if (targetUser) {\n console.log(`Target user \"${username}\" already exists in pool \"${targetUserPoolId}\".`);\n return;\n }\n /**\n * TODO: verify that this is everything that is required to create a user.\n * We cannot just spread the sourceUser as it causes an exception:\n * `Cannot modify the non-mutable attribute sub`\n */\n const input: AdminCreateUserCommandInput = {\n DesiredDeliveryMediums: [],\n ForceAliasCreation: false,\n MessageAction: \"SUPPRESS\",\n UserAttributes: removeCognitoUserAttributes(sourceUser.UserAttributes || []),\n UserPoolId: targetUserPoolId,\n Username: username\n };\n\n const cmd = new AdminCreateUserCommand(input);\n\n try {\n await targetProvider.send(cmd);\n } catch (ex) {\n console.error(\n `Failed to create user \"${username}\" in pool \"${targetUserPoolId}\". More info in next log line.`\n );\n console.log(convertException(ex));\n }\n }\n\n private async getUser(\n params: ICreateUserGetUserParams\n ): Promise<AdminGetUserCommandOutput | null> {\n const { userPoolId, username, provider } = params;\n const input: AdminGetUserCommandInput = {\n UserPoolId: userPoolId,\n Username: username\n };\n\n const cmd = new AdminGetUserCommand(input);\n\n try {\n const result = await provider.send(cmd);\n if (result.$metadata?.httpStatusCode === 200) {\n return result;\n }\n } catch (ex) {\n //\n }\n return null;\n }\n}\n"],"mappings":";;;;;;AAOA,IAAAA,8BAAA,GAAAC,OAAA;AAIA,IAAAC,UAAA,GAAAD,OAAA;AACA,IAAAE,4BAAA,GAAAF,OAAA;AAsBO,MAAMG,UAAU,CAAC;EAKbC,WAAWA,CAACC,MAAyB,EAAE;IAC1C,IAAI,CAACC,qBAAqB,GAAGD,MAAM,CAACC,qBAAqB;EAC7D;EAEA,MAAaC,MAAMA,CAACF,MAA+B,EAAiB;IAChE,MAAM;MAAEG,gBAAgB;MAAEC,gBAAgB;MAAEC,QAAQ;MAAEC,YAAY;MAAEC;IAAa,CAAC,GAAGP,MAAM;IAE3F,MAAMQ,cAAc,GAAG,IAAI,CAACP,qBAAqB,CAAC;MAC9CQ,MAAM,EAAEF;IACZ,CAAC,CAAC;IAEF,MAAMG,UAAU,GAAG,MAAM,IAAI,CAACC,OAAO,CAAC;MAClCC,UAAU,EAAET,gBAAgB;MAC5BE,QAAQ;MACRQ,QAAQ,EAAEL;IACd,CAAC,CAAC;IACF,IAAI,CAACE,UAAU,EAAE;MACb,MAAM,IAAII,KAAK,CAAC,gBAAgBT,QAAQ,wBAAwBF,gBAAgB,IAAI,CAAC;IACzF;IACA,MAAMY,cAAc,GAAG,IAAI,CAACd,qBAAqB,CAAC;MAC9CQ,MAAM,EAAEH;IACZ,CAAC,CAAC;IACF,MAAMU,UAAU,GAAG,MAAM,IAAI,CAACL,OAAO,CAAC;MAClCC,UAAU,EAAER,gBAAgB;MAC5BC,QAAQ;MACRQ,QAAQ,EAAEE;IACd,CAAC,CAAC;IACF,IAAIC,UAAU,EAAE;MACZC,OAAO,CAACC,GAAG,CAAC,gBAAgBb,QAAQ,6BAA6BD,gBAAgB,IAAI,CAAC;MACtF;IACJ;IACA;AACR;AACA;AACA;AACA;IACQ,MAAMe,KAAkC,GAAG;MACvCC,sBAAsB,EAAE,EAAE;MAC1BC,kBAAkB,EAAE,KAAK;MACzBC,aAAa,EAAE,UAAU;MACzBC,cAAc,EAAE,IAAAC,wDAA2B,EAACd,UAAU,CAACa,cAAc,IAAI,EAAE,CAAC;MAC5EE,UAAU,EAAErB,gBAAgB;MAC5BsB,QAAQ,EAAErB;IACd,CAAC;IAED,MAAMsB,GAAG,GAAG,IAAIC,qDAAsB,CAACT,KAAK,CAAC;IAE7C,IAAI;MACA,MAAMJ,cAAc,CAACc,IAAI,CAACF,GAAG,CAAC;IAClC,CAAC,CAAC,OAAOG,EAAE,EAAE;MACTb,OAAO,CAACc,KAAK,CACT,0BAA0B1B,QAAQ,cAAcD,gBAAgB,gCACpE,CAAC;MACDa,OAAO,CAACC,GAAG,CAAC,IAAAc,2BAAgB,EAACF,EAAE,CAAC,CAAC;IACrC;EACJ;EAEA,MAAcnB,OAAOA,CACjBX,MAAgC,EACS;IACzC,MAAM;MAAEY,UAAU;MAAEP,QAAQ;MAAEQ;IAAS,CAAC,GAAGb,MAAM;IACjD,MAAMmB,KAA+B,GAAG;MACpCM,UAAU,EAAEb,UAAU;MACtBc,QAAQ,EAAErB;IACd,CAAC;IAED,MAAMsB,GAAG,GAAG,IAAIM,kDAAmB,CAACd,KAAK,CAAC;IAE1C,IAAI;MACA,MAAMe,MAAM,GAAG,MAAMrB,QAAQ,CAACgB,IAAI,CAACF,GAAG,CAAC;MACvC,IAAIO,MAAM,CAACC,SAAS,EAAEC,cAAc,KAAK,GAAG,EAAE;QAC1C,OAAOF,MAAM;MACjB;IACJ,CAAC,CAAC,OAAOJ,EAAE,EAAE;MACT;IAAA;IAEJ,OAAO,IAAI;EACf;AACJ;AAACO,OAAA,CAAAvC,UAAA,GAAAA,UAAA","ignoreList":[]}
1
+ {"version":3,"file":"worker/actions/createUser/CreateUser.js","sources":["../../../../src/worker/actions/createUser/CreateUser.ts"],"sourcesContent":["import type {\n AdminCreateUserCommandInput,\n AdminGetUserCommandInput,\n AdminGetUserCommandOutput,\n CognitoIdentityProvider,\n CognitoIdentityProviderClientConfig\n} from \"@webiny/aws-sdk/client-cognito-identity-provider/index.js\";\nimport {\n AdminCreateUserCommand,\n AdminGetUserCommand\n} from \"@webiny/aws-sdk/client-cognito-identity-provider/index.js\";\nimport { convertException } from \"@webiny/utils/exception.js\";\nimport { removeCognitoUserAttributes } from \"~/worker/actions/removeCognitoUserAttributes.js\";\n\nexport interface ICreateUserParams {\n createCognitoProvider: (\n config: Partial<CognitoIdentityProviderClientConfig>\n ) => Pick<CognitoIdentityProvider, \"send\">;\n}\n\nexport interface ICreateUserCreateParams {\n username: string;\n sourceRegion: string;\n targetRegion: string;\n sourceUserPoolId: string;\n targetUserPoolId: string;\n}\n\ninterface ICreateUserGetUserParams {\n userPoolId: string;\n username: string;\n provider: Pick<CognitoIdentityProvider, \"send\">;\n}\n\nexport class CreateUser {\n private readonly createCognitoProvider: (\n config: Partial<CognitoIdentityProviderClientConfig>\n ) => Pick<CognitoIdentityProvider, \"send\">;\n\n public constructor(params: ICreateUserParams) {\n this.createCognitoProvider = params.createCognitoProvider;\n }\n\n public async create(params: ICreateUserCreateParams): Promise<void> {\n const { sourceUserPoolId, targetUserPoolId, username, targetRegion, sourceRegion } = params;\n\n const sourceProvider = this.createCognitoProvider({\n region: sourceRegion\n });\n\n const sourceUser = await this.getUser({\n userPoolId: sourceUserPoolId,\n username,\n provider: sourceProvider\n });\n if (!sourceUser) {\n throw new Error(`Source user \"${username}\" not found in pool \"${sourceUserPoolId}\".`);\n }\n const targetProvider = this.createCognitoProvider({\n region: targetRegion\n });\n const targetUser = await this.getUser({\n userPoolId: targetUserPoolId,\n username,\n provider: targetProvider\n });\n if (targetUser) {\n console.log(`Target user \"${username}\" already exists in pool \"${targetUserPoolId}\".`);\n return;\n }\n /**\n * TODO: verify that this is everything that is required to create a user.\n * We cannot just spread the sourceUser as it causes an exception:\n * `Cannot modify the non-mutable attribute sub`\n */\n const input: AdminCreateUserCommandInput = {\n DesiredDeliveryMediums: [],\n ForceAliasCreation: false,\n MessageAction: \"SUPPRESS\",\n UserAttributes: removeCognitoUserAttributes(sourceUser.UserAttributes || []),\n UserPoolId: targetUserPoolId,\n Username: username\n };\n\n const cmd = new AdminCreateUserCommand(input);\n\n try {\n await targetProvider.send(cmd);\n } catch (ex) {\n console.error(\n `Failed to create user \"${username}\" in pool \"${targetUserPoolId}\". More info in next log line.`\n );\n console.log(convertException(ex));\n }\n }\n\n private async getUser(\n params: ICreateUserGetUserParams\n ): Promise<AdminGetUserCommandOutput | null> {\n const { userPoolId, username, provider } = params;\n const input: AdminGetUserCommandInput = {\n UserPoolId: userPoolId,\n Username: username\n };\n\n const cmd = new AdminGetUserCommand(input);\n\n try {\n const result = await provider.send(cmd);\n if (result.$metadata?.httpStatusCode === 200) {\n return result;\n }\n } catch {\n //\n }\n return null;\n }\n}\n"],"names":["CreateUser","params","sourceUserPoolId","targetUserPoolId","username","targetRegion","sourceRegion","sourceProvider","sourceUser","Error","targetProvider","targetUser","console","input","removeCognitoUserAttributes","cmd","AdminCreateUserCommand","ex","convertException","userPoolId","provider","AdminGetUserCommand","result"],"mappings":";;;AAkCO,MAAMA;IAKT,YAAmBC,MAAyB,CAAE;QAC1C,IAAI,CAAC,qBAAqB,GAAGA,OAAO,qBAAqB;IAC7D;IAEA,MAAa,OAAOA,MAA+B,EAAiB;QAChE,MAAM,EAAEC,gBAAgB,EAAEC,gBAAgB,EAAEC,QAAQ,EAAEC,YAAY,EAAEC,YAAY,EAAE,GAAGL;QAErF,MAAMM,iBAAiB,IAAI,CAAC,qBAAqB,CAAC;YAC9C,QAAQD;QACZ;QAEA,MAAME,aAAa,MAAM,IAAI,CAAC,OAAO,CAAC;YAClC,YAAYN;YACZE;YACA,UAAUG;QACd;QACA,IAAI,CAACC,YACD,MAAM,IAAIC,MAAM,CAAC,aAAa,EAAEL,SAAS,qBAAqB,EAAEF,iBAAiB,EAAE,CAAC;QAExF,MAAMQ,iBAAiB,IAAI,CAAC,qBAAqB,CAAC;YAC9C,QAAQL;QACZ;QACA,MAAMM,aAAa,MAAM,IAAI,CAAC,OAAO,CAAC;YAClC,YAAYR;YACZC;YACA,UAAUM;QACd;QACA,IAAIC,YAAY,YACZC,QAAQ,GAAG,CAAC,CAAC,aAAa,EAAER,SAAS,0BAA0B,EAAED,iBAAiB,EAAE,CAAC;QAQzF,MAAMU,QAAqC;YACvC,wBAAwB,EAAE;YAC1B,oBAAoB;YACpB,eAAe;YACf,gBAAgBC,4BAA4BN,WAAW,cAAc,IAAI,EAAE;YAC3E,YAAYL;YACZ,UAAUC;QACd;QAEA,MAAMW,MAAM,IAAIC,uBAAuBH;QAEvC,IAAI;YACA,MAAMH,eAAe,IAAI,CAACK;QAC9B,EAAE,OAAOE,IAAI;YACTL,QAAQ,KAAK,CACT,CAAC,uBAAuB,EAAER,SAAS,WAAW,EAAED,iBAAiB,8BAA8B,CAAC;YAEpGS,QAAQ,GAAG,CAACM,iBAAiBD;QACjC;IACJ;IAEA,MAAc,QACVhB,MAAgC,EACS;QACzC,MAAM,EAAEkB,UAAU,EAAEf,QAAQ,EAAEgB,QAAQ,EAAE,GAAGnB;QAC3C,MAAMY,QAAkC;YACpC,YAAYM;YACZ,UAAUf;QACd;QAEA,MAAMW,MAAM,IAAIM,oBAAoBR;QAEpC,IAAI;YACA,MAAMS,SAAS,MAAMF,SAAS,IAAI,CAACL;YACnC,IAAIO,OAAO,SAAS,EAAE,mBAAmB,KACrC,OAAOA;QAEf,EAAE,OAAM,CAER;QACA,OAAO;IACX;AACJ"}
@@ -1,6 +1,6 @@
1
- import type { ICreateUserActionEvent } from "./types.js";
1
+ import type { ICreateUserActionEvent } from "../../../worker/actions/createUser/types.js";
2
2
  import type { CognitoIdentityProvider, CognitoIdentityProviderClientConfig } from "@webiny/aws-sdk/client-cognito-identity-provider/index.js";
3
3
  export interface ICreateCreateUserActionParams {
4
4
  createCognitoProvider(config: Partial<CognitoIdentityProviderClientConfig>): Pick<CognitoIdentityProvider, "send">;
5
5
  }
6
- export declare const createCreateUserAction: (params: ICreateCreateUserActionParams) => import("../../plugins/WorkerActionPlugin.js").WorkerActionPlugin<ICreateUserActionEvent>;
6
+ export declare const createCreateUserAction: (params: ICreateCreateUserActionParams) => import("~/worker/plugins/WorkerActionPlugin.js").WorkerActionPlugin<ICreateUserActionEvent>;
@@ -1,42 +1,31 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.createCreateUserAction = void 0;
7
- var _WorkerActionPlugin = require("../../plugins/WorkerActionPlugin.js");
8
- var _createUserSchema = require("./createUserSchema.js");
9
- var _CreateUser = require("./CreateUser.js");
10
- var _logValidationError = require("../logValidationError.js");
11
- const createCreateUserAction = params => {
12
- const createUser = new _CreateUser.CreateUser({
13
- createCognitoProvider: params.createCognitoProvider
14
- });
15
- return (0, _WorkerActionPlugin.createWorkerActionPlugin)({
16
- name: "sync.worker.action.createUser",
17
- parse: input => {
18
- const schema = (0, _createUserSchema.createCreateUserSchema)();
19
- const result = schema.safeParse(input);
20
- if (!result.success || result.error) {
21
- (0, _logValidationError.logValidationError)(result.error);
22
- return undefined;
23
- }
24
- return result.data;
25
- },
26
- async handle(params) {
27
- const {
28
- data
29
- } = params;
30
- return createUser.create({
31
- username: data.username,
32
- sourceRegion: data.source.region,
33
- sourceUserPoolId: data.source.userPoolId,
34
- targetRegion: data.target.region,
35
- targetUserPoolId: data.target.userPoolId
36
- });
37
- }
38
- });
1
+ import { createWorkerActionPlugin } from "../../plugins/WorkerActionPlugin.js";
2
+ import { createCreateUserSchema } from "./createUserSchema.js";
3
+ import { CreateUser } from "./CreateUser.js";
4
+ import { logValidationError } from "../logValidationError.js";
5
+ const createCreateUserAction = (params)=>{
6
+ const createUser = new CreateUser({
7
+ createCognitoProvider: params.createCognitoProvider
8
+ });
9
+ return createWorkerActionPlugin({
10
+ name: "sync.worker.action.createUser",
11
+ parse: (input)=>{
12
+ const schema = createCreateUserSchema();
13
+ const result = schema.safeParse(input);
14
+ if (!result.success || result.error) return void logValidationError(result.error);
15
+ return result.data;
16
+ },
17
+ async handle (params) {
18
+ const { data } = params;
19
+ return createUser.create({
20
+ username: data.username,
21
+ sourceRegion: data.source.region,
22
+ sourceUserPoolId: data.source.userPoolId,
23
+ targetRegion: data.target.region,
24
+ targetUserPoolId: data.target.userPoolId
25
+ });
26
+ }
27
+ });
39
28
  };
40
- exports.createCreateUserAction = createCreateUserAction;
29
+ export { createCreateUserAction };
41
30
 
42
31
  //# sourceMappingURL=createUserAction.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_WorkerActionPlugin","require","_createUserSchema","_CreateUser","_logValidationError","createCreateUserAction","params","createUser","CreateUser","createCognitoProvider","createWorkerActionPlugin","name","parse","input","schema","createCreateUserSchema","result","safeParse","success","error","logValidationError","undefined","data","handle","create","username","sourceRegion","source","region","sourceUserPoolId","userPoolId","targetRegion","target","targetUserPoolId","exports"],"sources":["createUserAction.ts"],"sourcesContent":["import { createWorkerActionPlugin } from \"~/worker/plugins/WorkerActionPlugin.js\";\nimport type { ICreateUserActionEvent } from \"~/worker/actions/createUser/types.js\";\nimport { createCreateUserSchema } from \"./createUserSchema.js\";\nimport type {\n CognitoIdentityProvider,\n CognitoIdentityProviderClientConfig\n} from \"@webiny/aws-sdk/client-cognito-identity-provider/index.js\";\nimport { CreateUser } from \"~/worker/actions/createUser/CreateUser.js\";\nimport { logValidationError } from \"~/worker/actions/logValidationError.js\";\n\nexport interface ICreateCreateUserActionParams {\n createCognitoProvider(\n config: Partial<CognitoIdentityProviderClientConfig>\n ): Pick<CognitoIdentityProvider, \"send\">;\n}\n\nexport const createCreateUserAction = (params: ICreateCreateUserActionParams) => {\n const createUser = new CreateUser({\n createCognitoProvider: params.createCognitoProvider\n });\n return createWorkerActionPlugin<ICreateUserActionEvent>({\n name: \"sync.worker.action.createUser\",\n parse: input => {\n const schema = createCreateUserSchema();\n\n const result = schema.safeParse(input);\n if (!result.success || result.error) {\n logValidationError(result.error);\n return undefined;\n }\n return result.data;\n },\n async handle(params) {\n const { data } = params;\n return createUser.create({\n username: data.username,\n sourceRegion: data.source.region,\n sourceUserPoolId: data.source.userPoolId,\n targetRegion: data.target.region,\n targetUserPoolId: data.target.userPoolId\n });\n }\n });\n};\n"],"mappings":";;;;;;AAAA,IAAAA,mBAAA,GAAAC,OAAA;AAEA,IAAAC,iBAAA,GAAAD,OAAA;AAKA,IAAAE,WAAA,GAAAF,OAAA;AACA,IAAAG,mBAAA,GAAAH,OAAA;AAQO,MAAMI,sBAAsB,GAAIC,MAAqC,IAAK;EAC7E,MAAMC,UAAU,GAAG,IAAIC,sBAAU,CAAC;IAC9BC,qBAAqB,EAAEH,MAAM,CAACG;EAClC,CAAC,CAAC;EACF,OAAO,IAAAC,4CAAwB,EAAyB;IACpDC,IAAI,EAAE,+BAA+B;IACrCC,KAAK,EAAEC,KAAK,IAAI;MACZ,MAAMC,MAAM,GAAG,IAAAC,wCAAsB,EAAC,CAAC;MAEvC,MAAMC,MAAM,GAAGF,MAAM,CAACG,SAAS,CAACJ,KAAK,CAAC;MACtC,IAAI,CAACG,MAAM,CAACE,OAAO,IAAIF,MAAM,CAACG,KAAK,EAAE;QACjC,IAAAC,sCAAkB,EAACJ,MAAM,CAACG,KAAK,CAAC;QAChC,OAAOE,SAAS;MACpB;MACA,OAAOL,MAAM,CAACM,IAAI;IACtB,CAAC;IACD,MAAMC,MAAMA,CAACjB,MAAM,EAAE;MACjB,MAAM;QAAEgB;MAAK,CAAC,GAAGhB,MAAM;MACvB,OAAOC,UAAU,CAACiB,MAAM,CAAC;QACrBC,QAAQ,EAAEH,IAAI,CAACG,QAAQ;QACvBC,YAAY,EAAEJ,IAAI,CAACK,MAAM,CAACC,MAAM;QAChCC,gBAAgB,EAAEP,IAAI,CAACK,MAAM,CAACG,UAAU;QACxCC,YAAY,EAAET,IAAI,CAACU,MAAM,CAACJ,MAAM;QAChCK,gBAAgB,EAAEX,IAAI,CAACU,MAAM,CAACF;MAClC,CAAC,CAAC;IACN;EACJ,CAAC,CAAC;AACN,CAAC;AAACI,OAAA,CAAA7B,sBAAA,GAAAA,sBAAA","ignoreList":[]}
1
+ {"version":3,"file":"worker/actions/createUser/createUserAction.js","sources":["../../../../src/worker/actions/createUser/createUserAction.ts"],"sourcesContent":["import { createWorkerActionPlugin } from \"~/worker/plugins/WorkerActionPlugin.js\";\nimport type { ICreateUserActionEvent } from \"~/worker/actions/createUser/types.js\";\nimport { createCreateUserSchema } from \"./createUserSchema.js\";\nimport type {\n CognitoIdentityProvider,\n CognitoIdentityProviderClientConfig\n} from \"@webiny/aws-sdk/client-cognito-identity-provider/index.js\";\nimport { CreateUser } from \"~/worker/actions/createUser/CreateUser.js\";\nimport { logValidationError } from \"~/worker/actions/logValidationError.js\";\n\nexport interface ICreateCreateUserActionParams {\n createCognitoProvider(\n config: Partial<CognitoIdentityProviderClientConfig>\n ): Pick<CognitoIdentityProvider, \"send\">;\n}\n\nexport const createCreateUserAction = (params: ICreateCreateUserActionParams) => {\n const createUser = new CreateUser({\n createCognitoProvider: params.createCognitoProvider\n });\n return createWorkerActionPlugin<ICreateUserActionEvent>({\n name: \"sync.worker.action.createUser\",\n parse: input => {\n const schema = createCreateUserSchema();\n\n const result = schema.safeParse(input);\n if (!result.success || result.error) {\n logValidationError(result.error);\n return undefined;\n }\n return result.data;\n },\n async handle(params) {\n const { data } = params;\n return createUser.create({\n username: data.username,\n sourceRegion: data.source.region,\n sourceUserPoolId: data.source.userPoolId,\n targetRegion: data.target.region,\n targetUserPoolId: data.target.userPoolId\n });\n }\n });\n};\n"],"names":["createCreateUserAction","params","createUser","CreateUser","createWorkerActionPlugin","input","schema","createCreateUserSchema","result","logValidationError","data"],"mappings":";;;;AAgBO,MAAMA,yBAAyB,CAACC;IACnC,MAAMC,aAAa,IAAIC,WAAW;QAC9B,uBAAuBF,OAAO,qBAAqB;IACvD;IACA,OAAOG,yBAAiD;QACpD,MAAM;QACN,OAAOC,CAAAA;YACH,MAAMC,SAASC;YAEf,MAAMC,SAASF,OAAO,SAAS,CAACD;YAChC,IAAI,CAACG,OAAO,OAAO,IAAIA,OAAO,KAAK,EAAE,YACjCC,mBAAmBD,OAAO,KAAK;YAGnC,OAAOA,OAAO,IAAI;QACtB;QACA,MAAM,QAAOP,MAAM;YACf,MAAM,EAAES,IAAI,EAAE,GAAGT;YACjB,OAAOC,WAAW,MAAM,CAAC;gBACrB,UAAUQ,KAAK,QAAQ;gBACvB,cAAcA,KAAK,MAAM,CAAC,MAAM;gBAChC,kBAAkBA,KAAK,MAAM,CAAC,UAAU;gBACxC,cAAcA,KAAK,MAAM,CAAC,MAAM;gBAChC,kBAAkBA,KAAK,MAAM,CAAC,UAAU;YAC5C;QACJ;IACJ;AACJ"}