@webiny/api-file-manager-s3 0.0.0-unstable.e6f0dc8ca7 → 0.0.0-unstable.eb81deee7e

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 (156) hide show
  1. package/FileManagerS3Feature.d.ts +9 -0
  2. package/FileManagerS3Feature.js +27 -0
  3. package/FileManagerS3Feature.js.map +1 -0
  4. package/assetDelivery/abstractions.d.ts +11 -0
  5. package/assetDelivery/abstractions.js +7 -0
  6. package/assetDelivery/abstractions.js.map +1 -0
  7. package/assetDelivery/assetDeliveryConfig.d.ts +1 -1
  8. package/assetDelivery/assetDeliveryConfig.js +10 -44
  9. package/assetDelivery/assetDeliveryConfig.js.map +1 -1
  10. package/assetDelivery/createAssetDelivery.js +5 -19
  11. package/assetDelivery/createAssetDelivery.js.map +1 -1
  12. package/assetDelivery/feature.d.ts +5 -0
  13. package/assetDelivery/feature.js +36 -0
  14. package/assetDelivery/feature.js.map +1 -0
  15. package/assetDelivery/index.js +0 -2
  16. package/assetDelivery/s3/LazySharpTransform.d.ts +34 -0
  17. package/assetDelivery/s3/LazySharpTransform.js +34 -0
  18. package/assetDelivery/s3/LazySharpTransform.js.map +1 -0
  19. package/assetDelivery/s3/S3AssetResolver.d.ts +3 -0
  20. package/assetDelivery/s3/S3AssetResolver.js +32 -22
  21. package/assetDelivery/s3/S3AssetResolver.js.map +1 -1
  22. package/assetDelivery/s3/S3ContentsReader.js +13 -16
  23. package/assetDelivery/s3/S3ContentsReader.js.map +1 -1
  24. package/assetDelivery/s3/S3ErrorAssetReply.js +10 -9
  25. package/assetDelivery/s3/S3ErrorAssetReply.js.map +1 -1
  26. package/assetDelivery/s3/S3OutputStrategy.d.ts +5 -5
  27. package/assetDelivery/s3/S3OutputStrategy.js +33 -27
  28. package/assetDelivery/s3/S3OutputStrategy.js.map +1 -1
  29. package/assetDelivery/s3/S3RedirectAssetReply.js +12 -11
  30. package/assetDelivery/s3/S3RedirectAssetReply.js.map +1 -1
  31. package/assetDelivery/s3/S3StreamAssetReply.js +12 -11
  32. package/assetDelivery/s3/S3StreamAssetReply.js.map +1 -1
  33. package/assetDelivery/s3/SharpTransform.d.ts +21 -13
  34. package/assetDelivery/s3/SharpTransform.js +164 -173
  35. package/assetDelivery/s3/SharpTransform.js.map +1 -1
  36. package/assetDelivery/s3/transformation/AssetKeyGenerator.js +18 -17
  37. package/assetDelivery/s3/transformation/AssetKeyGenerator.js.map +1 -1
  38. package/assetDelivery/s3/transformation/CallableContentsReader.js +8 -7
  39. package/assetDelivery/s3/transformation/CallableContentsReader.js.map +1 -1
  40. package/assetDelivery/s3/transformation/WidthCollection.js +15 -16
  41. package/assetDelivery/s3/transformation/WidthCollection.js.map +1 -1
  42. package/assetDelivery/s3/transformation/utils.js +24 -30
  43. package/assetDelivery/s3/transformation/utils.js.map +1 -1
  44. package/assetDelivery/threatDetection/ObjectKey.js +15 -14
  45. package/assetDelivery/threatDetection/ObjectKey.js.map +1 -1
  46. package/assetDelivery/threatDetection/createThreatDetectionEventHandler.d.ts +21 -1
  47. package/assetDelivery/threatDetection/createThreatDetectionEventHandler.js +46 -44
  48. package/assetDelivery/threatDetection/createThreatDetectionEventHandler.js.map +1 -1
  49. package/assetDelivery/threatDetection/createThreatDetectionPluginLoader.js +2 -3
  50. package/assetDelivery/threatDetection/createThreatDetectionPluginLoader.js.map +1 -1
  51. package/assetDelivery/threatDetection/index.js +0 -2
  52. package/assetDelivery/threatDetection/processThreatScanResult.js +51 -55
  53. package/assetDelivery/threatDetection/processThreatScanResult.js.map +1 -1
  54. package/assetDelivery/threatDetection/types.js +0 -3
  55. package/assetDelivery/types.d.ts +3 -0
  56. package/assetDelivery/types.js +0 -3
  57. package/enterprise/ApplyThreatScanning/CreateFileWithThreatScanDecorator.d.ts +3 -1
  58. package/enterprise/ApplyThreatScanning/CreateFileWithThreatScanDecorator.js +22 -13
  59. package/enterprise/ApplyThreatScanning/CreateFileWithThreatScanDecorator.js.map +1 -1
  60. package/enterprise/ApplyThreatScanning/feature.js +6 -5
  61. package/enterprise/ApplyThreatScanning/feature.js.map +1 -1
  62. package/features/DeleteFileFromBucket/DeleteFileFromBucketHandler.js +26 -27
  63. package/features/DeleteFileFromBucket/DeleteFileFromBucketHandler.js.map +1 -1
  64. package/features/DeleteFileFromBucket/DeleteS3FolderTask.d.ts +9 -4
  65. package/features/DeleteFileFromBucket/DeleteS3FolderTask.js +49 -53
  66. package/features/DeleteFileFromBucket/DeleteS3FolderTask.js.map +1 -1
  67. package/features/DeleteFileFromBucket/feature.js +7 -6
  68. package/features/DeleteFileFromBucket/feature.js.map +1 -1
  69. package/features/ExtractMetadata/ExtractMetadataHandler.js +18 -19
  70. package/features/ExtractMetadata/ExtractMetadataHandler.js.map +1 -1
  71. package/features/ExtractMetadata/ExtractMetadataTask.d.ts +11 -6
  72. package/features/ExtractMetadata/ExtractMetadataTask.js +86 -116
  73. package/features/ExtractMetadata/ExtractMetadataTask.js.map +1 -1
  74. package/features/ExtractMetadata/feature.js +7 -6
  75. package/features/ExtractMetadata/feature.js.map +1 -1
  76. package/features/FlushCache/FlushCacheOnFileDeleteHandler.js +20 -19
  77. package/features/FlushCache/FlushCacheOnFileDeleteHandler.js.map +1 -1
  78. package/features/FlushCache/FlushCacheOnFileUpdateHandler.js +22 -26
  79. package/features/FlushCache/FlushCacheOnFileUpdateHandler.js.map +1 -1
  80. package/features/FlushCache/InvalidateCacheTask.d.ts +11 -6
  81. package/features/FlushCache/InvalidateCacheTask.js +75 -78
  82. package/features/FlushCache/InvalidateCacheTask.js.map +1 -1
  83. package/features/FlushCache/feature.js +8 -7
  84. package/features/FlushCache/feature.js.map +1 -1
  85. package/features/GetFileContentsById/GetFileContentsByIdUseCase.d.ts +13 -0
  86. package/features/GetFileContentsById/GetFileContentsByIdUseCase.js +40 -0
  87. package/features/GetFileContentsById/GetFileContentsByIdUseCase.js.map +1 -0
  88. package/features/{GetFileContents → GetFileContentsById}/feature.d.ts +1 -1
  89. package/features/GetFileContentsById/feature.js +11 -0
  90. package/features/GetFileContentsById/feature.js.map +1 -0
  91. package/features/GetFileContentsByKey/GetFileContentsByKeyUseCase.d.ts +13 -0
  92. package/features/GetFileContentsByKey/GetFileContentsByKeyUseCase.js +40 -0
  93. package/features/GetFileContentsByKey/GetFileContentsByKeyUseCase.js.map +1 -0
  94. package/features/GetFileContentsByKey/feature.d.ts +4 -0
  95. package/features/GetFileContentsByKey/feature.js +11 -0
  96. package/features/GetFileContentsByKey/feature.js.map +1 -0
  97. package/features/WriteFileMetadata/MetadataReader.js +9 -10
  98. package/features/WriteFileMetadata/MetadataReader.js.map +1 -1
  99. package/features/WriteFileMetadata/MetadataWriter.js +25 -25
  100. package/features/WriteFileMetadata/MetadataWriter.js.map +1 -1
  101. package/features/WriteFileMetadata/WriteMetadataAfterBatchCreateHandler.js +14 -12
  102. package/features/WriteFileMetadata/WriteMetadataAfterBatchCreateHandler.js.map +1 -1
  103. package/features/WriteFileMetadata/WriteMetadataAfterCreateHandler.js +16 -12
  104. package/features/WriteFileMetadata/WriteMetadataAfterCreateHandler.js.map +1 -1
  105. package/features/WriteFileMetadata/feature.js +7 -6
  106. package/features/WriteFileMetadata/feature.js.map +1 -1
  107. package/graphql/S3GraphQLSchema.d.ts +10 -0
  108. package/graphql/S3GraphQLSchema.js +233 -0
  109. package/graphql/S3GraphQLSchema.js.map +1 -0
  110. package/graphql/checkPermissions.js +17 -32
  111. package/graphql/checkPermissions.js.map +1 -1
  112. package/index.d.ts +2 -2
  113. package/index.js +1 -25
  114. package/multiPartUpload/CompleteMultiPartUploadUseCase.js +50 -53
  115. package/multiPartUpload/CompleteMultiPartUploadUseCase.js.map +1 -1
  116. package/multiPartUpload/CreateMultiPartUploadUseCase.js +31 -38
  117. package/multiPartUpload/CreateMultiPartUploadUseCase.js.map +1 -1
  118. package/package.json +27 -23
  119. package/types.d.ts +1 -1
  120. package/types.js +1 -3
  121. package/utils/CdnPathsGenerator.js +8 -4
  122. package/utils/CdnPathsGenerator.js.map +1 -1
  123. package/utils/FileExtension.js +12 -13
  124. package/utils/FileExtension.js.map +1 -1
  125. package/utils/FileKey.js +29 -21
  126. package/utils/FileKey.js.map +1 -1
  127. package/utils/FileKey.test.js +49 -49
  128. package/utils/FileKey.test.js.map +1 -1
  129. package/utils/FileNormalizer.js +31 -46
  130. package/utils/FileNormalizer.js.map +1 -1
  131. package/utils/FileUploadModifier.d.ts +8 -2
  132. package/utils/FileUploadModifier.js +35 -33
  133. package/utils/FileUploadModifier.js.map +1 -1
  134. package/utils/createFileNormalizerFromContext.js +5 -4
  135. package/utils/createFileNormalizerFromContext.js.map +1 -1
  136. package/utils/getPresignedPostPayload.js +36 -33
  137. package/utils/getPresignedPostPayload.js.map +1 -1
  138. package/utils/mimeTypes.js +6 -10
  139. package/utils/mimeTypes.js.map +1 -1
  140. package/utils/uploadFileToS3.d.ts +1 -1
  141. package/utils/uploadFileToS3.js +11 -10
  142. package/utils/uploadFileToS3.js.map +1 -1
  143. package/assetDelivery/index.js.map +0 -1
  144. package/assetDelivery/threatDetection/index.js.map +0 -1
  145. package/assetDelivery/threatDetection/types.js.map +0 -1
  146. package/assetDelivery/types.js.map +0 -1
  147. package/features/GetFileContents/GetFileContentsUseCase.d.ts +0 -13
  148. package/features/GetFileContents/GetFileContentsUseCase.js +0 -41
  149. package/features/GetFileContents/GetFileContentsUseCase.js.map +0 -1
  150. package/features/GetFileContents/feature.js +0 -10
  151. package/features/GetFileContents/feature.js.map +0 -1
  152. package/graphql/schema.d.ts +0 -1
  153. package/graphql/schema.js +0 -204
  154. package/graphql/schema.js.map +0 -1
  155. package/index.js.map +0 -1
  156. package/types.js.map +0 -1
