@webiny/api-file-manager-s3 0.0.0-unstable.78f581c1d2 → 0.0.0-unstable.7be00a75a9
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.
- package/README.md +11 -1
- package/assetDelivery/abstractions.d.ts +9 -0
- package/assetDelivery/abstractions.js +7 -0
- package/assetDelivery/abstractions.js.map +1 -0
- package/assetDelivery/assetDeliveryConfig.d.ts +2 -0
- package/assetDelivery/assetDeliveryConfig.js +15 -0
- package/assetDelivery/assetDeliveryConfig.js.map +1 -0
- package/assetDelivery/createAssetDelivery.d.ts +3 -0
- package/assetDelivery/createAssetDelivery.js +9 -0
- package/assetDelivery/createAssetDelivery.js.map +1 -0
- package/assetDelivery/feature.d.ts +5 -0
- package/assetDelivery/feature.js +37 -0
- package/assetDelivery/feature.js.map +1 -0
- package/assetDelivery/index.d.ts +8 -0
- package/assetDelivery/index.js +8 -0
- package/assetDelivery/s3/S3AssetResolver.d.ts +14 -0
- package/assetDelivery/s3/S3AssetResolver.js +39 -0
- package/assetDelivery/s3/S3AssetResolver.js.map +1 -0
- package/assetDelivery/s3/S3ContentsReader.d.ts +8 -0
- package/assetDelivery/s3/S3ContentsReader.js +17 -0
- package/assetDelivery/s3/S3ContentsReader.js.map +1 -0
- package/assetDelivery/s3/S3ErrorAssetReply.d.ts +4 -0
- package/assetDelivery/s3/S3ErrorAssetReply.js +14 -0
- package/assetDelivery/s3/S3ErrorAssetReply.js.map +1 -0
- package/assetDelivery/s3/S3OutputStrategy.d.ts +15 -0
- package/assetDelivery/s3/S3OutputStrategy.js +40 -0
- package/assetDelivery/s3/S3OutputStrategy.js.map +1 -0
- package/assetDelivery/s3/S3RedirectAssetReply.d.ts +4 -0
- package/assetDelivery/s3/S3RedirectAssetReply.js +17 -0
- package/assetDelivery/s3/S3RedirectAssetReply.js.map +1 -0
- package/assetDelivery/s3/S3StreamAssetReply.d.ts +5 -0
- package/assetDelivery/s3/S3StreamAssetReply.js +17 -0
- package/assetDelivery/s3/S3StreamAssetReply.js.map +1 -0
- package/assetDelivery/s3/SharpTransform.d.ts +18 -0
- package/assetDelivery/s3/SharpTransform.js +162 -0
- package/assetDelivery/s3/SharpTransform.js.map +1 -0
- package/assetDelivery/s3/transformation/AssetKeyGenerator.d.ts +8 -0
- package/assetDelivery/s3/transformation/AssetKeyGenerator.js +21 -0
- package/assetDelivery/s3/transformation/AssetKeyGenerator.js.map +1 -0
- package/assetDelivery/s3/transformation/CallableContentsReader.d.ts +10 -0
- package/assetDelivery/s3/transformation/CallableContentsReader.js +11 -0
- package/assetDelivery/s3/transformation/CallableContentsReader.js.map +1 -0
- package/assetDelivery/s3/transformation/WidthCollection.d.ts +7 -0
- package/assetDelivery/s3/transformation/WidthCollection.js +19 -0
- package/assetDelivery/s3/transformation/WidthCollection.js.map +1 -0
- package/assetDelivery/s3/transformation/utils.d.ts +9 -0
- package/assetDelivery/s3/transformation/utils.js +31 -0
- package/assetDelivery/s3/transformation/utils.js.map +1 -0
- package/assetDelivery/threatDetection/ObjectKey.d.ts +7 -0
- package/assetDelivery/threatDetection/ObjectKey.js +18 -0
- package/assetDelivery/threatDetection/ObjectKey.js.map +1 -0
- package/assetDelivery/threatDetection/createThreatDetectionEventHandler.d.ts +2 -0
- package/assetDelivery/threatDetection/createThreatDetectionEventHandler.js +37 -0
- package/assetDelivery/threatDetection/createThreatDetectionEventHandler.js.map +1 -0
- package/assetDelivery/threatDetection/createThreatDetectionPluginLoader.d.ts +2 -0
- package/assetDelivery/threatDetection/createThreatDetectionPluginLoader.js +5 -0
- package/assetDelivery/threatDetection/createThreatDetectionPluginLoader.js.map +1 -0
- package/assetDelivery/threatDetection/index.d.ts +2 -0
- package/assetDelivery/threatDetection/index.js +2 -0
- package/assetDelivery/threatDetection/processThreatScanResult.d.ts +3 -0
- package/assetDelivery/threatDetection/processThreatScanResult.js +59 -0
- package/assetDelivery/threatDetection/processThreatScanResult.js.map +1 -0
- package/assetDelivery/threatDetection/types.d.ts +9 -0
- package/assetDelivery/threatDetection/types.js +0 -0
- package/assetDelivery/types.d.ts +10 -0
- package/assetDelivery/types.js +0 -0
- package/enterprise/ApplyThreatScanning/CreateFileWithThreatScanDecorator.d.ts +11 -0
- package/enterprise/ApplyThreatScanning/CreateFileWithThreatScanDecorator.js +23 -0
- package/enterprise/ApplyThreatScanning/CreateFileWithThreatScanDecorator.js.map +1 -0
- package/enterprise/ApplyThreatScanning/feature.d.ts +4 -0
- package/enterprise/ApplyThreatScanning/feature.js +11 -0
- package/enterprise/ApplyThreatScanning/feature.js.map +1 -0
- package/features/DeleteFileFromBucket/DeleteFileFromBucketHandler.d.ts +15 -0
- package/features/DeleteFileFromBucket/DeleteFileFromBucketHandler.js +35 -0
- package/features/DeleteFileFromBucket/DeleteFileFromBucketHandler.js.map +1 -0
- package/features/DeleteFileFromBucket/DeleteS3FolderTask.d.ts +32 -0
- package/features/DeleteFileFromBucket/DeleteS3FolderTask.js +50 -0
- package/features/DeleteFileFromBucket/DeleteS3FolderTask.js.map +1 -0
- package/features/DeleteFileFromBucket/feature.d.ts +4 -0
- package/features/DeleteFileFromBucket/feature.js +13 -0
- package/features/DeleteFileFromBucket/feature.js.map +1 -0
- package/features/ExtractMetadata/ExtractMetadataHandler.d.ts +11 -0
- package/features/ExtractMetadata/ExtractMetadataHandler.js +25 -0
- package/features/ExtractMetadata/ExtractMetadataHandler.js.map +1 -0
- package/features/ExtractMetadata/ExtractMetadataTask.d.ts +24 -0
- package/features/ExtractMetadata/ExtractMetadataTask.js +90 -0
- package/features/ExtractMetadata/ExtractMetadataTask.js.map +1 -0
- package/features/ExtractMetadata/feature.d.ts +4 -0
- package/features/ExtractMetadata/feature.js +13 -0
- package/features/ExtractMetadata/feature.js.map +1 -0
- package/features/FlushCache/FlushCacheOnFileDeleteHandler.d.ts +12 -0
- package/features/FlushCache/FlushCacheOnFileDeleteHandler.js +28 -0
- package/features/FlushCache/FlushCacheOnFileDeleteHandler.js.map +1 -0
- package/features/FlushCache/FlushCacheOnFileUpdateHandler.d.ts +12 -0
- package/features/FlushCache/FlushCacheOnFileUpdateHandler.js +31 -0
- package/features/FlushCache/FlushCacheOnFileUpdateHandler.js.map +1 -0
- package/features/FlushCache/InvalidateCacheTask.d.ts +26 -0
- package/features/FlushCache/InvalidateCacheTask.js +75 -0
- package/features/FlushCache/InvalidateCacheTask.js.map +1 -0
- package/features/FlushCache/feature.d.ts +4 -0
- package/features/FlushCache/feature.js +15 -0
- package/features/FlushCache/feature.js.map +1 -0
- package/features/GetFileContentsById/GetFileContentsByIdUseCase.d.ts +13 -0
- package/features/GetFileContentsById/GetFileContentsByIdUseCase.js +40 -0
- package/features/GetFileContentsById/GetFileContentsByIdUseCase.js.map +1 -0
- package/features/GetFileContentsById/feature.d.ts +4 -0
- package/features/GetFileContentsById/feature.js +11 -0
- package/features/GetFileContentsById/feature.js.map +1 -0
- package/features/GetFileContentsByKey/GetFileContentsByKeyUseCase.d.ts +13 -0
- package/features/GetFileContentsByKey/GetFileContentsByKeyUseCase.js +40 -0
- package/features/GetFileContentsByKey/GetFileContentsByKeyUseCase.js.map +1 -0
- package/features/GetFileContentsByKey/feature.d.ts +4 -0
- package/features/GetFileContentsByKey/feature.js +11 -0
- package/features/GetFileContentsByKey/feature.js.map +1 -0
- package/features/WriteFileMetadata/MetadataReader.d.ts +14 -0
- package/features/WriteFileMetadata/MetadataReader.js +13 -0
- package/features/WriteFileMetadata/MetadataReader.js.map +1 -0
- package/features/WriteFileMetadata/MetadataWriter.d.ts +10 -0
- package/features/WriteFileMetadata/MetadataWriter.js +26 -0
- package/features/WriteFileMetadata/MetadataWriter.js.map +1 -0
- package/features/WriteFileMetadata/WriteMetadataAfterBatchCreateHandler.d.ts +12 -0
- package/features/WriteFileMetadata/WriteMetadataAfterBatchCreateHandler.js +23 -0
- package/features/WriteFileMetadata/WriteMetadataAfterBatchCreateHandler.js.map +1 -0
- package/features/WriteFileMetadata/WriteMetadataAfterCreateHandler.d.ts +12 -0
- package/features/WriteFileMetadata/WriteMetadataAfterCreateHandler.js +25 -0
- package/features/WriteFileMetadata/WriteMetadataAfterCreateHandler.js.map +1 -0
- package/features/WriteFileMetadata/feature.d.ts +4 -0
- package/features/WriteFileMetadata/feature.js +13 -0
- package/features/WriteFileMetadata/feature.js.map +1 -0
- package/graphql/checkPermissions.d.ts +5 -0
- package/graphql/checkPermissions.js +22 -0
- package/graphql/checkPermissions.js.map +1 -0
- package/graphql/schema.d.ts +1 -0
- package/graphql/schema.js +201 -0
- package/graphql/schema.js.map +1 -0
- package/index.d.ts +4 -2
- package/index.js +29 -14
- package/index.js.map +1 -1
- package/multiPartUpload/CompleteMultiPartUploadUseCase.d.ts +15 -0
- package/multiPartUpload/CompleteMultiPartUploadUseCase.js +55 -0
- package/multiPartUpload/CompleteMultiPartUploadUseCase.js.map +1 -0
- package/multiPartUpload/CreateMultiPartUploadUseCase.d.ts +20 -0
- package/multiPartUpload/CreateMultiPartUploadUseCase.js +34 -0
- package/multiPartUpload/CreateMultiPartUploadUseCase.js.map +1 -0
- package/package.json +35 -24
- package/types.d.ts +14 -9
- package/types.js +1 -5
- package/utils/CdnPathsGenerator.d.ts +3 -0
- package/utils/CdnPathsGenerator.js +11 -0
- package/utils/CdnPathsGenerator.js.map +1 -0
- package/utils/FileExtension.d.ts +6 -0
- package/utils/FileExtension.js +16 -0
- package/utils/FileExtension.js.map +1 -0
- package/utils/FileKey.d.ts +11 -0
- package/utils/FileKey.js +33 -0
- package/utils/FileKey.js.map +1 -0
- package/utils/FileKey.test.d.ts +1 -0
- package/utils/FileKey.test.js +59 -0
- package/utils/FileKey.test.js.map +1 -0
- package/utils/FileNormalizer.d.ts +18 -0
- package/utils/FileNormalizer.js +41 -0
- package/utils/FileNormalizer.js.map +1 -0
- package/utils/FileUploadModifier.d.ts +30 -0
- package/utils/FileUploadModifier.js +39 -0
- package/utils/FileUploadModifier.js.map +1 -0
- package/utils/createFileNormalizerFromContext.d.ts +3 -0
- package/utils/createFileNormalizerFromContext.js +9 -0
- package/utils/createFileNormalizerFromContext.js.map +1 -0
- package/utils/getPresignedPostPayload.d.ts +4 -4
- package/utils/getPresignedPostPayload.js +39 -83
- package/utils/getPresignedPostPayload.js.map +1 -1
- package/utils/mimeTypes.d.ts +5 -0
- package/utils/mimeTypes.js +9 -0
- package/utils/mimeTypes.js.map +1 -0
- package/utils/uploadFileToS3.d.ts +2 -4
- package/utils/uploadFileToS3.js +12 -27
- package/utils/uploadFileToS3.js.map +1 -1
- package/plugins/fileStorageS3.d.ts +0 -6
- package/plugins/fileStorageS3.js +0 -68
- package/plugins/fileStorageS3.js.map +0 -1
- package/plugins/graphqlFileStorageS3.d.ts +0 -4
- package/plugins/graphqlFileStorageS3.js +0 -150
- package/plugins/graphqlFileStorageS3.js.map +0 -1
- package/types.js.map +0 -1
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Asset } from "@webiny/api-file-manager";
|
|
2
|
+
export declare class AssetKeyGenerator {
|
|
3
|
+
private utils;
|
|
4
|
+
private asset;
|
|
5
|
+
constructor(asset: Asset);
|
|
6
|
+
getOptimizedImageKey(): string;
|
|
7
|
+
getTransformedImageKey(transformations: Record<string, any>): string;
|
|
8
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import * as __rspack_external__utils_js_d88b7fe1 from "./utils.js";
|
|
2
|
+
class AssetKeyGenerator {
|
|
3
|
+
constructor(asset){
|
|
4
|
+
this.asset = asset;
|
|
5
|
+
this.utils = __rspack_external__utils_js_d88b7fe1;
|
|
6
|
+
}
|
|
7
|
+
getOptimizedImageKey() {
|
|
8
|
+
return this.utils.getImageKey({
|
|
9
|
+
key: this.asset.getKey()
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
getTransformedImageKey(transformations) {
|
|
13
|
+
return this.utils.getImageKey({
|
|
14
|
+
key: this.asset.getKey(),
|
|
15
|
+
transformations
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export { AssetKeyGenerator };
|
|
20
|
+
|
|
21
|
+
//# sourceMappingURL=AssetKeyGenerator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assetDelivery/s3/transformation/AssetKeyGenerator.js","sources":["../../../../src/assetDelivery/s3/transformation/AssetKeyGenerator.ts"],"sourcesContent":["import type { Asset } from \"@webiny/api-file-manager\";\nimport * as newUtils from \"./utils.js\";\n\nexport class AssetKeyGenerator {\n private utils: typeof newUtils;\n private asset: Asset;\n\n constructor(asset: Asset) {\n this.asset = asset;\n this.utils = newUtils;\n }\n\n getOptimizedImageKey() {\n return this.utils.getImageKey({ key: this.asset.getKey() });\n }\n getTransformedImageKey(transformations: Record<string, any>) {\n return this.utils.getImageKey({ key: this.asset.getKey(), transformations });\n }\n}\n"],"names":["AssetKeyGenerator","asset","newUtils","transformations"],"mappings":";AAGO,MAAMA;IAIT,YAAYC,KAAY,CAAE;QACtB,IAAI,CAAC,KAAK,GAAGA;QACb,IAAI,CAAC,KAAK,GAAGC;IACjB;IAEA,uBAAuB;QACnB,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;YAAE,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM;QAAG;IAC7D;IACA,uBAAuBC,eAAoC,EAAE;QACzD,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;YAAE,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM;YAAIA;QAAgB;IAC9E;AACJ"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { AssetContentsReader } from "@webiny/api-file-manager";
|
|
2
|
+
interface ContentsCallable {
|
|
3
|
+
(): Promise<Buffer> | Buffer;
|
|
4
|
+
}
|
|
5
|
+
export declare class CallableContentsReader implements AssetContentsReader {
|
|
6
|
+
private readonly callable;
|
|
7
|
+
constructor(callable: ContentsCallable);
|
|
8
|
+
read(): Promise<Buffer>;
|
|
9
|
+
}
|
|
10
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
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();
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export { WidthCollection };
|
|
18
|
+
|
|
19
|
+
//# sourceMappingURL=WidthCollection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
declare const SUPPORTED_TRANSFORMABLE_IMAGES: string[];
|
|
2
|
+
declare const getOptimizedImageKeyPrefix: (key: string) => string;
|
|
3
|
+
declare const getOptimizedTransformedImageKeyPrefix: (key: string, transformationsHash: string) => string;
|
|
4
|
+
interface GetImageKeyParams {
|
|
5
|
+
key: string;
|
|
6
|
+
transformations?: any;
|
|
7
|
+
}
|
|
8
|
+
declare const getImageKey: ({ key, transformations }: GetImageKeyParams) => string;
|
|
9
|
+
export { SUPPORTED_TRANSFORMABLE_IMAGES, getImageKey, getOptimizedImageKeyPrefix, getOptimizedTransformedImageKeyPrefix };
|
|
@@ -0,0 +1,31 @@
|
|
|
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
|
+
};
|
|
16
|
+
};
|
|
17
|
+
const getOptimizedImageKeyPrefix = (key)=>{
|
|
18
|
+
const { filename, dirname } = parseKey(key);
|
|
19
|
+
return `${dirname}/optimized/${filename}`;
|
|
20
|
+
};
|
|
21
|
+
const getOptimizedTransformedImageKeyPrefix = (key, transformationsHash)=>{
|
|
22
|
+
const { filename, dirname } = parseKey(key);
|
|
23
|
+
return `${dirname}/optimized/${transformationsHash}-${filename}`;
|
|
24
|
+
};
|
|
25
|
+
const getImageKey = ({ key, transformations })=>{
|
|
26
|
+
if (!transformations) return getOptimizedImageKeyPrefix(key);
|
|
27
|
+
return getOptimizedTransformedImageKeyPrefix(key, object_hash(transformations));
|
|
28
|
+
};
|
|
29
|
+
export { SUPPORTED_TRANSFORMABLE_IMAGES, getImageKey, getOptimizedImageKeyPrefix, getOptimizedTransformedImageKeyPrefix };
|
|
30
|
+
|
|
31
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
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
|
+
}
|
|
16
|
+
export { ObjectKey };
|
|
17
|
+
|
|
18
|
+
//# sourceMappingURL=ObjectKey.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
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>)[];
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { createEventBridgeEventHandler } from "@webiny/handler-aws";
|
|
2
|
+
import { createHandlerOnRequest } from "@webiny/handler";
|
|
3
|
+
import { GlobalKeyValueStore } from "@webiny/api-core/features/keyValueStore/index.js";
|
|
4
|
+
import { processThreatScanResult } from "./processThreatScanResult.js";
|
|
5
|
+
import { ObjectKey } from "./ObjectKey.js";
|
|
6
|
+
const detailType = "GuardDuty Malware Protection Object Scan Result";
|
|
7
|
+
const createThreatDetectionEventHandler = ()=>{
|
|
8
|
+
const handlerOnRequest = createHandlerOnRequest(async (request, _, context)=>{
|
|
9
|
+
const payload = request.body;
|
|
10
|
+
if (payload["detail-type"] !== detailType) return;
|
|
11
|
+
const objectKey = payload.detail.s3ObjectDetails.objectKey;
|
|
12
|
+
const keyValueStore = context.container.resolve(GlobalKeyValueStore);
|
|
13
|
+
try {
|
|
14
|
+
const fileId = ObjectKey.from(objectKey).id();
|
|
15
|
+
const result = await keyValueStore.get(`FileManager/File/${fileId}/Metadata`);
|
|
16
|
+
if (result.isFail()) return;
|
|
17
|
+
request.headers = {
|
|
18
|
+
...request.headers,
|
|
19
|
+
"x-tenant": result.value.tenant
|
|
20
|
+
};
|
|
21
|
+
} catch {}
|
|
22
|
+
});
|
|
23
|
+
const threatScanEventHandler = createEventBridgeEventHandler(async ({ payload, next, ...rest })=>{
|
|
24
|
+
const context = rest.context;
|
|
25
|
+
const threatDetectionEnabled = context.wcp.canUseFileManagerThreatDetection();
|
|
26
|
+
if (!threatDetectionEnabled || payload["detail-type"] !== detailType) return next();
|
|
27
|
+
await processThreatScanResult(context, payload.detail);
|
|
28
|
+
});
|
|
29
|
+
threatScanEventHandler.name = threatScanEventHandler.type + ".threatDetectionEventHandler";
|
|
30
|
+
return [
|
|
31
|
+
handlerOnRequest,
|
|
32
|
+
threatScanEventHandler
|
|
33
|
+
];
|
|
34
|
+
};
|
|
35
|
+
export { createThreatDetectionEventHandler };
|
|
36
|
+
|
|
37
|
+
//# sourceMappingURL=createThreatDetectionEventHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assetDelivery/threatDetection/createThreatDetectionEventHandler.js","sources":["../../../src/assetDelivery/threatDetection/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"],"names":["detailType","createThreatDetectionEventHandler","handlerOnRequest","createHandlerOnRequest","request","_","context","payload","objectKey","keyValueStore","GlobalKeyValueStore","fileId","ObjectKey","result","threatScanEventHandler","createEventBridgeEventHandler","next","rest","threatDetectionEnabled","processThreatScanResult"],"mappings":";;;;;AASA,MAAMA,aAAa;AAEZ,MAAMC,oCAAoC;IAC7C,MAAMC,mBAAmBC,uBAAuB,OAAOC,SAASC,GAAGC;QAC/D,MAAMC,UAAUH,QAAQ,IAAI;QAE5B,IAAIG,OAAO,CAAC,cAAc,KAAKP,YAC3B;QAGJ,MAAMQ,YAAYD,QAAQ,MAAM,CAAC,eAAe,CAAC,SAAS;QAC1D,MAAME,gBAAgBH,QAAQ,SAAS,CAAC,OAAO,CAACI;QAEhD,IAAI;YAEA,MAAMC,SAASC,UAAU,IAAI,CAACJ,WAAW,EAAE;YAC3C,MAAMK,SAAS,MAAMJ,cAAc,GAAG,CAClC,CAAC,iBAAiB,EAAEE,OAAO,SAAS,CAAC;YAGzC,IAAIE,OAAO,MAAM,IACb;YAGJT,QAAQ,OAAO,GAAG;gBACd,GAAGA,QAAQ,OAAO;gBAClB,YAAYS,OAAO,KAAK,CAAC,MAAM;YACnC;QACJ,EAAE,OAAM,CAIR;IACJ;IAEA,MAAMC,yBAAyBC,8BAC3B,OAAO,EAAER,OAAO,EAAES,IAAI,EAAE,GAAGC,MAAM;QAC7B,MAAMX,UAAUW,KAAK,OAAO;QAE5B,MAAMC,yBAAyBZ,QAAQ,GAAG,CAAC,gCAAgC;QAE3E,IAAI,CAACY,0BAA0BX,OAAO,CAAC,cAAc,KAAKP,YACtD,OAAOgB;QAGX,MAAMG,wBAAwBb,SAASC,QAAQ,MAAM;IACzD;IAIJO,uBAAuB,IAAI,GAAGA,uBAAuB,IAAI,GAAG;IAE5D,OAAO;QAACZ;QAAkBY;KAAuB;AACrD"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { createConditionalPluginFactory } from "@webiny/api";
|
|
2
|
+
const createThreatDetectionPluginLoader = (cb)=>createConditionalPluginFactory(()=>"threat-detection-event-handler" === process.env.WEBINY_FUNCTION_TYPE, cb);
|
|
3
|
+
export { createThreatDetectionPluginLoader };
|
|
4
|
+
|
|
5
|
+
//# sourceMappingURL=createThreatDetectionPluginLoader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { UpdateFileUseCase } from "@webiny/api-file-manager/features/file/UpdateFile/index.js";
|
|
2
|
+
import { DeleteFileUseCase } from "@webiny/api-file-manager/features/file/DeleteFile/index.js";
|
|
3
|
+
import { WebsocketService } from "@webiny/api-websockets/features/WebsocketService/index.js";
|
|
4
|
+
import { ObjectKey } from "./ObjectKey.js";
|
|
5
|
+
import { GetFileUseCase } from "@webiny/api-file-manager/features/file/GetFile/index.js";
|
|
6
|
+
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()) return;
|
|
17
|
+
const file = fileResult.value;
|
|
18
|
+
let allConnections = [];
|
|
19
|
+
const connectionsResult = await websocketService.listConnections();
|
|
20
|
+
if (connectionsResult.isOk()) allConnections = connectionsResult.value;
|
|
21
|
+
if ("NO_THREATS_FOUND" === scanStatus) {
|
|
22
|
+
const newTags = file.tags.filter((tag)=>"threatScanInProgress" !== tag);
|
|
23
|
+
await updateFile.execute({
|
|
24
|
+
id: file.id,
|
|
25
|
+
tags: newTags
|
|
26
|
+
});
|
|
27
|
+
await websocketService.sendToConnections(allConnections, {
|
|
28
|
+
action: "fm.threatScan.noThreatFound",
|
|
29
|
+
data: {
|
|
30
|
+
id: file.id,
|
|
31
|
+
tags: newTags
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
if ("THREATS_FOUND" === scanStatus) {
|
|
37
|
+
await deleteFile.execute(file.id);
|
|
38
|
+
await websocketService.sendToConnections(allConnections, {
|
|
39
|
+
action: "fm.threatScan.threatDetected",
|
|
40
|
+
data: {
|
|
41
|
+
id: file.id,
|
|
42
|
+
name: file.name
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
await deleteFile.execute(file.id);
|
|
48
|
+
await websocketService.sendToConnections(allConnections, {
|
|
49
|
+
action: "fm.threatScan.unsupported",
|
|
50
|
+
data: {
|
|
51
|
+
id: file.id,
|
|
52
|
+
name: file.name
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
};
|
|
57
|
+
export { processThreatScanResult };
|
|
58
|
+
|
|
59
|
+
//# sourceMappingURL=processThreatScanResult.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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 { 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"],"names":["processThreatScanResult","context","eventDetail","websocketService","WebsocketService","getFile","GetFileUseCase","updateFile","UpdateFileUseCase","deleteFile","DeleteFileUseCase","scanStatus","s3Object","fileId","ObjectKey","fileResult","file","allConnections","connectionsResult","newTags","tag"],"mappings":";;;;;AAQO,MAAMA,0BAA0B,OACnCC,SACAC;IAEA,MAAMC,mBAAmBF,QAAQ,SAAS,CAAC,OAAO,CAACG;IACnD,MAAMC,UAAUJ,QAAQ,SAAS,CAAC,OAAO,CAACK;IAC1C,MAAMC,aAAaN,QAAQ,SAAS,CAAC,OAAO,CAACO;IAC7C,MAAMC,aAAaR,QAAQ,SAAS,CAAC,OAAO,CAACS;IAE7C,MAAMT,QAAQ,QAAQ,CAAC,oBAAoB,CAAC;QACxC,MAAMU,aAAaT,YAAY,iBAAiB,CAAC,gBAAgB;QACjE,MAAMU,WAAWV,YAAY,eAAe;QAE5C,MAAMW,SAASC,UAAU,IAAI,CAACF,SAAS,SAAS,EAAE,EAAE;QACpD,MAAMG,aAAa,MAAMV,QAAQ,OAAO,CAACQ;QAEzC,IAAIE,WAAW,MAAM,IACjB;QAGJ,MAAMC,OAAOD,WAAW,KAAK;QAE7B,IAAIE,iBAAgD,EAAE;QACtD,MAAMC,oBAAoB,MAAMf,iBAAiB,eAAe;QAChE,IAAIe,kBAAkB,IAAI,IACtBD,iBAAiBC,kBAAkB,KAAK;QAG5C,IAAIP,AAAe,uBAAfA,YAAmC;YACnC,MAAMQ,UAAUH,KAAK,IAAI,CAAC,MAAM,CAACI,CAAAA,MAAOA,AAAQ,2BAARA;YACxC,MAAMb,WAAW,OAAO,CAAC;gBACrB,IAAIS,KAAK,EAAE;gBACX,MAAMG;YACV;YAEA,MAAMhB,iBAAiB,iBAAiB,CAACc,gBAAgB;gBACrD,QAAQ;gBACR,MAAM;oBACF,IAAID,KAAK,EAAE;oBACX,MAAMG;gBACV;YACJ;YAEA;QACJ;QAEA,IAAIR,AAAe,oBAAfA,YAAgC;YAEhC,MAAMF,WAAW,OAAO,CAACO,KAAK,EAAE;YAEhC,MAAMb,iBAAiB,iBAAiB,CAACc,gBAAgB;gBACrD,QAAQ;gBACR,MAAM;oBACF,IAAID,KAAK,EAAE;oBACX,MAAMA,KAAK,IAAI;gBACnB;YACJ;YAEA;QACJ;QAGA,MAAMP,WAAW,OAAO,CAACO,KAAK,EAAE;QAEhC,MAAMb,iBAAiB,iBAAiB,CAACc,gBAAgB;YACrD,QAAQ;YACR,MAAM;gBACF,IAAID,KAAK,EAAE;gBACX,MAAMA,KAAK,IAAI;YACnB;QACJ;IACJ;AACJ"}
|
|
File without changes
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type AssetDeliveryParams = {
|
|
2
|
+
imageResizeWidths?: number[];
|
|
3
|
+
/**
|
|
4
|
+
* BE CAREFUL!
|
|
5
|
+
* Setting this to more than 1 hour may cause your URLs to still expire before the desired expiration time.
|
|
6
|
+
* @see https://repost.aws/knowledge-center/presigned-url-s3-bucket-expiration
|
|
7
|
+
*/
|
|
8
|
+
presignedUrlTtl?: number;
|
|
9
|
+
assetStreamingMaxSize?: number;
|
|
10
|
+
};
|
|
File without changes
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { CreateFileUseCase } from "@webiny/api-file-manager/features/file/CreateFile/abstractions.js";
|
|
2
|
+
import type { CreateFileInput } from "@webiny/api-file-manager/features/file/CreateFile/abstractions.js";
|
|
3
|
+
declare class CreateFileWithThreatScanDecoratorImpl implements CreateFileUseCase.Interface {
|
|
4
|
+
private decoratee;
|
|
5
|
+
constructor(decoratee: CreateFileUseCase.Interface);
|
|
6
|
+
execute(input: CreateFileInput, meta?: Record<string, any>): ReturnType<CreateFileUseCase.Interface["execute"]>;
|
|
7
|
+
}
|
|
8
|
+
export declare const CreateFileWithThreatScanDecorator: typeof CreateFileWithThreatScanDecoratorImpl & {
|
|
9
|
+
__abstraction: import("@webiny/di").Abstraction<import("@webiny/api-file-manager/features/file/CreateFile/abstractions.js").ICreateFileUseCase>;
|
|
10
|
+
};
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { CreateFileUseCase } from "@webiny/api-file-manager/features/file/CreateFile/abstractions.js";
|
|
2
|
+
class CreateFileWithThreatScanDecoratorImpl {
|
|
3
|
+
constructor(decoratee){
|
|
4
|
+
this.decoratee = decoratee;
|
|
5
|
+
}
|
|
6
|
+
async execute(input, meta) {
|
|
7
|
+
const modifiedInput = {
|
|
8
|
+
...input,
|
|
9
|
+
tags: [
|
|
10
|
+
...input.tags || [],
|
|
11
|
+
"threatScanInProgress"
|
|
12
|
+
]
|
|
13
|
+
};
|
|
14
|
+
return this.decoratee.execute(modifiedInput, meta);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
const CreateFileWithThreatScanDecorator = CreateFileUseCase.createDecorator({
|
|
18
|
+
decorator: CreateFileWithThreatScanDecoratorImpl,
|
|
19
|
+
dependencies: []
|
|
20
|
+
});
|
|
21
|
+
export { CreateFileWithThreatScanDecorator };
|
|
22
|
+
|
|
23
|
+
//# sourceMappingURL=CreateFileWithThreatScanDecorator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enterprise/ApplyThreatScanning/CreateFileWithThreatScanDecorator.js","sources":["../../../src/enterprise/ApplyThreatScanning/CreateFileWithThreatScanDecorator.ts"],"sourcesContent":["import { CreateFileUseCase } from \"@webiny/api-file-manager/features/file/CreateFile/abstractions.js\";\nimport type { CreateFileInput } from \"@webiny/api-file-manager/features/file/CreateFile/abstractions.js\";\n\nclass CreateFileWithThreatScanDecoratorImpl implements CreateFileUseCase.Interface {\n constructor(private decoratee: CreateFileUseCase.Interface) {}\n\n async execute(\n input: CreateFileInput,\n meta?: Record<string, any>\n ): ReturnType<CreateFileUseCase.Interface[\"execute\"]> {\n const modifiedInput: CreateFileInput = {\n ...input,\n tags: [...(input.tags || []), \"threatScanInProgress\"]\n };\n\n return this.decoratee.execute(modifiedInput, meta);\n }\n}\n\nexport const CreateFileWithThreatScanDecorator = CreateFileUseCase.createDecorator({\n decorator: CreateFileWithThreatScanDecoratorImpl,\n dependencies: []\n});\n"],"names":["CreateFileWithThreatScanDecoratorImpl","decoratee","input","meta","modifiedInput","CreateFileWithThreatScanDecorator","CreateFileUseCase"],"mappings":";AAGA,MAAMA;IACF,YAAoBC,SAAsC,CAAE;aAAxCA,SAAS,GAATA;IAAyC;IAE7D,MAAM,QACFC,KAAsB,EACtBC,IAA0B,EACwB;QAClD,MAAMC,gBAAiC;YACnC,GAAGF,KAAK;YACR,MAAM;mBAAKA,MAAM,IAAI,IAAI,EAAE;gBAAG;aAAuB;QACzD;QAEA,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAACE,eAAeD;IACjD;AACJ;AAEO,MAAME,oCAAoCC,kBAAkB,eAAe,CAAC;IAC/E,WAAWN;IACX,cAAc,EAAE;AACpB"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { createFeature } from "@webiny/feature/api";
|
|
2
|
+
import { CreateFileWithThreatScanDecorator } from "./CreateFileWithThreatScanDecorator.js";
|
|
3
|
+
const ApplyThreatScanningFeature = createFeature({
|
|
4
|
+
name: "FileManagerS3/ApplyThreatScanning",
|
|
5
|
+
register (container) {
|
|
6
|
+
container.registerDecorator(CreateFileWithThreatScanDecorator);
|
|
7
|
+
}
|
|
8
|
+
});
|
|
9
|
+
export { ApplyThreatScanningFeature };
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=feature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enterprise/ApplyThreatScanning/feature.js","sources":["../../../src/enterprise/ApplyThreatScanning/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { CreateFileWithThreatScanDecorator } from \"./CreateFileWithThreatScanDecorator.js\";\n\nexport const ApplyThreatScanningFeature = createFeature({\n name: \"FileManagerS3/ApplyThreatScanning\",\n register(container) {\n container.registerDecorator(CreateFileWithThreatScanDecorator);\n }\n});\n"],"names":["ApplyThreatScanningFeature","createFeature","container","CreateFileWithThreatScanDecorator"],"mappings":";;AAGO,MAAMA,6BAA6BC,cAAc;IACpD,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,iBAAiB,CAACC;IAChC;AACJ"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { FileAfterDeleteEventHandler } from "@webiny/api-file-manager/features/file/DeleteFile/events.js";
|
|
2
|
+
import { TaskService } from "@webiny/api-core/features/task/TaskService/index.js";
|
|
3
|
+
import { GlobalKeyValueStore } from "@webiny/api-core/features/keyValueStore/index.js";
|
|
4
|
+
import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
|
|
5
|
+
declare class DeleteFileFromBucketHandlerImpl implements FileAfterDeleteEventHandler.Interface {
|
|
6
|
+
private tenantContext;
|
|
7
|
+
private taskService;
|
|
8
|
+
private keyValueStore;
|
|
9
|
+
constructor(tenantContext: TenantContext.Interface, taskService: TaskService.Interface, keyValueStore: GlobalKeyValueStore.Interface);
|
|
10
|
+
handle(event: FileAfterDeleteEventHandler.Event): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
export declare const DeleteFileFromBucketHandler: typeof DeleteFileFromBucketHandlerImpl & {
|
|
13
|
+
__abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/eventPublisher").IEventHandler<import("@webiny/api-file-manager/features/file/DeleteFile/events.js").FileAfterDeleteEvent>>;
|
|
14
|
+
};
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { FileAfterDeleteEventHandler } from "@webiny/api-file-manager/features/file/DeleteFile/events.js";
|
|
2
|
+
import { TaskService } from "@webiny/api-core/features/task/TaskService/index.js";
|
|
3
|
+
import { GlobalKeyValueStore } from "@webiny/api-core/features/keyValueStore/index.js";
|
|
4
|
+
import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
|
|
5
|
+
class DeleteFileFromBucketHandlerImpl {
|
|
6
|
+
constructor(tenantContext, taskService, keyValueStore){
|
|
7
|
+
this.tenantContext = tenantContext;
|
|
8
|
+
this.taskService = taskService;
|
|
9
|
+
this.keyValueStore = keyValueStore;
|
|
10
|
+
}
|
|
11
|
+
async handle(event) {
|
|
12
|
+
const { file } = event.payload;
|
|
13
|
+
const tenant = this.tenantContext.getTenant();
|
|
14
|
+
await this.taskService.trigger({
|
|
15
|
+
definition: "fileManagerFolderDelete",
|
|
16
|
+
input: {
|
|
17
|
+
caller: "fm-after-delete",
|
|
18
|
+
bucket: String(process.env.S3_BUCKET),
|
|
19
|
+
folderKey: `tenants/${tenant.id}/files/${file.id}`
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
await this.keyValueStore.delete(`FileManager/File/${file.id}/Metadata`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
const DeleteFileFromBucketHandler = FileAfterDeleteEventHandler.createImplementation({
|
|
26
|
+
implementation: DeleteFileFromBucketHandlerImpl,
|
|
27
|
+
dependencies: [
|
|
28
|
+
TenantContext,
|
|
29
|
+
TaskService,
|
|
30
|
+
GlobalKeyValueStore
|
|
31
|
+
]
|
|
32
|
+
});
|
|
33
|
+
export { DeleteFileFromBucketHandler };
|
|
34
|
+
|
|
35
|
+
//# sourceMappingURL=DeleteFileFromBucketHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/DeleteFileFromBucket/DeleteFileFromBucketHandler.js","sources":["../../../src/features/DeleteFileFromBucket/DeleteFileFromBucketHandler.ts"],"sourcesContent":["import { FileAfterDeleteEventHandler } from \"@webiny/api-file-manager/features/file/DeleteFile/events.js\";\nimport { TaskService } from \"@webiny/api-core/features/task/TaskService/index.js\";\nimport { GlobalKeyValueStore } from \"@webiny/api-core/features/keyValueStore/index.js\";\nimport type { DeleteS3FolderInput } from \"~/features/DeleteFileFromBucket/DeleteS3FolderTask.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\n\nclass DeleteFileFromBucketHandlerImpl implements FileAfterDeleteEventHandler.Interface {\n constructor(\n private tenantContext: TenantContext.Interface,\n private taskService: TaskService.Interface,\n private keyValueStore: GlobalKeyValueStore.Interface\n ) {}\n\n async handle(event: FileAfterDeleteEventHandler.Event): Promise<void> {\n const { file } = event.payload;\n const tenant = this.tenantContext.getTenant();\n\n // Delete S3 folder recursively\n await this.taskService.trigger<DeleteS3FolderInput>({\n definition: \"fileManagerFolderDelete\",\n input: {\n caller: \"fm-after-delete\",\n bucket: String(process.env.S3_BUCKET),\n folderKey: `tenants/${tenant.id}/files/${file.id}`\n }\n });\n\n // Delete file metadata\n await this.keyValueStore.delete(`FileManager/File/${file.id}/Metadata`);\n }\n}\n\nexport const DeleteFileFromBucketHandler = FileAfterDeleteEventHandler.createImplementation({\n implementation: DeleteFileFromBucketHandlerImpl,\n dependencies: [TenantContext, TaskService, GlobalKeyValueStore]\n});\n"],"names":["DeleteFileFromBucketHandlerImpl","tenantContext","taskService","keyValueStore","event","file","tenant","String","process","DeleteFileFromBucketHandler","FileAfterDeleteEventHandler","TenantContext","TaskService","GlobalKeyValueStore"],"mappings":";;;;AAMA,MAAMA;IACF,YACYC,aAAsC,EACtCC,WAAkC,EAClCC,aAA4C,CACtD;aAHUF,aAAa,GAAbA;aACAC,WAAW,GAAXA;aACAC,aAAa,GAAbA;IACT;IAEH,MAAM,OAAOC,KAAwC,EAAiB;QAClE,MAAM,EAAEC,IAAI,EAAE,GAAGD,MAAM,OAAO;QAC9B,MAAME,SAAS,IAAI,CAAC,aAAa,CAAC,SAAS;QAG3C,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAsB;YAChD,YAAY;YACZ,OAAO;gBACH,QAAQ;gBACR,QAAQC,OAAOC,QAAQ,GAAG,CAAC,SAAS;gBACpC,WAAW,CAAC,QAAQ,EAAEF,OAAO,EAAE,CAAC,OAAO,EAAED,KAAK,EAAE,EAAE;YACtD;QACJ;QAGA,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,iBAAiB,EAAEA,KAAK,EAAE,CAAC,SAAS,CAAC;IAC1E;AACJ;AAEO,MAAMI,8BAA8BC,4BAA4B,oBAAoB,CAAC;IACxF,gBAAgBV;IAChB,cAAc;QAACW;QAAeC;QAAaC;KAAoB;AACnE"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { TaskDefinition } from "@webiny/api-core/features/task/TaskDefinition/index.js";
|
|
2
|
+
export interface DeleteS3FolderInput {
|
|
3
|
+
/**
|
|
4
|
+
* Caller of the task (e.g., `fm-after-delete`).
|
|
5
|
+
*/
|
|
6
|
+
caller: string;
|
|
7
|
+
/**
|
|
8
|
+
* Cache paths to invalidate.
|
|
9
|
+
*/
|
|
10
|
+
bucket: string;
|
|
11
|
+
/**
|
|
12
|
+
* FM file directory key to delete.
|
|
13
|
+
*/
|
|
14
|
+
folderKey: string;
|
|
15
|
+
/**
|
|
16
|
+
* Continuation token for pagination.
|
|
17
|
+
*/
|
|
18
|
+
continuationToken?: string;
|
|
19
|
+
}
|
|
20
|
+
declare class DeleteS3FolderTask implements TaskDefinition.Interface<DeleteS3FolderInput> {
|
|
21
|
+
id: string;
|
|
22
|
+
title: string;
|
|
23
|
+
description: string;
|
|
24
|
+
maxIterations: number;
|
|
25
|
+
isPrivate: boolean;
|
|
26
|
+
readonly selfCleanup: ("onSuccess" | "onAbort")[];
|
|
27
|
+
run({ input, controller }: TaskDefinition.RunParams<DeleteS3FolderInput>): Promise<TaskDefinition.Result<DeleteS3FolderInput>>;
|
|
28
|
+
}
|
|
29
|
+
export declare const DeleteS3FolderTaskDefinition: typeof DeleteS3FolderTask & {
|
|
30
|
+
__abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskDefinition<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskInput, import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskOutput>>;
|
|
31
|
+
};
|
|
32
|
+
export {};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { S3 } from "@webiny/aws-sdk/client-s3/index.js";
|
|
2
|
+
import { TaskDefinition } from "@webiny/api-core/features/task/TaskDefinition/index.js";
|
|
3
|
+
class DeleteS3FolderTask {
|
|
4
|
+
async run({ input, controller }) {
|
|
5
|
+
if (controller.runtime.isAborted()) return controller.response.aborted();
|
|
6
|
+
if (!input.bucket) return controller.response.error({
|
|
7
|
+
message: "Bucket is not defined."
|
|
8
|
+
});
|
|
9
|
+
const s3 = new S3();
|
|
10
|
+
const filesList = await s3.listObjectsV2({
|
|
11
|
+
Bucket: input.bucket,
|
|
12
|
+
Prefix: `${input.folderKey}/`,
|
|
13
|
+
ContinuationToken: input.continuationToken
|
|
14
|
+
});
|
|
15
|
+
if (filesList.Contents && filesList.Contents.length > 0) {
|
|
16
|
+
const objectsToDelete = filesList.Contents.filter((file)=>file.Key).map((file)=>({
|
|
17
|
+
Key: file.Key
|
|
18
|
+
}));
|
|
19
|
+
if (objectsToDelete.length > 0) await s3.deleteObjects({
|
|
20
|
+
Bucket: input.bucket,
|
|
21
|
+
Delete: {
|
|
22
|
+
Objects: objectsToDelete
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
if (filesList.IsTruncated && filesList.NextContinuationToken) return controller.response.continue({
|
|
27
|
+
...input,
|
|
28
|
+
continuationToken: filesList.NextContinuationToken
|
|
29
|
+
});
|
|
30
|
+
return controller.response.done();
|
|
31
|
+
}
|
|
32
|
+
constructor(){
|
|
33
|
+
this.id = "fileManagerFolderDelete";
|
|
34
|
+
this.title = "Delete folder and all of its contents from the bucket.";
|
|
35
|
+
this.description = "A task to delete all files from a given folder.";
|
|
36
|
+
this.maxIterations = 5;
|
|
37
|
+
this.isPrivate = true;
|
|
38
|
+
this.selfCleanup = [
|
|
39
|
+
"onSuccess",
|
|
40
|
+
"onAbort"
|
|
41
|
+
];
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
const DeleteS3FolderTaskDefinition = TaskDefinition.createImplementation({
|
|
45
|
+
implementation: DeleteS3FolderTask,
|
|
46
|
+
dependencies: []
|
|
47
|
+
});
|
|
48
|
+
export { DeleteS3FolderTaskDefinition };
|
|
49
|
+
|
|
50
|
+
//# sourceMappingURL=DeleteS3FolderTask.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/DeleteFileFromBucket/DeleteS3FolderTask.js","sources":["../../../src/features/DeleteFileFromBucket/DeleteS3FolderTask.ts"],"sourcesContent":["import { S3 } from \"@webiny/aws-sdk/client-s3/index.js\";\nimport { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\n\nexport interface DeleteS3FolderInput {\n /**\n * Caller of the task (e.g., `fm-after-delete`).\n */\n caller: string;\n /**\n * Cache paths to invalidate.\n */\n bucket: string;\n /**\n * FM file directory key to delete.\n */\n folderKey: string;\n /**\n * Continuation token for pagination.\n */\n continuationToken?: string;\n}\n\nclass DeleteS3FolderTask implements TaskDefinition.Interface<DeleteS3FolderInput> {\n id = \"fileManagerFolderDelete\";\n title = \"Delete folder and all of its contents from the bucket.\";\n description = \"A task to delete all files from a given folder.\";\n maxIterations = 5;\n isPrivate = true;\n\n public readonly selfCleanup = [\"onSuccess\" as const, \"onAbort\" as const];\n\n public async run({\n input,\n controller\n }: TaskDefinition.RunParams<DeleteS3FolderInput>): Promise<\n TaskDefinition.Result<DeleteS3FolderInput>\n > {\n if (controller.runtime.isAborted()) {\n return controller.response.aborted();\n }\n\n if (!input.bucket) {\n return controller.response.error({ message: `Bucket is not defined.` });\n }\n\n const s3 = new S3();\n\n // List objects in the folder with pagination support.\n const filesList = await s3.listObjectsV2({\n Bucket: input.bucket,\n Prefix: `${input.folderKey}/`,\n ContinuationToken: input.continuationToken\n });\n\n // Delete all files in the folder using batch delete.\n if (filesList.Contents && filesList.Contents.length > 0) {\n const objectsToDelete = filesList.Contents.filter(file => file.Key).map(file => ({\n Key: file.Key!\n }));\n\n if (objectsToDelete.length > 0) {\n await s3.deleteObjects({\n Bucket: input.bucket,\n Delete: {\n Objects: objectsToDelete\n }\n });\n }\n }\n\n // If there are more objects to delete, continue in the next iteration.\n if (filesList.IsTruncated && filesList.NextContinuationToken) {\n return controller.response.continue({\n ...input,\n continuationToken: filesList.NextContinuationToken\n });\n }\n\n return controller.response.done();\n }\n}\n\nexport const DeleteS3FolderTaskDefinition = TaskDefinition.createImplementation({\n implementation: DeleteS3FolderTask,\n dependencies: []\n});\n"],"names":["DeleteS3FolderTask","input","controller","s3","S3","filesList","objectsToDelete","file","DeleteS3FolderTaskDefinition","TaskDefinition"],"mappings":";;AAsBA,MAAMA;IASF,MAAa,IAAI,EACbC,KAAK,EACLC,UAAU,EACkC,EAE9C;QACE,IAAIA,WAAW,OAAO,CAAC,SAAS,IAC5B,OAAOA,WAAW,QAAQ,CAAC,OAAO;QAGtC,IAAI,CAACD,MAAM,MAAM,EACb,OAAOC,WAAW,QAAQ,CAAC,KAAK,CAAC;YAAE,SAAS;QAAyB;QAGzE,MAAMC,KAAK,IAAIC;QAGf,MAAMC,YAAY,MAAMF,GAAG,aAAa,CAAC;YACrC,QAAQF,MAAM,MAAM;YACpB,QAAQ,GAAGA,MAAM,SAAS,CAAC,CAAC,CAAC;YAC7B,mBAAmBA,MAAM,iBAAiB;QAC9C;QAGA,IAAII,UAAU,QAAQ,IAAIA,UAAU,QAAQ,CAAC,MAAM,GAAG,GAAG;YACrD,MAAMC,kBAAkBD,UAAU,QAAQ,CAAC,MAAM,CAACE,CAAAA,OAAQA,KAAK,GAAG,EAAE,GAAG,CAACA,CAAAA,OAAS;oBAC7E,KAAKA,KAAK,GAAG;gBACjB;YAEA,IAAID,gBAAgB,MAAM,GAAG,GACzB,MAAMH,GAAG,aAAa,CAAC;gBACnB,QAAQF,MAAM,MAAM;gBACpB,QAAQ;oBACJ,SAASK;gBACb;YACJ;QAER;QAGA,IAAID,UAAU,WAAW,IAAIA,UAAU,qBAAqB,EACxD,OAAOH,WAAW,QAAQ,CAAC,QAAQ,CAAC;YAChC,GAAGD,KAAK;YACR,mBAAmBI,UAAU,qBAAqB;QACtD;QAGJ,OAAOH,WAAW,QAAQ,CAAC,IAAI;IACnC;;aAxDA,EAAE,GAAG;aACL,KAAK,GAAG;aACR,WAAW,GAAG;aACd,aAAa,GAAG;aAChB,SAAS,GAAG;aAEI,WAAW,GAAG;YAAC;YAAsB;SAAmB;;AAmD5E;AAEO,MAAMM,+BAA+BC,eAAe,oBAAoB,CAAC;IAC5E,gBAAgBT;IAChB,cAAc,EAAE;AACpB"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { createFeature } from "@webiny/feature/api";
|
|
2
|
+
import { DeleteFileFromBucketHandler } from "./DeleteFileFromBucketHandler.js";
|
|
3
|
+
import { DeleteS3FolderTaskDefinition } from "./DeleteS3FolderTask.js";
|
|
4
|
+
const DeleteFileFromBucketFeature = createFeature({
|
|
5
|
+
name: "FileManagerS3/DeleteFileFromBucket",
|
|
6
|
+
register (container) {
|
|
7
|
+
container.register(DeleteFileFromBucketHandler);
|
|
8
|
+
container.register(DeleteS3FolderTaskDefinition);
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
export { DeleteFileFromBucketFeature };
|
|
12
|
+
|
|
13
|
+
//# sourceMappingURL=feature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/DeleteFileFromBucket/feature.js","sources":["../../../src/features/DeleteFileFromBucket/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { DeleteFileFromBucketHandler } from \"./DeleteFileFromBucketHandler.js\";\nimport { DeleteS3FolderTaskDefinition } from \"./DeleteS3FolderTask.js\";\n\nexport const DeleteFileFromBucketFeature = createFeature({\n name: \"FileManagerS3/DeleteFileFromBucket\",\n register(container) {\n container.register(DeleteFileFromBucketHandler);\n container.register(DeleteS3FolderTaskDefinition);\n }\n});\n"],"names":["DeleteFileFromBucketFeature","createFeature","container","DeleteFileFromBucketHandler","DeleteS3FolderTaskDefinition"],"mappings":";;;AAIO,MAAMA,8BAA8BC,cAAc;IACrD,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC;QACnBD,UAAU,QAAQ,CAACE;IACvB;AACJ"}
|