@@ -1,10 +1,11 @@
1
- export class CallableContentsReader {
2
- constructor(callable) {
3
- this.callable = callable;
4
- }
5
- async read() {
6
- return this.callable();
7
- }
1
+ class CallableContentsReader {
2
+ constructor(callable){
3
+ this.callable = callable;
4
+ }
5
+ async read() {
6
+ return this.callable();
7
+ }
8
8
  }
9
+ export { CallableContentsReader };
9
10
 
10
11
  //# sourceMappingURL=CallableContentsReader.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["CallableContentsReader","constructor","callable","read"],"sources":["CallableContentsReader.ts"],"sourcesContent":["import type { AssetContentsReader } from \"@webiny/api-file-manager\";\n\ninterface ContentsCallable {\n (): Promise<Buffer> | Buffer;\n}\n\nexport class CallableContentsReader implements AssetContentsReader {\n private readonly callable: ContentsCallable;\n\n constructor(callable: ContentsCallable) {\n this.callable = callable;\n }\n\n async read(): Promise<Buffer> {\n return this.callable();\n }\n}\n"],"mappings":"AAMA,OAAO,MAAMA,sBAAsB,CAAgC;EAG/DC,WAAWA,CAACC,QAA0B,EAAE;IACpC,IAAI,CAACA,QAAQ,GAAGA,QAAQ;EAC5B;EAEA,MAAMC,IAAIA,CAAA,EAAoB;IAC1B,OAAO,IAAI,CAACD,QAAQ,CAAC,CAAC;EAC1B;AACJ","ignoreList":[]}
1
+ {"version":3,"file":"assetDelivery/s3/transformation/CallableContentsReader.js","sources":["../../../../src/assetDelivery/s3/transformation/CallableContentsReader.ts"],"sourcesContent":["import type { AssetContentsReader } from \"@webiny/api-file-manager\";\n\ninterface ContentsCallable {\n (): Promise<Buffer> | Buffer;\n}\n\nexport class CallableContentsReader implements AssetContentsReader {\n private readonly callable: ContentsCallable;\n\n constructor(callable: ContentsCallable) {\n this.callable = callable;\n }\n\n async read(): Promise<Buffer> {\n return this.callable();\n }\n}\n"],"names":["CallableContentsReader","callable"],"mappings":"AAMO,MAAMA;IAGT,YAAYC,QAA0B,CAAE;QACpC,IAAI,CAAC,QAAQ,GAAGA;IACpB;IAEA,MAAM,OAAwB;QAC1B,OAAO,IAAI,CAAC,QAAQ;IACxB;AACJ"}
@@ -1,20 +1,19 @@
1
- export class WidthCollection {
2
- constructor(values) {
3
- this.values = values.sort((a, b) => a - b);
4
- }
5
- max() {
6
- return Math.max(...this.values);
7
- }
8
- min() {
9
- return Math.min(...this.values);
10
- }
11
- getClosestOrMax(value) {
12
- if (!value) {
13
- return this.max();
1
+ class WidthCollection {
2
+ constructor(values){
3
+ this.values = values.sort((a, b)=>a - b);
4
+ }
5
+ max() {
6
+ return Math.max(...this.values);
7
+ }
8
+ min() {
9
+ return Math.min(...this.values);
10
+ }
11
+ getClosestOrMax(value) {
12
+ if (!value) return this.max();
13
+ const gteGivenValue = this.values.filter((w)=>w >= value);
14
+ return gteGivenValue.length > 0 ? gteGivenValue[0] : this.max();
14
15
  }
15
- const gteGivenValue = this.values.filter(w => w >= value);
16
- return gteGivenValue.length > 0 ? gteGivenValue[0] : this.max();
17
- }
18
16
  }
17
+ export { WidthCollection };
19
18
 
20
19
  //# sourceMappingURL=WidthCollection.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["WidthCollection","constructor","values","sort","a","b","max","Math","min","getClosestOrMax","value","gteGivenValue","filter","w","length"],"sources":["WidthCollection.ts"],"sourcesContent":["export class WidthCollection {\n private readonly values: number[];\n\n constructor(values: number[]) {\n this.values = values.sort((a, b) => a - b);\n }\n\n max() {\n return Math.max(...this.values);\n }\n\n min() {\n return Math.min(...this.values);\n }\n\n getClosestOrMax(value: number | undefined): number {\n if (!value) {\n return this.max();\n }\n const gteGivenValue = this.values.filter(w => w >= value);\n return gteGivenValue.length > 0 ? gteGivenValue[0] : this.max();\n }\n}\n"],"mappings":"AAAA,OAAO,MAAMA,eAAe,CAAC;EAGzBC,WAAWA,CAACC,MAAgB,EAAE;IAC1B,IAAI,CAACA,MAAM,GAAGA,MAAM,CAACC,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAKD,CAAC,GAAGC,CAAC,CAAC;EAC9C;EAEAC,GAAGA,CAAA,EAAG;IACF,OAAOC,IAAI,CAACD,GAAG,CAAC,GAAG,IAAI,CAACJ,MAAM,CAAC;EACnC;EAEAM,GAAGA,CAAA,EAAG;IACF,OAAOD,IAAI,CAACC,GAAG,CAAC,GAAG,IAAI,CAACN,MAAM,CAAC;EACnC;EAEAO,eAAeA,CAACC,KAAyB,EAAU;IAC/C,IAAI,CAACA,KAAK,EAAE;MACR,OAAO,IAAI,CAACJ,GAAG,CAAC,CAAC;IACrB;IACA,MAAMK,aAAa,GAAG,IAAI,CAACT,MAAM,CAACU,MAAM,CAACC,CAAC,IAAIA,CAAC,IAAIH,KAAK,CAAC;IACzD,OAAOC,aAAa,CAACG,MAAM,GAAG,CAAC,GAAGH,aAAa,CAAC,CAAC,CAAC,GAAG,IAAI,CAACL,GAAG,CAAC,CAAC;EACnE;AACJ","ignoreList":[]}
1
+ {"version":3,"file":"assetDelivery/s3/transformation/WidthCollection.js","sources":["../../../../src/assetDelivery/s3/transformation/WidthCollection.ts"],"sourcesContent":["export class WidthCollection {\n private readonly values: number[];\n\n constructor(values: number[]) {\n this.values = values.sort((a, b) => a - b);\n }\n\n max() {\n return Math.max(...this.values);\n }\n\n min() {\n return Math.min(...this.values);\n }\n\n getClosestOrMax(value: number | undefined): number {\n if (!value) {\n return this.max();\n }\n const gteGivenValue = this.values.filter(w => w >= value);\n return gteGivenValue.length > 0 ? gteGivenValue[0] : this.max();\n }\n}\n"],"names":["WidthCollection","values","a","b","Math","value","gteGivenValue","w"],"mappings":"AAAO,MAAMA;IAGT,YAAYC,MAAgB,CAAE;QAC1B,IAAI,CAAC,MAAM,GAAGA,OAAO,IAAI,CAAC,CAACC,GAAGC,IAAMD,IAAIC;IAC5C;IAEA,MAAM;QACF,OAAOC,KAAK,GAAG,IAAI,IAAI,CAAC,MAAM;IAClC;IAEA,MAAM;QACF,OAAOA,KAAK,GAAG,IAAI,IAAI,CAAC,MAAM;IAClC;IAEA,gBAAgBC,KAAyB,EAAU;QAC/C,IAAI,CAACA,OACD,OAAO,IAAI,CAAC,GAAG;QAEnB,MAAMC,gBAAgB,IAAI,CAAC,MAAM,CAAC,MAAM,CAACC,CAAAA,IAAKA,KAAKF;QACnD,OAAOC,cAAc,MAAM,GAAG,IAAIA,aAAa,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG;IACjE;AACJ"}
@@ -1,36 +1,30 @@
1
- import objectHash from "object-hash";
2
- import path from "node:path";
3
- const SUPPORTED_TRANSFORMABLE_IMAGES = ["jpg", "jpeg", "png", "webp"];
4
- const parseKey = key => {
5
- const filename = path.basename(key);
6
- const dirname = path.dirname(key);
7
- return {
8
- filename,
9
- dirname
10
- };
1
+ import object_hash from "object-hash";
2
+ import node_path from "node:path";
3
+ const SUPPORTED_TRANSFORMABLE_IMAGES = [
4
+ "jpg",
5
+ "jpeg",
6
+ "png",
7
+ "webp"
8
+ ];
9
+ const parseKey = (key)=>{
10
+ const filename = node_path.basename(key);
11
+ const dirname = node_path.dirname(key);
12
+ return {
13
+ filename,
14
+ dirname
15
+ };
11
16
  };
12
- const getOptimizedImageKeyPrefix = key => {
13
- const {
14
- filename,
15
- dirname
16
- } = parseKey(key);
17
- return `${dirname}/optimized/${filename}`;
17
+ const getOptimizedImageKeyPrefix = (key)=>{
18
+ const { filename, dirname } = parseKey(key);
19
+ return `${dirname}/optimized/${filename}`;
18
20
  };
19
- const getOptimizedTransformedImageKeyPrefix = (key, transformationsHash) => {
20
- const {
21
- filename,
22
- dirname
23
- } = parseKey(key);
24
- return `${dirname}/optimized/${transformationsHash}-${filename}`;
21
+ const getOptimizedTransformedImageKeyPrefix = (key, transformationsHash)=>{
22
+ const { filename, dirname } = parseKey(key);
23
+ return `${dirname}/optimized/${transformationsHash}-${filename}`;
25
24
  };
26
- const getImageKey = ({
27
- key,
28
- transformations
29
- }) => {
30
- if (!transformations) {
31
- return getOptimizedImageKeyPrefix(key);
32
- }
33
- return getOptimizedTransformedImageKeyPrefix(key, objectHash(transformations));
25
+ const getImageKey = ({ key, transformations })=>{
26
+ if (!transformations) return getOptimizedImageKeyPrefix(key);
27
+ return getOptimizedTransformedImageKeyPrefix(key, object_hash(transformations));
34
28
  };
35
29
  export { SUPPORTED_TRANSFORMABLE_IMAGES, getImageKey, getOptimizedImageKeyPrefix, getOptimizedTransformedImageKeyPrefix };
36
30
 
@@ -1 +1 @@
1
- {"version":3,"names":["objectHash","path","SUPPORTED_TRANSFORMABLE_IMAGES","parseKey","key","filename","basename","dirname","getOptimizedImageKeyPrefix","getOptimizedTransformedImageKeyPrefix","transformationsHash","getImageKey","transformations"],"sources":["utils.ts"],"sourcesContent":["import objectHash from \"object-hash\";\nimport path from \"node:path\";\n\nconst SUPPORTED_TRANSFORMABLE_IMAGES = [\"jpg\", \"jpeg\", \"png\", \"webp\"];\n\nconst parseKey = (key: string) => {\n const filename = path.basename(key);\n const dirname = path.dirname(key);\n\n return { filename, dirname };\n};\n\nconst getOptimizedImageKeyPrefix = (key: string): string => {\n const { filename, dirname } = parseKey(key);\n\n return `${dirname}/optimized/${filename}`;\n};\n\nconst getOptimizedTransformedImageKeyPrefix = (\n key: string,\n transformationsHash: string\n): string => {\n const { filename, dirname } = parseKey(key);\n\n return `${dirname}/optimized/${transformationsHash}-${filename}`;\n};\n\ninterface GetImageKeyParams {\n key: string;\n transformations?: any;\n}\n\nconst getImageKey = ({ key, transformations }: GetImageKeyParams): string => {\n if (!transformations) {\n return getOptimizedImageKeyPrefix(key);\n }\n\n return getOptimizedTransformedImageKeyPrefix(key, objectHash(transformations));\n};\n\nexport {\n SUPPORTED_TRANSFORMABLE_IMAGES,\n getImageKey,\n getOptimizedImageKeyPrefix,\n getOptimizedTransformedImageKeyPrefix\n};\n"],"mappings":"AAAA,OAAOA,UAAU,MAAM,aAAa;AACpC,OAAOC,IAAI,MAAM,WAAW;AAE5B,MAAMC,8BAA8B,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC;AAErE,MAAMC,QAAQ,GAAIC,GAAW,IAAK;EAC9B,MAAMC,QAAQ,GAAGJ,IAAI,CAACK,QAAQ,CAACF,GAAG,CAAC;EACnC,MAAMG,OAAO,GAAGN,IAAI,CAACM,OAAO,CAACH,GAAG,CAAC;EAEjC,OAAO;IAAEC,QAAQ;IAAEE;EAAQ,CAAC;AAChC,CAAC;AAED,MAAMC,0BAA0B,GAAIJ,GAAW,IAAa;EACxD,MAAM;IAAEC,QAAQ;IAAEE;EAAQ,CAAC,GAAGJ,QAAQ,CAACC,GAAG,CAAC;EAE3C,OAAO,GAAGG,OAAO,cAAcF,QAAQ,EAAE;AAC7C,CAAC;AAED,MAAMI,qCAAqC,GAAGA,CAC1CL,GAAW,EACXM,mBAA2B,KAClB;EACT,MAAM;IAAEL,QAAQ;IAAEE;EAAQ,CAAC,GAAGJ,QAAQ,CAACC,GAAG,CAAC;EAE3C,OAAO,GAAGG,OAAO,cAAcG,mBAAmB,IAAIL,QAAQ,EAAE;AACpE,CAAC;AAOD,MAAMM,WAAW,GAAGA,CAAC;EAAEP,GAAG;EAAEQ;AAAmC,CAAC,KAAa;EACzE,IAAI,CAACA,eAAe,EAAE;IAClB,OAAOJ,0BAA0B,CAACJ,GAAG,CAAC;EAC1C;EAEA,OAAOK,qCAAqC,CAACL,GAAG,EAAEJ,UAAU,CAACY,eAAe,CAAC,CAAC;AAClF,CAAC;AAED,SACIV,8BAA8B,EAC9BS,WAAW,EACXH,0BAA0B,EAC1BC,qCAAqC","ignoreList":[]}
1
+ {"version":3,"file":"assetDelivery/s3/transformation/utils.js","sources":["../../../../src/assetDelivery/s3/transformation/utils.ts"],"sourcesContent":["import objectHash from \"object-hash\";\nimport path from \"node:path\";\n\nconst SUPPORTED_TRANSFORMABLE_IMAGES = [\"jpg\", \"jpeg\", \"png\", \"webp\"];\n\nconst parseKey = (key: string) => {\n const filename = path.basename(key);\n const dirname = path.dirname(key);\n\n return { filename, dirname };\n};\n\nconst getOptimizedImageKeyPrefix = (key: string): string => {\n const { filename, dirname } = parseKey(key);\n\n return `${dirname}/optimized/${filename}`;\n};\n\nconst getOptimizedTransformedImageKeyPrefix = (\n key: string,\n transformationsHash: string\n): string => {\n const { filename, dirname } = parseKey(key);\n\n return `${dirname}/optimized/${transformationsHash}-${filename}`;\n};\n\ninterface GetImageKeyParams {\n key: string;\n transformations?: any;\n}\n\nconst getImageKey = ({ key, transformations }: GetImageKeyParams): string => {\n if (!transformations) {\n return getOptimizedImageKeyPrefix(key);\n }\n\n return getOptimizedTransformedImageKeyPrefix(key, objectHash(transformations));\n};\n\nexport {\n SUPPORTED_TRANSFORMABLE_IMAGES,\n getImageKey,\n getOptimizedImageKeyPrefix,\n getOptimizedTransformedImageKeyPrefix\n};\n"],"names":["SUPPORTED_TRANSFORMABLE_IMAGES","parseKey","key","filename","path","dirname","getOptimizedImageKeyPrefix","getOptimizedTransformedImageKeyPrefix","transformationsHash","getImageKey","transformations","objectHash"],"mappings":";;AAGA,MAAMA,iCAAiC;IAAC;IAAO;IAAQ;IAAO;CAAO;AAErE,MAAMC,WAAW,CAACC;IACd,MAAMC,WAAWC,UAAAA,QAAa,CAACF;IAC/B,MAAMG,UAAUD,UAAAA,OAAY,CAACF;IAE7B,OAAO;QAAEC;QAAUE;IAAQ;AAC/B;AAEA,MAAMC,6BAA6B,CAACJ;IAChC,MAAM,EAAEC,QAAQ,EAAEE,OAAO,EAAE,GAAGJ,SAASC;IAEvC,OAAO,GAAGG,QAAQ,WAAW,EAAEF,UAAU;AAC7C;AAEA,MAAMI,wCAAwC,CAC1CL,KACAM;IAEA,MAAM,EAAEL,QAAQ,EAAEE,OAAO,EAAE,GAAGJ,SAASC;IAEvC,OAAO,GAAGG,QAAQ,WAAW,EAAEG,oBAAoB,CAAC,EAAEL,UAAU;AACpE;AAOA,MAAMM,cAAc,CAAC,EAAEP,GAAG,EAAEQ,eAAe,EAAqB;IAC5D,IAAI,CAACA,iBACD,OAAOJ,2BAA2BJ;IAGtC,OAAOK,sCAAsCL,KAAKS,YAAWD;AACjE"}
@@ -1,17 +1,18 @@
1
- export class ObjectKey {
2
- static from(key) {
3
- return new ObjectKey(key);
4
- }
5
- constructor(key) {
6
- this.bucketKey = key;
7
- }
8
- id() {
9
- const [id] = this.relativeKey().split("/");
10
- return id;
11
- }
12
- relativeKey() {
13
- return this.bucketKey.replace(/^tenants\/[^/]+\/files\//, "");
14
- }
1
+ class ObjectKey {
2
+ static from(key) {
3
+ return new ObjectKey(key);
4
+ }
5
+ constructor(key){
6
+ this.bucketKey = key;
7
+ }
8
+ id() {
9
+ const [id] = this.relativeKey().split("/");
10
+ return id;
11
+ }
12
+ relativeKey() {
13
+ return this.bucketKey.replace(/^tenants\/[^/]+\/files\//, "");
14
+ }
15
15
  }
16
+ export { ObjectKey };
16
17
 
17
18
  //# sourceMappingURL=ObjectKey.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["ObjectKey","from","key","constructor","bucketKey","id","relativeKey","split","replace"],"sources":["ObjectKey.ts"],"sourcesContent":["export class ObjectKey {\n private bucketKey: string;\n\n static from(key: string) {\n return new ObjectKey(key);\n }\n\n private constructor(key: string) {\n this.bucketKey = key;\n }\n\n id() {\n const [id] = this.relativeKey().split(\"/\");\n return id;\n }\n\n relativeKey() {\n return this.bucketKey.replace(/^tenants\\/[^/]+\\/files\\//, \"\");\n }\n}\n"],"mappings":"AAAA,OAAO,MAAMA,SAAS,CAAC;EAGnB,OAAOC,IAAIA,CAACC,GAAW,EAAE;IACrB,OAAO,IAAIF,SAAS,CAACE,GAAG,CAAC;EAC7B;EAEQC,WAAWA,CAACD,GAAW,EAAE;IAC7B,IAAI,CAACE,SAAS,GAAGF,GAAG;EACxB;EAEAG,EAAEA,CAAA,EAAG;IACD,MAAM,CAACA,EAAE,CAAC,GAAG,IAAI,CAACC,WAAW,CAAC,CAAC,CAACC,KAAK,CAAC,GAAG,CAAC;IAC1C,OAAOF,EAAE;EACb;EAEAC,WAAWA,CAAA,EAAG;IACV,OAAO,IAAI,CAACF,SAAS,CAACI,OAAO,CAAC,0BAA0B,EAAE,EAAE,CAAC;EACjE;AACJ","ignoreList":[]}
1
+ {"version":3,"file":"assetDelivery/threatDetection/ObjectKey.js","sources":["../../../src/assetDelivery/threatDetection/ObjectKey.ts"],"sourcesContent":["export class ObjectKey {\n private bucketKey: string;\n\n static from(key: string) {\n return new ObjectKey(key);\n }\n\n private constructor(key: string) {\n this.bucketKey = key;\n }\n\n id() {\n const [id] = this.relativeKey().split(\"/\");\n return id;\n }\n\n relativeKey() {\n return this.bucketKey.replace(/^tenants\\/[^/]+\\/files\\//, \"\");\n }\n}\n"],"names":["ObjectKey","key","id"],"mappings":"AAAO,MAAMA;IAGT,OAAO,KAAKC,GAAW,EAAE;QACrB,OAAO,IAAID,UAAUC;IACzB;IAEA,YAAoBA,GAAW,CAAE;QAC7B,IAAI,CAAC,SAAS,GAAGA;IACrB;IAEA,KAAK;QACD,MAAM,CAACC,GAAG,GAAG,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACtC,OAAOA;IACX;IAEA,cAAc;QACV,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,4BAA4B;IAC9D;AACJ"}
@@ -1,2 +1,22 @@
1
+ import type { Container } from "@webiny/feature/api";
2
+ import type { EventBridgeEvent } from "@webiny/aws-sdk/types/index.js";
3
+ import { EventBridgeEventHandler, type EventBridgeResult } from "@webiny/event-handler-aws/abstractions/handlers/EventBridgeEventHandler.js";
4
+ import type { ITenantContext } from "@webiny/api-core/features/tenancy/TenantContext/abstractions.js";
5
+ import type { IGetTenantByIdUseCase } from "@webiny/api-core/features/tenancy/GetTenantById/abstractions.js";
6
+ import type { EventContext, NextFunction } from "@webiny/event-handler-core";
1
7
  import type { GuardDutyEvent } from "./types.js";
2
- export declare const createThreatDetectionEventHandler: () => (import("@webiny/handler").HandlerOnRequestPlugin<import("@webiny/handler/types.js").Context> | import("@webiny/handler-aws").EventBridgeEventHandler<"GuardDuty Malware Protection Object Scan Result", GuardDutyEvent, any>)[];
8
+ declare class ThreatDetectionEventBridgeLambdaHandlerImpl implements EventBridgeEventHandler.Interface {
9
+ private container;
10
+ private tenantCtx;
11
+ private getTenantById;
12
+ constructor(container: Container, tenantCtx: ITenantContext, getTenantById: IGetTenantByIdUseCase);
13
+ execute(eventCtx: EventContext<EventBridgeEvent<string, GuardDutyEvent>>, _next: NextFunction): Promise<EventBridgeResult>;
14
+ }
15
+ export declare const ThreatDetectionEventBridgeLambdaHandler: typeof ThreatDetectionEventBridgeLambdaHandlerImpl & {
16
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/event-handler-aws/abstractions/handlers/EventBridgeEventHandler.js").IEventBridgeEventHandler>;
17
+ };
18
+ /**
19
+ * @deprecated Use ThreatDetectionEventBridgeLambdaHandler instead.
20
+ */
21
+ export declare const createThreatDetectionEventHandler: () => never[];
22
+ export {};
@@ -1,51 +1,53 @@
1
- import { createEventBridgeEventHandler } from "@webiny/handler-aws";
2
- import { createHandlerOnRequest } from "@webiny/handler";
1
+ import { EventBridgeEventHandler } from "@webiny/event-handler-aws/abstractions/handlers/EventBridgeEventHandler.js";
2
+ import { RequestContainer } from "@webiny/event-handler-core";
3
+ import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
4
+ import { GetTenantByIdUseCase } from "@webiny/api-core/features/tenancy/GetTenantById/index.js";
5
+ import { FeatureFlags } from "@webiny/api-core/features/featureFlags/abstractions.js";
3
6
  import { GlobalKeyValueStore } from "@webiny/api-core/features/keyValueStore/index.js";
4
7
  import { processThreatScanResult } from "./processThreatScanResult.js";
5
8
  import { ObjectKey } from "./ObjectKey.js";
6
- const detailType = "GuardDuty Malware Protection Object Scan Result";
7
- export const createThreatDetectionEventHandler = () => {
8
- const handlerOnRequest = createHandlerOnRequest(async (request, _, context) => {
9
- const payload = request.body;
10
- if (payload["detail-type"] !== detailType) {
11
- return;
9
+ const DETAIL_TYPE = "GuardDuty Malware Protection Object Scan Result";
10
+ class ThreatDetectionEventBridgeLambdaHandlerImpl {
11
+ constructor(container, tenantCtx, getTenantById){
12
+ this.container = container;
13
+ this.tenantCtx = tenantCtx;
14
+ this.getTenantById = getTenantById;
12
15
  }
13
- const objectKey = payload.detail.s3ObjectDetails.objectKey;
14
- const keyValueStore = context.container.resolve(GlobalKeyValueStore);
15
- try {
16
- // Extract file id from the absolute S3 object key
17
- const fileId = ObjectKey.from(objectKey).id();
18
- const result = await keyValueStore.get(`FileManager/File/${fileId}/Metadata`);
19
- if (result.isFail()) {
20
- return;
21
- }
22
- request.headers = {
23
- ...request.headers,
24
- "x-tenant": result.value.tenant
25
- };
26
- } catch {
27
- // If metadata can't be loaded, we ignore the file.
28
- // Most likely it's because the file is a rendition of the original file,
29
- // so we don't need to do anything with it.
16
+ async execute(eventCtx, _next) {
17
+ const payload = eventCtx.event;
18
+ if (payload["detail-type"] !== DETAIL_TYPE) return {
19
+ success: true
20
+ };
21
+ if (!this.container.resolve(FeatureFlags).get().isEnabled("fileManager.threatDetection")) return {
22
+ success: true
23
+ };
24
+ const objectKey = payload.detail.s3ObjectDetails.objectKey;
25
+ const keyValueStore = this.container.resolve(GlobalKeyValueStore);
26
+ try {
27
+ const fileId = ObjectKey.from(objectKey).id();
28
+ const result = await keyValueStore.get(`FileManager/File/${fileId}/Metadata`);
29
+ if (result.isOk()) {
30
+ const tenantResult = await this.getTenantById.execute(result.value.tenant);
31
+ if (tenantResult.isOk()) this.tenantCtx.setTenant(tenantResult.value);
32
+ }
33
+ } catch {}
34
+ await processThreatScanResult({
35
+ container: this.container
36
+ }, payload.detail);
37
+ return {
38
+ success: true
39
+ };
30
40
  }
31
- });
32
- // Guard Duty event handler.
33
- const threatScanEventHandler = createEventBridgeEventHandler(async ({
34
- payload,
35
- next,
36
- ...rest
37
- }) => {
38
- const context = rest.context;
39
- const threatDetectionEnabled = context.wcp.canUseFileManagerThreatDetection();
40
- if (!threatDetectionEnabled || payload["detail-type"] !== detailType) {
41
- return next();
42
- }
43
- await processThreatScanResult(context, payload.detail);
44
- });
45
-
46
- // Assign a human-readable name for easier debugging.
47
- threatScanEventHandler.name = threatScanEventHandler.type + ".threatDetectionEventHandler";
48
- return [handlerOnRequest, threatScanEventHandler];
49
- };
41
+ }
42
+ const ThreatDetectionEventBridgeLambdaHandler = EventBridgeEventHandler.createImplementation({
43
+ implementation: ThreatDetectionEventBridgeLambdaHandlerImpl,
44
+ dependencies: [
45
+ RequestContainer,
46
+ TenantContext,
47
+ GetTenantByIdUseCase
48
+ ]
49
+ });
50
+ const createThreatDetectionEventHandler = ()=>[];
51
+ export { ThreatDetectionEventBridgeLambdaHandler, createThreatDetectionEventHandler };
50
52
 
51
53
  //# sourceMappingURL=createThreatDetectionEventHandler.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["createEventBridgeEventHandler","createHandlerOnRequest","GlobalKeyValueStore","processThreatScanResult","ObjectKey","detailType","createThreatDetectionEventHandler","handlerOnRequest","request","_","context","payload","body","objectKey","detail","s3ObjectDetails","keyValueStore","container","resolve","fileId","from","id","result","get","isFail","headers","value","tenant","threatScanEventHandler","next","rest","threatDetectionEnabled","wcp","canUseFileManagerThreatDetection","name","type"],"sources":["createThreatDetectionEventHandler.ts"],"sourcesContent":["import { createEventBridgeEventHandler } from \"@webiny/handler-aws\";\nimport { createHandlerOnRequest } from \"@webiny/handler\";\nimport type { EventBridgeEvent } from \"@webiny/aws-sdk/types/index.js\";\nimport type { ApiCoreContext } from \"@webiny/api-core/types/core.js\";\nimport { GlobalKeyValueStore } from \"@webiny/api-core/features/keyValueStore/index.js\";\nimport type { GuardDutyEvent } from \"./types.js\";\nimport { processThreatScanResult } from \"./processThreatScanResult.js\";\nimport { ObjectKey } from \"./ObjectKey.js\";\n\nconst detailType = \"GuardDuty Malware Protection Object Scan Result\";\n\nexport const createThreatDetectionEventHandler = () => {\n const handlerOnRequest = createHandlerOnRequest(async (request, _, context) => {\n const payload = request.body as EventBridgeEvent<string, GuardDutyEvent>;\n\n if (payload[\"detail-type\"] !== detailType) {\n return;\n }\n\n const objectKey = payload.detail.s3ObjectDetails.objectKey;\n const keyValueStore = context.container.resolve(GlobalKeyValueStore);\n\n try {\n // Extract file id from the absolute S3 object key\n const fileId = ObjectKey.from(objectKey).id();\n const result = await keyValueStore.get<{ tenant: string }>(\n `FileManager/File/${fileId}/Metadata`\n );\n\n if (result.isFail()) {\n return;\n }\n\n request.headers = {\n ...request.headers,\n \"x-tenant\": result.value.tenant\n };\n } catch {\n // If metadata can't be loaded, we ignore the file.\n // Most likely it's because the file is a rendition of the original file,\n // so we don't need to do anything with it.\n }\n });\n // Guard Duty event handler.\n const threatScanEventHandler = createEventBridgeEventHandler<typeof detailType, GuardDutyEvent>(\n async ({ payload, next, ...rest }) => {\n const context = rest.context as ApiCoreContext;\n\n const threatDetectionEnabled = context.wcp.canUseFileManagerThreatDetection();\n\n if (!threatDetectionEnabled || payload[\"detail-type\"] !== detailType) {\n return next();\n }\n\n await processThreatScanResult(context, payload.detail);\n }\n );\n\n // Assign a human-readable name for easier debugging.\n threatScanEventHandler.name = threatScanEventHandler.type + \".threatDetectionEventHandler\";\n\n return [handlerOnRequest, threatScanEventHandler];\n};\n"],"mappings":"AAAA,SAASA,6BAA6B,QAAQ,qBAAqB;AACnE,SAASC,sBAAsB,QAAQ,iBAAiB;AAGxD,SAASC,mBAAmB,QAAQ,kDAAkD;AAEtF,SAASC,uBAAuB;AAChC,SAASC,SAAS;AAElB,MAAMC,UAAU,GAAG,iDAAiD;AAEpE,OAAO,MAAMC,iCAAiC,GAAGA,CAAA,KAAM;EACnD,MAAMC,gBAAgB,GAAGN,sBAAsB,CAAC,OAAOO,OAAO,EAAEC,CAAC,EAAEC,OAAO,KAAK;IAC3E,MAAMC,OAAO,GAAGH,OAAO,CAACI,IAAgD;IAExE,IAAID,OAAO,CAAC,aAAa,CAAC,KAAKN,UAAU,EAAE;MACvC;IACJ;IAEA,MAAMQ,SAAS,GAAGF,OAAO,CAACG,MAAM,CAACC,eAAe,CAACF,SAAS;IAC1D,MAAMG,aAAa,GAAGN,OAAO,CAACO,SAAS,CAACC,OAAO,CAAChB,mBAAmB,CAAC;IAEpE,IAAI;MACA;MACA,MAAMiB,MAAM,GAAGf,SAAS,CAACgB,IAAI,CAACP,SAAS,CAAC,CAACQ,EAAE,CAAC,CAAC;MAC7C,MAAMC,MAAM,GAAG,MAAMN,aAAa,CAACO,GAAG,CAClC,oBAAoBJ,MAAM,WAC9B,CAAC;MAED,IAAIG,MAAM,CAACE,MAAM,CAAC,CAAC,EAAE;QACjB;MACJ;MAEAhB,OAAO,CAACiB,OAAO,GAAG;QACd,GAAGjB,OAAO,CAACiB,OAAO;QAClB,UAAU,EAAEH,MAAM,CAACI,KAAK,CAACC;MAC7B,CAAC;IACL,CAAC,CAAC,MAAM;MACJ;MACA;MACA;IAAA;EAER,CAAC,CAAC;EACF;EACA,MAAMC,sBAAsB,GAAG5B,6BAA6B,CACxD,OAAO;IAAEW,OAAO;IAAEkB,IAAI;IAAE,GAAGC;EAAK,CAAC,KAAK;IAClC,MAAMpB,OAAO,GAAGoB,IAAI,CAACpB,OAAyB;IAE9C,MAAMqB,sBAAsB,GAAGrB,OAAO,CAACsB,GAAG,CAACC,gCAAgC,CAAC,CAAC;IAE7E,IAAI,CAACF,sBAAsB,IAAIpB,OAAO,CAAC,aAAa,CAAC,KAAKN,UAAU,EAAE;MAClE,OAAOwB,IAAI,CAAC,CAAC;IACjB;IAEA,MAAM1B,uBAAuB,CAACO,OAAO,EAAEC,OAAO,CAACG,MAAM,CAAC;EAC1D,CACJ,CAAC;;EAED;EACAc,sBAAsB,CAACM,IAAI,GAAGN,sBAAsB,CAACO,IAAI,GAAG,8BAA8B;EAE1F,OAAO,CAAC5B,gBAAgB,EAAEqB,sBAAsB,CAAC;AACrD,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"assetDelivery/threatDetection/createThreatDetectionEventHandler.js","sources":["../../../src/assetDelivery/threatDetection/createThreatDetectionEventHandler.ts"],"sourcesContent":["import type { Container } from \"@webiny/feature/api\";\nimport type { EventBridgeEvent } from \"@webiny/aws-sdk/types/index.js\";\nimport {\n EventBridgeEventHandler,\n type EventBridgeResult\n} from \"@webiny/event-handler-aws/abstractions/handlers/EventBridgeEventHandler.js\";\nimport { RequestContainer } from \"@webiny/event-handler-core\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\nimport { GetTenantByIdUseCase } from \"@webiny/api-core/features/tenancy/GetTenantById/index.js\";\nimport type { ITenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/abstractions.js\";\nimport type { IGetTenantByIdUseCase } from \"@webiny/api-core/features/tenancy/GetTenantById/abstractions.js\";\nimport type { EventContext, NextFunction } from \"@webiny/event-handler-core\";\nimport type { ApiCoreContext } from \"@webiny/api-core/types/core.js\";\nimport { FeatureFlags } from \"@webiny/api-core/features/featureFlags/abstractions.js\";\nimport { GlobalKeyValueStore } from \"@webiny/api-core/features/keyValueStore/index.js\";\nimport { processThreatScanResult } from \"./processThreatScanResult.js\";\nimport { ObjectKey } from \"./ObjectKey.js\";\nimport type { GuardDutyEvent } from \"./types.js\";\n\nconst DETAIL_TYPE = \"GuardDuty Malware Protection Object Scan Result\";\n\nclass ThreatDetectionEventBridgeLambdaHandlerImpl implements EventBridgeEventHandler.Interface {\n constructor(\n private container: Container,\n private tenantCtx: ITenantContext,\n private getTenantById: IGetTenantByIdUseCase\n ) {}\n\n async execute(\n eventCtx: EventContext<EventBridgeEvent<string, GuardDutyEvent>>,\n _next: NextFunction\n ): Promise<EventBridgeResult> {\n const payload = eventCtx.event;\n if (payload[\"detail-type\"] !== DETAIL_TYPE) {\n return { success: true };\n }\n\n if (!this.container.resolve(FeatureFlags).get().isEnabled(\"fileManager.threatDetection\")) {\n return { success: true };\n }\n\n const objectKey = payload.detail.s3ObjectDetails.objectKey;\n const keyValueStore = this.container.resolve(GlobalKeyValueStore);\n\n try {\n const fileId = ObjectKey.from(objectKey).id();\n const result = await keyValueStore.get<{ tenant: string }>(\n `FileManager/File/${fileId}/Metadata`\n );\n\n if (result.isOk()) {\n const tenantResult = await this.getTenantById.execute(result.value.tenant);\n if (tenantResult.isOk()) {\n this.tenantCtx.setTenant(tenantResult.value);\n }\n }\n } catch {\n // If metadata can't be loaded, ignore — likely a rendition file.\n }\n\n await processThreatScanResult(\n { container: this.container } as unknown as ApiCoreContext,\n payload.detail\n );\n return { success: true };\n }\n}\n\nexport const ThreatDetectionEventBridgeLambdaHandler = EventBridgeEventHandler.createImplementation(\n {\n implementation: ThreatDetectionEventBridgeLambdaHandlerImpl,\n dependencies: [RequestContainer, TenantContext, GetTenantByIdUseCase]\n }\n);\n\n/**\n * @deprecated Use ThreatDetectionEventBridgeLambdaHandler instead.\n */\nexport const createThreatDetectionEventHandler = () => {\n return [];\n};\n"],"names":["DETAIL_TYPE","ThreatDetectionEventBridgeLambdaHandlerImpl","container","tenantCtx","getTenantById","eventCtx","_next","payload","FeatureFlags","objectKey","keyValueStore","GlobalKeyValueStore","fileId","ObjectKey","result","tenantResult","processThreatScanResult","ThreatDetectionEventBridgeLambdaHandler","EventBridgeEventHandler","RequestContainer","TenantContext","GetTenantByIdUseCase","createThreatDetectionEventHandler"],"mappings":";;;;;;;;AAmBA,MAAMA,cAAc;AAEpB,MAAMC;IACF,YACYC,SAAoB,EACpBC,SAAyB,EACzBC,aAAoC,CAC9C;aAHUF,SAAS,GAATA;aACAC,SAAS,GAATA;aACAC,aAAa,GAAbA;IACT;IAEH,MAAM,QACFC,QAAgE,EAChEC,KAAmB,EACO;QAC1B,MAAMC,UAAUF,SAAS,KAAK;QAC9B,IAAIE,OAAO,CAAC,cAAc,KAAKP,aAC3B,OAAO;YAAE,SAAS;QAAK;QAG3B,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAACQ,cAAc,GAAG,GAAG,SAAS,CAAC,gCACtD,OAAO;YAAE,SAAS;QAAK;QAG3B,MAAMC,YAAYF,QAAQ,MAAM,CAAC,eAAe,CAAC,SAAS;QAC1D,MAAMG,gBAAgB,IAAI,CAAC,SAAS,CAAC,OAAO,CAACC;QAE7C,IAAI;YACA,MAAMC,SAASC,UAAU,IAAI,CAACJ,WAAW,EAAE;YAC3C,MAAMK,SAAS,MAAMJ,cAAc,GAAG,CAClC,CAAC,iBAAiB,EAAEE,OAAO,SAAS,CAAC;YAGzC,IAAIE,OAAO,IAAI,IAAI;gBACf,MAAMC,eAAe,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAACD,OAAO,KAAK,CAAC,MAAM;gBACzE,IAAIC,aAAa,IAAI,IACjB,IAAI,CAAC,SAAS,CAAC,SAAS,CAACA,aAAa,KAAK;YAEnD;QACJ,EAAE,OAAM,CAER;QAEA,MAAMC,wBACF;YAAE,WAAW,IAAI,CAAC,SAAS;QAAC,GAC5BT,QAAQ,MAAM;QAElB,OAAO;YAAE,SAAS;QAAK;IAC3B;AACJ;AAEO,MAAMU,0CAA0CC,wBAAwB,oBAAoB,CAC/F;IACI,gBAAgBjB;IAChB,cAAc;QAACkB;QAAkBC;QAAeC;KAAqB;AACzE;AAMG,MAAMC,oCAAoC,IACtC,EAAE"}
@@ -1,6 +1,5 @@
1
1
  import { createConditionalPluginFactory } from "@webiny/api";
2
- export const createThreatDetectionPluginLoader = cb => {
3
- return createConditionalPluginFactory(() => process.env.WEBINY_FUNCTION_TYPE === "threat-detection-event-handler", cb);
4
- };
2
+ const createThreatDetectionPluginLoader = (cb)=>createConditionalPluginFactory(()=>"threat-detection-event-handler" === process.env.WEBINY_FUNCTION_TYPE, cb);
3
+ export { createThreatDetectionPluginLoader };
5
4
 
6
5
  //# sourceMappingURL=createThreatDetectionPluginLoader.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["createConditionalPluginFactory","createThreatDetectionPluginLoader","cb","process","env","WEBINY_FUNCTION_TYPE"],"sources":["createThreatDetectionPluginLoader.ts"],"sourcesContent":["import type { PluginFactory } from \"@webiny/plugins/types.js\";\nimport { createConditionalPluginFactory } from \"@webiny/api\";\n\nexport const createThreatDetectionPluginLoader = (cb: PluginFactory) => {\n return createConditionalPluginFactory(\n () => process.env.WEBINY_FUNCTION_TYPE === \"threat-detection-event-handler\",\n cb\n );\n};\n"],"mappings":"AACA,SAASA,8BAA8B,QAAQ,aAAa;AAE5D,OAAO,MAAMC,iCAAiC,GAAIC,EAAiB,IAAK;EACpE,OAAOF,8BAA8B,CACjC,MAAMG,OAAO,CAACC,GAAG,CAACC,oBAAoB,KAAK,gCAAgC,EAC3EH,EACJ,CAAC;AACL,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"assetDelivery/threatDetection/createThreatDetectionPluginLoader.js","sources":["../../../src/assetDelivery/threatDetection/createThreatDetectionPluginLoader.ts"],"sourcesContent":["import type { PluginFactory } from \"@webiny/plugins/types.js\";\nimport { createConditionalPluginFactory } from \"@webiny/api\";\n\nexport const createThreatDetectionPluginLoader = (cb: PluginFactory) => {\n return createConditionalPluginFactory(\n () => process.env.WEBINY_FUNCTION_TYPE === \"threat-detection-event-handler\",\n cb\n );\n};\n"],"names":["createThreatDetectionPluginLoader","cb","createConditionalPluginFactory","process"],"mappings":";AAGO,MAAMA,oCAAoC,CAACC,KACvCC,+BACH,IAAMC,AAAqC,qCAArCA,QAAQ,GAAG,CAAC,oBAAoB,EACtCF"}
@@ -1,4 +1,2 @@
1
1
  export * from "./createThreatDetectionEventHandler.js";
2
2
  export * from "./createThreatDetectionPluginLoader.js";
3
-
4
- //# sourceMappingURL=index.js.map
@@ -1,65 +1,61 @@
1
1
  import { UpdateFileUseCase } from "@webiny/api-file-manager/features/file/UpdateFile/index.js";
2
2
  import { DeleteFileUseCase } from "@webiny/api-file-manager/features/file/DeleteFile/index.js";
3
- import { WebsocketService } from "@webiny/api-websockets/features/WebsocketService/index.js";
3
+ import { WebsocketsListConnectionsUseCase, WebsocketsSendToConnectionsUseCase } from "@webiny/api-websockets/exports/api.js";
4
4
  import { ObjectKey } from "./ObjectKey.js";
5
5
  import { GetFileUseCase } from "@webiny/api-file-manager/features/file/GetFile/index.js";
6
- export const processThreatScanResult = async (context, eventDetail) => {
7
- const websocketService = context.container.resolve(WebsocketService);
8
- const getFile = context.container.resolve(GetFileUseCase);
9
- const updateFile = context.container.resolve(UpdateFileUseCase);
10
- const deleteFile = context.container.resolve(DeleteFileUseCase);
11
- await context.security.withoutAuthorization(async () => {
12
- const scanStatus = eventDetail.scanResultDetails.scanResultStatus;
13
- const s3Object = eventDetail.s3ObjectDetails;
14
- const fileId = ObjectKey.from(s3Object.objectKey).id();
15
- const fileResult = await getFile.execute(fileId);
16
- if (fileResult.isFail()) {
17
- return;
18
- }
19
- const file = fileResult.value;
20
- let allConnections = [];
21
- const connectionsResult = await websocketService.listConnections();
22
- if (connectionsResult.isOk()) {
23
- allConnections = connectionsResult.value;
24
- }
25
- if (scanStatus === "NO_THREATS_FOUND") {
26
- const newTags = file.tags.filter(tag => tag !== "threatScanInProgress");
27
- await updateFile.execute({
28
- id: file.id,
29
- tags: newTags
30
- });
31
- await websocketService.sendToConnections(allConnections, {
32
- action: "fm.threatScan.noThreatFound",
33
- data: {
34
- id: file.id,
35
- tags: newTags
6
+ import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/abstractions.js";
7
+ const processThreatScanResult = async (context, eventDetail)=>{
8
+ const listConnections = context.container.resolve(WebsocketsListConnectionsUseCase);
9
+ const sendToConnections = context.container.resolve(WebsocketsSendToConnectionsUseCase);
10
+ const getFile = context.container.resolve(GetFileUseCase);
11
+ const updateFile = context.container.resolve(UpdateFileUseCase);
12
+ const deleteFile = context.container.resolve(DeleteFileUseCase);
13
+ await context.container.resolve(IdentityContext).withoutAuthorization(async ()=>{
14
+ const scanStatus = eventDetail.scanResultDetails.scanResultStatus;
15
+ const s3Object = eventDetail.s3ObjectDetails;
16
+ const fileId = ObjectKey.from(s3Object.objectKey).id();
17
+ const fileResult = await getFile.execute(fileId);
18
+ if (fileResult.isFail()) return;
19
+ const file = fileResult.value;
20
+ let allConnections = [];
21
+ const connectionsResult = await listConnections.execute();
22
+ if (connectionsResult.isOk()) allConnections = connectionsResult.value;
23
+ if ("NO_THREATS_FOUND" === scanStatus) {
24
+ const newTags = file.tags.filter((tag)=>"threatScanInProgress" !== tag);
25
+ await updateFile.execute({
26
+ id: file.id,
27
+ tags: newTags
28
+ });
29
+ await sendToConnections.execute(allConnections, {
30
+ action: "fm.threatScan.noThreatFound",
31
+ data: {
32
+ id: file.id,
33
+ tags: newTags
34
+ }
35
+ });
36
+ return;
36
37
  }
37
- });
38
- return;
39
- }
40
- if (scanStatus === "THREATS_FOUND") {
41
- // Delete the infected file.
42
- await deleteFile.execute(file.id);
43
- await websocketService.sendToConnections(allConnections, {
44
- action: "fm.threatScan.threatDetected",
45
- data: {
46
- id: file.id,
47
- name: file.name
38
+ if ("THREATS_FOUND" === scanStatus) {
39
+ await deleteFile.execute(file.id);
40
+ await sendToConnections.execute(allConnections, {
41
+ action: "fm.threatScan.threatDetected",
42
+ data: {
43
+ id: file.id,
44
+ name: file.name
45
+ }
46
+ });
47
+ return;
48
48
  }
49
- });
50
- return;
51
- }
52
-
53
- // For all other outcomes, we delete the file, until better logic is implemented.
54
- await deleteFile.execute(file.id);
55
- await websocketService.sendToConnections(allConnections, {
56
- action: "fm.threatScan.unsupported",
57
- data: {
58
- id: file.id,
59
- name: file.name
60
- }
49
+ await deleteFile.execute(file.id);
50
+ await sendToConnections.execute(allConnections, {
51
+ action: "fm.threatScan.unsupported",
52
+ data: {
53
+ id: file.id,
54
+ name: file.name
55
+ }
56
+ });
61
57
  });
62
- });
63
58
  };
59
+ export { processThreatScanResult };
64
60
 
65
61
  //# sourceMappingURL=processThreatScanResult.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["UpdateFileUseCase","DeleteFileUseCase","WebsocketService","ObjectKey","GetFileUseCase","processThreatScanResult","context","eventDetail","websocketService","container","resolve","getFile","updateFile","deleteFile","security","withoutAuthorization","scanStatus","scanResultDetails","scanResultStatus","s3Object","s3ObjectDetails","fileId","from","objectKey","id","fileResult","execute","isFail","file","value","allConnections","connectionsResult","listConnections","isOk","newTags","tags","filter","tag","sendToConnections","action","data","name"],"sources":["processThreatScanResult.ts"],"sourcesContent":["import type { ApiCoreContext } from \"@webiny/api-core/types/core.js\";\nimport { UpdateFileUseCase } from \"@webiny/api-file-manager/features/file/UpdateFile/index.js\";\nimport { DeleteFileUseCase } from \"@webiny/api-file-manager/features/file/DeleteFile/index.js\";\nimport { WebsocketService } from \"@webiny/api-websockets/features/WebsocketService/index.js\";\nimport type { GuardDutyEvent } from \"./types.js\";\nimport { ObjectKey } from \"./ObjectKey.js\";\nimport { GetFileUseCase } from \"@webiny/api-file-manager/features/file/GetFile/index.js\";\n\nexport const processThreatScanResult = async (\n context: ApiCoreContext,\n eventDetail: GuardDutyEvent\n) => {\n const websocketService = context.container.resolve(WebsocketService);\n const getFile = context.container.resolve(GetFileUseCase);\n const updateFile = context.container.resolve(UpdateFileUseCase);\n const deleteFile = context.container.resolve(DeleteFileUseCase);\n\n await context.security.withoutAuthorization(async () => {\n const scanStatus = eventDetail.scanResultDetails.scanResultStatus;\n const s3Object = eventDetail.s3ObjectDetails;\n\n const fileId = ObjectKey.from(s3Object.objectKey).id();\n const fileResult = await getFile.execute(fileId);\n\n if (fileResult.isFail()) {\n return;\n }\n\n const file = fileResult.value;\n\n let allConnections: WebsocketService.Connection[] = [];\n const connectionsResult = await websocketService.listConnections();\n if (connectionsResult.isOk()) {\n allConnections = connectionsResult.value;\n }\n\n if (scanStatus === \"NO_THREATS_FOUND\") {\n const newTags = file.tags.filter(tag => tag !== \"threatScanInProgress\");\n await updateFile.execute({\n id: file.id,\n tags: newTags\n });\n\n await websocketService.sendToConnections(allConnections, {\n action: \"fm.threatScan.noThreatFound\",\n data: {\n id: file.id,\n tags: newTags\n }\n });\n\n return;\n }\n\n if (scanStatus === \"THREATS_FOUND\") {\n // Delete the infected file.\n await deleteFile.execute(file.id);\n\n await websocketService.sendToConnections(allConnections, {\n action: \"fm.threatScan.threatDetected\",\n data: {\n id: file.id,\n name: file.name\n }\n });\n\n return;\n }\n\n // For all other outcomes, we delete the file, until better logic is implemented.\n await deleteFile.execute(file.id);\n\n await websocketService.sendToConnections(allConnections, {\n action: \"fm.threatScan.unsupported\",\n data: {\n id: file.id,\n name: file.name\n }\n });\n });\n};\n"],"mappings":"AACA,SAASA,iBAAiB,QAAQ,4DAA4D;AAC9F,SAASC,iBAAiB,QAAQ,4DAA4D;AAC9F,SAASC,gBAAgB,QAAQ,2DAA2D;AAE5F,SAASC,SAAS;AAClB,SAASC,cAAc,QAAQ,yDAAyD;AAExF,OAAO,MAAMC,uBAAuB,GAAG,MAAAA,CACnCC,OAAuB,EACvBC,WAA2B,KAC1B;EACD,MAAMC,gBAAgB,GAAGF,OAAO,CAACG,SAAS,CAACC,OAAO,CAACR,gBAAgB,CAAC;EACpE,MAAMS,OAAO,GAAGL,OAAO,CAACG,SAAS,CAACC,OAAO,CAACN,cAAc,CAAC;EACzD,MAAMQ,UAAU,GAAGN,OAAO,CAACG,SAAS,CAACC,OAAO,CAACV,iBAAiB,CAAC;EAC/D,MAAMa,UAAU,GAAGP,OAAO,CAACG,SAAS,CAACC,OAAO,CAACT,iBAAiB,CAAC;EAE/D,MAAMK,OAAO,CAACQ,QAAQ,CAACC,oBAAoB,CAAC,YAAY;IACpD,MAAMC,UAAU,GAAGT,WAAW,CAACU,iBAAiB,CAACC,gBAAgB;IACjE,MAAMC,QAAQ,GAAGZ,WAAW,CAACa,eAAe;IAE5C,MAAMC,MAAM,GAAGlB,SAAS,CAACmB,IAAI,CAACH,QAAQ,CAACI,SAAS,CAAC,CAACC,EAAE,CAAC,CAAC;IACtD,MAAMC,UAAU,GAAG,MAAMd,OAAO,CAACe,OAAO,CAACL,MAAM,CAAC;IAEhD,IAAII,UAAU,CAACE,MAAM,CAAC,CAAC,EAAE;MACrB;IACJ;IAEA,MAAMC,IAAI,GAAGH,UAAU,CAACI,KAAK;IAE7B,IAAIC,cAA6C,GAAG,EAAE;IACtD,MAAMC,iBAAiB,GAAG,MAAMvB,gBAAgB,CAACwB,eAAe,CAAC,CAAC;IAClE,IAAID,iBAAiB,CAACE,IAAI,CAAC,CAAC,EAAE;MAC1BH,cAAc,GAAGC,iBAAiB,CAACF,KAAK;IAC5C;IAEA,IAAIb,UAAU,KAAK,kBAAkB,EAAE;MACnC,MAAMkB,OAAO,GAAGN,IAAI,CAACO,IAAI,CAACC,MAAM,CAACC,GAAG,IAAIA,GAAG,KAAK,sBAAsB,CAAC;MACvE,MAAMzB,UAAU,CAACc,OAAO,CAAC;QACrBF,EAAE,EAAEI,IAAI,CAACJ,EAAE;QACXW,IAAI,EAAED;MACV,CAAC,CAAC;MAEF,MAAM1B,gBAAgB,CAAC8B,iBAAiB,CAACR,cAAc,EAAE;QACrDS,MAAM,EAAE,6BAA6B;QACrCC,IAAI,EAAE;UACFhB,EAAE,EAAEI,IAAI,CAACJ,EAAE;UACXW,IAAI,EAAED;QACV;MACJ,CAAC,CAAC;MAEF;IACJ;IAEA,IAAIlB,UAAU,KAAK,eAAe,EAAE;MAChC;MACA,MAAMH,UAAU,CAACa,OAAO,CAACE,IAAI,CAACJ,EAAE,CAAC;MAEjC,MAAMhB,gBAAgB,CAAC8B,iBAAiB,CAACR,cAAc,EAAE;QACrDS,MAAM,EAAE,8BAA8B;QACtCC,IAAI,EAAE;UACFhB,EAAE,EAAEI,IAAI,CAACJ,EAAE;UACXiB,IAAI,EAAEb,IAAI,CAACa;QACf;MACJ,CAAC,CAAC;MAEF;IACJ;;IAEA;IACA,MAAM5B,UAAU,CAACa,OAAO,CAACE,IAAI,CAACJ,EAAE,CAAC;IAEjC,MAAMhB,gBAAgB,CAAC8B,iBAAiB,CAACR,cAAc,EAAE;MACrDS,MAAM,EAAE,2BAA2B;MACnCC,IAAI,EAAE;QACFhB,EAAE,EAAEI,IAAI,CAACJ,EAAE;QACXiB,IAAI,EAAEb,IAAI,CAACa;MACf;IACJ,CAAC,CAAC;EACN,CAAC,CAAC;AACN,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"assetDelivery/threatDetection/processThreatScanResult.js","sources":["../../../src/assetDelivery/threatDetection/processThreatScanResult.ts"],"sourcesContent":["import type { ApiCoreContext } from \"@webiny/api-core/types/core.js\";\nimport { UpdateFileUseCase } from \"@webiny/api-file-manager/features/file/UpdateFile/index.js\";\nimport { DeleteFileUseCase } from \"@webiny/api-file-manager/features/file/DeleteFile/index.js\";\nimport {\n WebsocketsListConnectionsUseCase,\n WebsocketsSendToConnectionsUseCase,\n ConnectionRegistry\n} from \"@webiny/api-websockets/exports/api.js\";\nimport type { GuardDutyEvent } from \"./types.js\";\nimport { ObjectKey } from \"./ObjectKey.js\";\nimport { GetFileUseCase } from \"@webiny/api-file-manager/features/file/GetFile/index.js\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/abstractions.js\";\n\nexport const processThreatScanResult = async (\n context: ApiCoreContext,\n eventDetail: GuardDutyEvent\n) => {\n const listConnections = context.container.resolve(WebsocketsListConnectionsUseCase);\n const sendToConnections = context.container.resolve(WebsocketsSendToConnectionsUseCase);\n const getFile = context.container.resolve(GetFileUseCase);\n const updateFile = context.container.resolve(UpdateFileUseCase);\n const deleteFile = context.container.resolve(DeleteFileUseCase);\n\n await context.container.resolve(IdentityContext).withoutAuthorization(async () => {\n const scanStatus = eventDetail.scanResultDetails.scanResultStatus;\n const s3Object = eventDetail.s3ObjectDetails;\n\n const fileId = ObjectKey.from(s3Object.objectKey).id();\n const fileResult = await getFile.execute(fileId);\n\n if (fileResult.isFail()) {\n return;\n }\n\n const file = fileResult.value;\n\n let allConnections: ConnectionRegistry.Data[] = [];\n const connectionsResult = await listConnections.execute();\n if (connectionsResult.isOk()) {\n allConnections = connectionsResult.value;\n }\n\n if (scanStatus === \"NO_THREATS_FOUND\") {\n const newTags = file.tags.filter(tag => tag !== \"threatScanInProgress\");\n await updateFile.execute({\n id: file.id,\n tags: newTags\n });\n\n await sendToConnections.execute(allConnections, {\n action: \"fm.threatScan.noThreatFound\",\n data: {\n id: file.id,\n tags: newTags\n }\n });\n\n return;\n }\n\n if (scanStatus === \"THREATS_FOUND\") {\n // Delete the infected file.\n await deleteFile.execute(file.id);\n\n await sendToConnections.execute(allConnections, {\n action: \"fm.threatScan.threatDetected\",\n data: {\n id: file.id,\n name: file.name\n }\n });\n\n return;\n }\n\n // For all other outcomes, we delete the file, until better logic is implemented.\n await deleteFile.execute(file.id);\n\n await sendToConnections.execute(allConnections, {\n action: \"fm.threatScan.unsupported\",\n data: {\n id: file.id,\n name: file.name\n }\n });\n });\n};\n"],"names":["processThreatScanResult","context","eventDetail","listConnections","WebsocketsListConnectionsUseCase","sendToConnections","WebsocketsSendToConnectionsUseCase","getFile","GetFileUseCase","updateFile","UpdateFileUseCase","deleteFile","DeleteFileUseCase","IdentityContext","scanStatus","s3Object","fileId","ObjectKey","fileResult","file","allConnections","connectionsResult","newTags","tag"],"mappings":";;;;;;AAaO,MAAMA,0BAA0B,OACnCC,SACAC;IAEA,MAAMC,kBAAkBF,QAAQ,SAAS,CAAC,OAAO,CAACG;IAClD,MAAMC,oBAAoBJ,QAAQ,SAAS,CAAC,OAAO,CAACK;IACpD,MAAMC,UAAUN,QAAQ,SAAS,CAAC,OAAO,CAACO;IAC1C,MAAMC,aAAaR,QAAQ,SAAS,CAAC,OAAO,CAACS;IAC7C,MAAMC,aAAaV,QAAQ,SAAS,CAAC,OAAO,CAACW;IAE7C,MAAMX,QAAQ,SAAS,CAAC,OAAO,CAACY,iBAAiB,oBAAoB,CAAC;QAClE,MAAMC,aAAaZ,YAAY,iBAAiB,CAAC,gBAAgB;QACjE,MAAMa,WAAWb,YAAY,eAAe;QAE5C,MAAMc,SAASC,UAAU,IAAI,CAACF,SAAS,SAAS,EAAE,EAAE;QACpD,MAAMG,aAAa,MAAMX,QAAQ,OAAO,CAACS;QAEzC,IAAIE,WAAW,MAAM,IACjB;QAGJ,MAAMC,OAAOD,WAAW,KAAK;QAE7B,IAAIE,iBAA4C,EAAE;QAClD,MAAMC,oBAAoB,MAAMlB,gBAAgB,OAAO;QACvD,IAAIkB,kBAAkB,IAAI,IACtBD,iBAAiBC,kBAAkB,KAAK;QAG5C,IAAIP,AAAe,uBAAfA,YAAmC;YACnC,MAAMQ,UAAUH,KAAK,IAAI,CAAC,MAAM,CAACI,CAAAA,MAAOA,AAAQ,2BAARA;YACxC,MAAMd,WAAW,OAAO,CAAC;gBACrB,IAAIU,KAAK,EAAE;gBACX,MAAMG;YACV;YAEA,MAAMjB,kBAAkB,OAAO,CAACe,gBAAgB;gBAC5C,QAAQ;gBACR,MAAM;oBACF,IAAID,KAAK,EAAE;oBACX,MAAMG;gBACV;YACJ;YAEA;QACJ;QAEA,IAAIR,AAAe,oBAAfA,YAAgC;YAEhC,MAAMH,WAAW,OAAO,CAACQ,KAAK,EAAE;YAEhC,MAAMd,kBAAkB,OAAO,CAACe,gBAAgB;gBAC5C,QAAQ;gBACR,MAAM;oBACF,IAAID,KAAK,EAAE;oBACX,MAAMA,KAAK,IAAI;gBACnB;YACJ;YAEA;QACJ;QAGA,MAAMR,WAAW,OAAO,CAACQ,KAAK,EAAE;QAEhC,MAAMd,kBAAkB,OAAO,CAACe,gBAAgB;YAC5C,QAAQ;YACR,MAAM;gBACF,IAAID,KAAK,EAAE;gBACX,MAAMA,KAAK,IAAI;YACnB;QACJ;IACJ;AACJ"}
@@ -1,3 +0,0 @@
1
- export {};
2
-
3
- //# sourceMappingURL=types.js.map
@@ -1,5 +1,8 @@
1
+ import type { ImageFormat } from "@webiny/api-file-manager/features/assetDelivery/transformation/index.js";
1
2
  export type AssetDeliveryParams = {
2
3
  imageResizeWidths?: number[];
4
+ /** Per-format encoder quality (1-100). Merged over the built-in defaults. */
5
+ imageQuality?: Partial<Record<ImageFormat, number>>;
3
6
  /**
4
7
  * BE CAREFUL!
5
8
  * Setting this to more than 1 hour may cause your URLs to still expire before the desired expiration time.
@@ -1,3 +0,0 @@
1
- export {};
2
-
3
- //# sourceMappingURL=types.js.map
@@ -1,8 +1,10 @@
1
1
  import { CreateFileUseCase } from "@webiny/api-file-manager/features/file/CreateFile/abstractions.js";
2
2
  import type { CreateFileInput } from "@webiny/api-file-manager/features/file/CreateFile/abstractions.js";
3
+ import { FeatureFlags } from "@webiny/api-core/features/featureFlags/abstractions.js";
3
4
  declare class CreateFileWithThreatScanDecoratorImpl implements CreateFileUseCase.Interface {
5
+ private featureFlags;
4
6
  private decoratee;
5
- constructor(decoratee: CreateFileUseCase.Interface);
7
+ constructor(featureFlags: FeatureFlags.Interface, decoratee: CreateFileUseCase.Interface);
6
8
  execute(input: CreateFileInput, meta?: Record<string, any>): ReturnType<CreateFileUseCase.Interface["execute"]>;
7
9
  }
8
10
  export declare const CreateFileWithThreatScanDecorator: typeof CreateFileWithThreatScanDecoratorImpl & {