@webiny/api-file-manager-s3 0.0.0-unstable.df6d94b531 → 0.0.0-unstable.df7a8bb475
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/assetDeliveryConfig.d.ts +2 -0
- package/assetDelivery/assetDeliveryConfig.js +47 -0
- package/assetDelivery/assetDeliveryConfig.js.map +1 -0
- package/assetDelivery/createAssetDelivery.d.ts +3 -0
- package/assetDelivery/createAssetDelivery.js +23 -0
- package/assetDelivery/createAssetDelivery.js.map +1 -0
- package/assetDelivery/index.d.ts +8 -0
- package/assetDelivery/index.js +10 -0
- package/assetDelivery/index.js.map +1 -0
- package/assetDelivery/s3/S3AssetResolver.d.ts +11 -0
- package/assetDelivery/s3/S3AssetResolver.js +29 -0
- package/assetDelivery/s3/S3AssetResolver.js.map +1 -0
- package/assetDelivery/s3/S3ContentsReader.d.ts +8 -0
- package/assetDelivery/s3/S3ContentsReader.js +20 -0
- package/assetDelivery/s3/S3ContentsReader.js.map +1 -0
- package/assetDelivery/s3/S3ErrorAssetReply.d.ts +4 -0
- package/assetDelivery/s3/S3ErrorAssetReply.js +13 -0
- package/assetDelivery/s3/S3ErrorAssetReply.js.map +1 -0
- package/assetDelivery/s3/S3OutputStrategy.d.ts +15 -0
- package/assetDelivery/s3/S3OutputStrategy.js +34 -0
- package/assetDelivery/s3/S3OutputStrategy.js.map +1 -0
- package/assetDelivery/s3/S3RedirectAssetReply.d.ts +4 -0
- package/assetDelivery/s3/S3RedirectAssetReply.js +16 -0
- package/assetDelivery/s3/S3RedirectAssetReply.js.map +1 -0
- package/assetDelivery/s3/S3StreamAssetReply.d.ts +5 -0
- package/assetDelivery/s3/S3StreamAssetReply.js +16 -0
- package/assetDelivery/s3/S3StreamAssetReply.js.map +1 -0
- package/assetDelivery/s3/SharpTransform.d.ts +18 -0
- package/assetDelivery/s3/SharpTransform.js +182 -0
- package/assetDelivery/s3/SharpTransform.js.map +1 -0
- package/assetDelivery/s3/transformation/AssetKeyGenerator.d.ts +8 -0
- package/assetDelivery/s3/transformation/AssetKeyGenerator.js +20 -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 +10 -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 +20 -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 +37 -0
- package/assetDelivery/s3/transformation/utils.js.map +1 -0
- package/assetDelivery/threatDetection/ObjectKey.d.ts +7 -0
- package/assetDelivery/threatDetection/ObjectKey.js +17 -0
- package/assetDelivery/threatDetection/ObjectKey.js.map +1 -0
- package/assetDelivery/threatDetection/createThreatDetectionEventHandler.d.ts +2 -0
- package/assetDelivery/threatDetection/createThreatDetectionEventHandler.js +51 -0
- package/assetDelivery/threatDetection/createThreatDetectionEventHandler.js.map +1 -0
- package/assetDelivery/threatDetection/createThreatDetectionPluginLoader.d.ts +2 -0
- package/assetDelivery/threatDetection/createThreatDetectionPluginLoader.js +6 -0
- package/assetDelivery/threatDetection/createThreatDetectionPluginLoader.js.map +1 -0
- package/assetDelivery/threatDetection/index.d.ts +2 -0
- package/assetDelivery/threatDetection/index.js +4 -0
- package/assetDelivery/threatDetection/index.js.map +1 -0
- package/assetDelivery/threatDetection/processThreatScanResult.d.ts +3 -0
- package/assetDelivery/threatDetection/processThreatScanResult.js +65 -0
- package/assetDelivery/threatDetection/processThreatScanResult.js.map +1 -0
- package/assetDelivery/threatDetection/types.d.ts +9 -0
- package/assetDelivery/threatDetection/types.js +3 -0
- package/assetDelivery/threatDetection/types.js.map +1 -0
- package/assetDelivery/types.d.ts +10 -0
- package/assetDelivery/types.js +3 -0
- package/assetDelivery/types.js.map +1 -0
- package/enterprise/ApplyThreatScanning/CreateFileWithThreatScanDecorator.d.ts +11 -0
- package/enterprise/ApplyThreatScanning/CreateFileWithThreatScanDecorator.js +19 -0
- package/enterprise/ApplyThreatScanning/CreateFileWithThreatScanDecorator.js.map +1 -0
- package/enterprise/ApplyThreatScanning/feature.d.ts +1 -0
- package/enterprise/ApplyThreatScanning/feature.js +10 -0
- package/enterprise/ApplyThreatScanning/feature.js.map +1 -0
- package/features/DeleteFileFromBucket/DeleteFileFromBucketHandler.d.ts +15 -0
- package/features/DeleteFileFromBucket/DeleteFileFromBucketHandler.js +36 -0
- package/features/DeleteFileFromBucket/DeleteFileFromBucketHandler.js.map +1 -0
- package/features/DeleteFileFromBucket/DeleteS3FolderTask.d.ts +31 -0
- package/features/DeleteFileFromBucket/DeleteS3FolderTask.js +60 -0
- package/features/DeleteFileFromBucket/DeleteS3FolderTask.js.map +1 -0
- package/features/DeleteFileFromBucket/feature.d.ts +1 -0
- package/features/DeleteFileFromBucket/feature.js +12 -0
- package/features/DeleteFileFromBucket/feature.js.map +1 -0
- package/features/ExtractMetadata/ExtractMetadataHandler.d.ts +11 -0
- package/features/ExtractMetadata/ExtractMetadataHandler.js +26 -0
- package/features/ExtractMetadata/ExtractMetadataHandler.js.map +1 -0
- package/features/ExtractMetadata/ExtractMetadataTask.d.ts +23 -0
- package/features/ExtractMetadata/ExtractMetadataTask.js +128 -0
- package/features/ExtractMetadata/ExtractMetadataTask.js.map +1 -0
- package/features/ExtractMetadata/feature.d.ts +1 -0
- package/features/ExtractMetadata/feature.js +12 -0
- package/features/ExtractMetadata/feature.js.map +1 -0
- package/features/FlushCache/FlushCacheOnFileDeleteHandler.d.ts +12 -0
- package/features/FlushCache/FlushCacheOnFileDeleteHandler.js +27 -0
- package/features/FlushCache/FlushCacheOnFileDeleteHandler.js.map +1 -0
- package/features/FlushCache/FlushCacheOnFileUpdateHandler.d.ts +12 -0
- package/features/FlushCache/FlushCacheOnFileUpdateHandler.js +35 -0
- package/features/FlushCache/FlushCacheOnFileUpdateHandler.js.map +1 -0
- package/features/FlushCache/InvalidateCacheTask.d.ts +25 -0
- package/features/FlushCache/InvalidateCacheTask.js +86 -0
- package/features/FlushCache/InvalidateCacheTask.js.map +1 -0
- package/features/FlushCache/feature.d.ts +1 -0
- package/features/FlushCache/feature.js +14 -0
- package/features/FlushCache/feature.js.map +1 -0
- package/features/WriteFileMetadata/MetadataReader.d.ts +14 -0
- package/features/WriteFileMetadata/MetadataReader.js +14 -0
- package/features/WriteFileMetadata/MetadataReader.js.map +1 -0
- package/features/WriteFileMetadata/MetadataWriter.d.ts +10 -0
- package/features/WriteFileMetadata/MetadataWriter.js +28 -0
- package/features/WriteFileMetadata/MetadataWriter.js.map +1 -0
- package/features/WriteFileMetadata/WriteMetadataAfterBatchCreateHandler.d.ts +12 -0
- package/features/WriteFileMetadata/WriteMetadataAfterBatchCreateHandler.js +21 -0
- package/features/WriteFileMetadata/WriteMetadataAfterBatchCreateHandler.js.map +1 -0
- package/features/WriteFileMetadata/WriteMetadataAfterCreateHandler.d.ts +12 -0
- package/features/WriteFileMetadata/WriteMetadataAfterCreateHandler.js +21 -0
- package/features/WriteFileMetadata/WriteMetadataAfterCreateHandler.js.map +1 -0
- package/features/WriteFileMetadata/feature.d.ts +1 -0
- package/features/WriteFileMetadata/feature.js +12 -0
- package/features/WriteFileMetadata/feature.js.map +1 -0
- package/graphql/checkPermissions.d.ts +5 -0
- package/graphql/checkPermissions.js +37 -0
- package/graphql/checkPermissions.js.map +1 -0
- package/graphql/schema.d.ts +1 -0
- package/graphql/schema.js +204 -0
- package/graphql/schema.js.map +1 -0
- package/index.d.ts +4 -2
- package/index.js +24 -10
- package/index.js.map +1 -1
- package/multiPartUpload/CompleteMultiPartUploadUseCase.d.ts +15 -0
- package/multiPartUpload/CompleteMultiPartUploadUseCase.js +58 -0
- package/multiPartUpload/CompleteMultiPartUploadUseCase.js.map +1 -0
- package/multiPartUpload/CreateMultiPartUploadUseCase.d.ts +20 -0
- package/multiPartUpload/CreateMultiPartUploadUseCase.js +41 -0
- package/multiPartUpload/CreateMultiPartUploadUseCase.js.map +1 -0
- package/package.json +25 -22
- package/types.d.ts +10 -9
- package/types.js +2 -4
- package/types.js.map +1 -1
- package/utils/CdnPathsGenerator.d.ts +3 -0
- package/utils/CdnPathsGenerator.js +7 -0
- package/utils/CdnPathsGenerator.js.map +1 -0
- package/utils/FileExtension.d.ts +6 -0
- package/utils/FileExtension.js +17 -0
- package/utils/FileExtension.js.map +1 -0
- package/utils/FileKey.d.ts +11 -0
- package/utils/FileKey.js +25 -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 +42 -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 +8 -0
- package/utils/createFileNormalizerFromContext.js.map +1 -0
- package/utils/getPresignedPostPayload.d.ts +4 -3
- package/utils/getPresignedPostPayload.js +16 -59
- package/utils/getPresignedPostPayload.js.map +1 -1
- package/utils/mimeTypes.js +10 -15
- package/utils/mimeTypes.js.map +1 -1
- package/utils/uploadFileToS3.d.ts +2 -4
- package/utils/uploadFileToS3.js +9 -20
- package/utils/uploadFileToS3.js.map +1 -1
- package/plugins/checkBasePermissions.d.ts +0 -5
- package/plugins/checkBasePermissions.js +0 -24
- package/plugins/checkBasePermissions.js.map +0 -1
- package/plugins/checkPermission.d.ts +0 -4
- package/plugins/checkPermission.js +0 -25
- package/plugins/checkPermission.js.map +0 -1
- package/plugins/fileStorageS3.d.ts +0 -3
- package/plugins/fileStorageS3.js +0 -55
- package/plugins/fileStorageS3.js.map +0 -1
- package/plugins/graphqlFileStorageS3.d.ts +0 -4
- package/plugins/graphqlFileStorageS3.js +0 -108
- package/plugins/graphqlFileStorageS3.js.map +0 -1
package/README.md
CHANGED
|
@@ -1 +1,11 @@
|
|
|
1
|
-
# @webiny/api-file-manager-s3
|
|
1
|
+
# @webiny/api-file-manager-s3
|
|
2
|
+
|
|
3
|
+
> [!NOTE]
|
|
4
|
+
> This package is part of the [Webiny](https://www.webiny.com) monorepo.
|
|
5
|
+
> It’s **included in every Webiny project by default** and is not meant to be used as a standalone package.
|
|
6
|
+
|
|
7
|
+
📘 **Documentation:** [https://www.webiny.com/docs](https://www.webiny.com/docs)
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
_This README file is automatically generated during the publish process._
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import type { AssetDeliveryParams } from "../assetDelivery/types.js";
|
|
2
|
+
export declare const assetDeliveryConfig: (params: AssetDeliveryParams) => (import("@webiny/api-file-manager").AssetDeliveryConfigModifierPlugin | (import("@webiny/api-file-manager").AssetDeliveryConfigModifierPlugin | import("@webiny/handler/index").ModifyFastifyPlugin)[])[];
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { createAssetDelivery as createBaseAssetDelivery, createAssetDeliveryConfig } from "@webiny/api-file-manager";
|
|
2
|
+
import { S3 } from "@webiny/aws-sdk/client-s3/index.js";
|
|
3
|
+
import { S3AssetResolver } from "./s3/S3AssetResolver.js";
|
|
4
|
+
import { S3OutputStrategy } from "./s3/S3OutputStrategy.js";
|
|
5
|
+
import { SharpTransform } from "./s3/SharpTransform.js";
|
|
6
|
+
import { GlobalKeyValueStore } from "@webiny/api-core/features/keyValueStore/index.js";
|
|
7
|
+
export const assetDeliveryConfig = params => {
|
|
8
|
+
const bucket = process.env.S3_BUCKET;
|
|
9
|
+
const region = process.env.AWS_REGION;
|
|
10
|
+
const {
|
|
11
|
+
// Presigned URLs last 1 hour
|
|
12
|
+
presignedUrlTtl = 3600,
|
|
13
|
+
imageResizeWidths = [128, 384, 640, 750, 828, 1080, 1200, 1920, 2048, 3840],
|
|
14
|
+
/**
|
|
15
|
+
* Even though Lambda's response payload limit is 6,291,556 bytes, we leave some room for the response envelope.
|
|
16
|
+
* We had situations where a 4.7MB file would cause the payload to go over the limit, so let's be on the safe side.
|
|
17
|
+
*/
|
|
18
|
+
assetStreamingMaxSize = 4718592
|
|
19
|
+
} = params;
|
|
20
|
+
return [
|
|
21
|
+
// Base asset delivery
|
|
22
|
+
createBaseAssetDelivery(),
|
|
23
|
+
// S3 plugins
|
|
24
|
+
createAssetDeliveryConfig(config => {
|
|
25
|
+
const s3 = new S3({
|
|
26
|
+
region
|
|
27
|
+
});
|
|
28
|
+
config.decorateAssetResolver(({
|
|
29
|
+
container
|
|
30
|
+
}) => {
|
|
31
|
+
// This resolver loads file information from the `.metadata` file.
|
|
32
|
+
return new S3AssetResolver(container.resolve(GlobalKeyValueStore), s3, bucket);
|
|
33
|
+
});
|
|
34
|
+
config.decorateAssetOutputStrategy(() => {
|
|
35
|
+
return new S3OutputStrategy(s3, bucket, presignedUrlTtl, assetStreamingMaxSize);
|
|
36
|
+
});
|
|
37
|
+
config.decorateAssetTransformationStrategy(() => {
|
|
38
|
+
return new SharpTransform({
|
|
39
|
+
s3,
|
|
40
|
+
bucket,
|
|
41
|
+
imageResizeWidths
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
})];
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
//# sourceMappingURL=assetDeliveryConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createAssetDelivery","createBaseAssetDelivery","createAssetDeliveryConfig","S3","S3AssetResolver","S3OutputStrategy","SharpTransform","GlobalKeyValueStore","assetDeliveryConfig","params","bucket","process","env","S3_BUCKET","region","AWS_REGION","presignedUrlTtl","imageResizeWidths","assetStreamingMaxSize","config","s3","decorateAssetResolver","container","resolve","decorateAssetOutputStrategy","decorateAssetTransformationStrategy"],"sources":["assetDeliveryConfig.ts"],"sourcesContent":["import {\n createAssetDelivery as createBaseAssetDelivery,\n createAssetDeliveryConfig\n} from \"@webiny/api-file-manager\";\nimport { S3 } from \"@webiny/aws-sdk/client-s3/index.js\";\nimport { S3AssetResolver } from \"~/assetDelivery/s3/S3AssetResolver.js\";\nimport { S3OutputStrategy } from \"~/assetDelivery/s3/S3OutputStrategy.js\";\nimport { SharpTransform } from \"~/assetDelivery/s3/SharpTransform.js\";\nimport type { AssetDeliveryParams } from \"~/assetDelivery/types.js\";\nimport { GlobalKeyValueStore } from \"@webiny/api-core/features/keyValueStore/index.js\";\n\nexport const assetDeliveryConfig = (params: AssetDeliveryParams) => {\n const bucket = process.env.S3_BUCKET as string;\n const region = process.env.AWS_REGION as string;\n\n const {\n // Presigned URLs last 1 hour\n presignedUrlTtl = 3600,\n imageResizeWidths = [128, 384, 640, 750, 828, 1080, 1200, 1920, 2048, 3840],\n /**\n * Even though Lambda's response payload limit is 6,291,556 bytes, we leave some room for the response envelope.\n * We had situations where a 4.7MB file would cause the payload to go over the limit, so let's be on the safe side.\n */\n assetStreamingMaxSize = 4718592\n } = params;\n\n return [\n // Base asset delivery\n createBaseAssetDelivery(),\n // S3 plugins\n createAssetDeliveryConfig(config => {\n const s3 = new S3({ region });\n\n config.decorateAssetResolver(({ container }) => {\n // This resolver loads file information from the `.metadata` file.\n return new S3AssetResolver(container.resolve(GlobalKeyValueStore), s3, bucket);\n });\n\n config.decorateAssetOutputStrategy(() => {\n return new S3OutputStrategy(s3, bucket, presignedUrlTtl, assetStreamingMaxSize);\n });\n\n config.decorateAssetTransformationStrategy(() => {\n return new SharpTransform({ s3, bucket, imageResizeWidths });\n });\n })\n ];\n};\n"],"mappings":"AAAA,SACIA,mBAAmB,IAAIC,uBAAuB,EAC9CC,yBAAyB,QACtB,0BAA0B;AACjC,SAASC,EAAE,QAAQ,oCAAoC;AACvD,SAASC,eAAe;AACxB,SAASC,gBAAgB;AACzB,SAASC,cAAc;AAEvB,SAASC,mBAAmB,QAAQ,kDAAkD;AAEtF,OAAO,MAAMC,mBAAmB,GAAIC,MAA2B,IAAK;EAChE,MAAMC,MAAM,GAAGC,OAAO,CAACC,GAAG,CAACC,SAAmB;EAC9C,MAAMC,MAAM,GAAGH,OAAO,CAACC,GAAG,CAACG,UAAoB;EAE/C,MAAM;IACF;IACAC,eAAe,GAAG,IAAI;IACtBC,iBAAiB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC3E;AACR;AACA;AACA;IACQC,qBAAqB,GAAG;EAC5B,CAAC,GAAGT,MAAM;EAEV,OAAO;EACH;EACAR,uBAAuB,CAAC,CAAC;EACzB;EACAC,yBAAyB,CAACiB,MAAM,IAAI;IAChC,MAAMC,EAAE,GAAG,IAAIjB,EAAE,CAAC;MAAEW;IAAO,CAAC,CAAC;IAE7BK,MAAM,CAACE,qBAAqB,CAAC,CAAC;MAAEC;IAAU,CAAC,KAAK;MAC5C;MACA,OAAO,IAAIlB,eAAe,CAACkB,SAAS,CAACC,OAAO,CAAChB,mBAAmB,CAAC,EAAEa,EAAE,EAAEV,MAAM,CAAC;IAClF,CAAC,CAAC;IAEFS,MAAM,CAACK,2BAA2B,CAAC,MAAM;MACrC,OAAO,IAAInB,gBAAgB,CAACe,EAAE,EAAEV,MAAM,EAAEM,eAAe,EAAEE,qBAAqB,CAAC;IACnF,CAAC,CAAC;IAEFC,MAAM,CAACM,mCAAmC,CAAC,MAAM;MAC7C,OAAO,IAAInB,cAAc,CAAC;QAAEc,EAAE;QAAEV,MAAM;QAAEO;MAAkB,CAAC,CAAC;IAChE,CAAC,CAAC;EACN,CAAC,CAAC,CACL;AACL,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { createAssetDeliveryPluginLoader } from "@webiny/api-file-manager";
|
|
2
|
+
import { createThreatDetectionPluginLoader } from "./threatDetection/index.js";
|
|
3
|
+
export const createAssetDelivery = (params = {}) => {
|
|
4
|
+
return [
|
|
5
|
+
/**
|
|
6
|
+
* We only want to load this plugin in the context of the Asset Delivery Lambda function.
|
|
7
|
+
*/
|
|
8
|
+
createAssetDeliveryPluginLoader(() => {
|
|
9
|
+
return import(/* webpackChunkName: "s3AssetDelivery" */"./assetDeliveryConfig.js").then(({
|
|
10
|
+
assetDeliveryConfig
|
|
11
|
+
}) => assetDeliveryConfig(params));
|
|
12
|
+
}),
|
|
13
|
+
/**
|
|
14
|
+
* We only want to load this plugin in the context of the Threat Detection Lambda function.
|
|
15
|
+
*/
|
|
16
|
+
createThreatDetectionPluginLoader(() => {
|
|
17
|
+
return import(/* webpackChunkName: "threatDetectionEventHandler" */"./threatDetection/createThreatDetectionEventHandler.js").then(({
|
|
18
|
+
createThreatDetectionEventHandler
|
|
19
|
+
}) => createThreatDetectionEventHandler());
|
|
20
|
+
})];
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
//# sourceMappingURL=createAssetDelivery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createAssetDeliveryPluginLoader","createThreatDetectionPluginLoader","createAssetDelivery","params","then","assetDeliveryConfig","createThreatDetectionEventHandler"],"sources":["createAssetDelivery.ts"],"sourcesContent":["import { createAssetDeliveryPluginLoader } from \"@webiny/api-file-manager\";\nimport type { PluginFactory } from \"@webiny/plugins/types.js\";\nimport { createThreatDetectionPluginLoader } from \"~/assetDelivery/threatDetection/index.js\";\nimport type { AssetDeliveryParams } from \"~/assetDelivery/types.js\";\n\nexport const createAssetDelivery = (params: AssetDeliveryParams = {}): PluginFactory[] => {\n return [\n /**\n * We only want to load this plugin in the context of the Asset Delivery Lambda function.\n */\n createAssetDeliveryPluginLoader(() => {\n return import(\n /* webpackChunkName: \"s3AssetDelivery\" */ \"./assetDeliveryConfig.js\"\n ).then(({ assetDeliveryConfig }) => assetDeliveryConfig(params));\n }),\n /**\n * We only want to load this plugin in the context of the Threat Detection Lambda function.\n */\n createThreatDetectionPluginLoader(() => {\n return import(\n /* webpackChunkName: \"threatDetectionEventHandler\" */ \"./threatDetection/createThreatDetectionEventHandler.js\"\n ).then(({ createThreatDetectionEventHandler }) => createThreatDetectionEventHandler());\n })\n ];\n};\n"],"mappings":"AAAA,SAASA,+BAA+B,QAAQ,0BAA0B;AAE1E,SAASC,iCAAiC;AAG1C,OAAO,MAAMC,mBAAmB,GAAGA,CAACC,MAA2B,GAAG,CAAC,CAAC,KAAsB;EACtF,OAAO;EACH;AACR;AACA;EACQH,+BAA+B,CAAC,MAAM;IAClC,OAAO,MAAM,CACT,mEACJ,CAAC,CAACI,IAAI,CAAC,CAAC;MAAEC;IAAoB,CAAC,KAAKA,mBAAmB,CAACF,MAAM,CAAC,CAAC;EACpE,CAAC,CAAC;EACF;AACR;AACA;EACQF,iCAAiC,CAAC,MAAM;IACpC,OAAO,MAAM,CACT,6GACJ,CAAC,CAACG,IAAI,CAAC,CAAC;MAAEE;IAAkC,CAAC,KAAKA,iCAAiC,CAAC,CAAC,CAAC;EAC1F,CAAC,CAAC,CACL;AACL,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { S3AssetResolver } from "./s3/S3AssetResolver.js";
|
|
2
|
+
export { S3OutputStrategy } from "./s3/S3OutputStrategy.js";
|
|
3
|
+
export { S3ContentsReader } from "./s3/S3ContentsReader.js";
|
|
4
|
+
export { S3ErrorAssetReply } from "./s3/S3ErrorAssetReply.js";
|
|
5
|
+
export { S3RedirectAssetReply } from "./s3/S3RedirectAssetReply.js";
|
|
6
|
+
export { S3StreamAssetReply } from "./s3/S3StreamAssetReply.js";
|
|
7
|
+
export { SharpTransform } from "./s3/SharpTransform.js";
|
|
8
|
+
export { CallableContentsReader } from "./s3/transformation/CallableContentsReader.js";
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { S3AssetResolver } from "./s3/S3AssetResolver.js";
|
|
2
|
+
export { S3OutputStrategy } from "./s3/S3OutputStrategy.js";
|
|
3
|
+
export { S3ContentsReader } from "./s3/S3ContentsReader.js";
|
|
4
|
+
export { S3ErrorAssetReply } from "./s3/S3ErrorAssetReply.js";
|
|
5
|
+
export { S3RedirectAssetReply } from "./s3/S3RedirectAssetReply.js";
|
|
6
|
+
export { S3StreamAssetReply } from "./s3/S3StreamAssetReply.js";
|
|
7
|
+
export { SharpTransform } from "./s3/SharpTransform.js";
|
|
8
|
+
export { CallableContentsReader } from "./s3/transformation/CallableContentsReader.js";
|
|
9
|
+
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["S3AssetResolver","S3OutputStrategy","S3ContentsReader","S3ErrorAssetReply","S3RedirectAssetReply","S3StreamAssetReply","SharpTransform","CallableContentsReader"],"sources":["index.ts"],"sourcesContent":["export { S3AssetResolver } from \"./s3/S3AssetResolver.js\";\nexport { S3OutputStrategy } from \"./s3/S3OutputStrategy.js\";\nexport { S3ContentsReader } from \"./s3/S3ContentsReader.js\";\nexport { S3ErrorAssetReply } from \"./s3/S3ErrorAssetReply.js\";\nexport { S3RedirectAssetReply } from \"./s3/S3RedirectAssetReply.js\";\nexport { S3StreamAssetReply } from \"./s3/S3StreamAssetReply.js\";\nexport { SharpTransform } from \"./s3/SharpTransform.js\";\nexport { CallableContentsReader } from \"./s3/transformation/CallableContentsReader.js\";\n"],"mappings":"AAAA,SAASA,eAAe;AACxB,SAASC,gBAAgB;AACzB,SAASC,gBAAgB;AACzB,SAASC,iBAAiB;AAC1B,SAASC,oBAAoB;AAC7B,SAASC,kBAAkB;AAC3B,SAASC,cAAc;AACvB,SAASC,sBAAsB","ignoreList":[]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { S3 } from "@webiny/aws-sdk/client-s3/index.js";
|
|
2
|
+
import type { AssetRequest, AssetResolver } from "@webiny/api-file-manager";
|
|
3
|
+
import { Asset } from "@webiny/api-file-manager";
|
|
4
|
+
import { GlobalKeyValueStore } from "@webiny/api-core/features/keyValueStore/index.js";
|
|
5
|
+
export declare class S3AssetResolver implements AssetResolver {
|
|
6
|
+
private keyValueStore;
|
|
7
|
+
private s3;
|
|
8
|
+
private bucket;
|
|
9
|
+
constructor(keyValueStore: GlobalKeyValueStore.Interface, s3: S3, bucket: string);
|
|
10
|
+
resolve(request: AssetRequest): Promise<Asset | undefined>;
|
|
11
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Asset } from "@webiny/api-file-manager";
|
|
2
|
+
import { S3ContentsReader } from "../index.js";
|
|
3
|
+
import { ObjectKey } from "../threatDetection/ObjectKey.js";
|
|
4
|
+
export class S3AssetResolver {
|
|
5
|
+
constructor(keyValueStore, s3, bucket) {
|
|
6
|
+
this.keyValueStore = keyValueStore;
|
|
7
|
+
this.s3 = s3;
|
|
8
|
+
this.bucket = bucket;
|
|
9
|
+
}
|
|
10
|
+
async resolve(request) {
|
|
11
|
+
const fileId = ObjectKey.from(request.getKey()).id();
|
|
12
|
+
const result = await this.keyValueStore.get(`FileManager/File/${fileId}/Metadata`);
|
|
13
|
+
if (result.isFail()) {
|
|
14
|
+
return undefined;
|
|
15
|
+
}
|
|
16
|
+
const metadata = result.value;
|
|
17
|
+
const asset = new Asset({
|
|
18
|
+
id: metadata.id,
|
|
19
|
+
tenant: metadata.tenant,
|
|
20
|
+
size: metadata.size,
|
|
21
|
+
contentType: metadata.contentType,
|
|
22
|
+
key: metadata.bucketKey
|
|
23
|
+
});
|
|
24
|
+
asset.setContentsReader(new S3ContentsReader(this.s3, this.bucket));
|
|
25
|
+
return asset;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
//# sourceMappingURL=S3AssetResolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["Asset","S3ContentsReader","ObjectKey","S3AssetResolver","constructor","keyValueStore","s3","bucket","resolve","request","fileId","from","getKey","id","result","get","isFail","undefined","metadata","value","asset","tenant","size","contentType","key","bucketKey","setContentsReader"],"sources":["S3AssetResolver.ts"],"sourcesContent":["import type { S3 } from \"@webiny/aws-sdk/client-s3/index.js\";\nimport type { AssetRequest, AssetResolver } from \"@webiny/api-file-manager\";\nimport { Asset } from \"@webiny/api-file-manager\";\nimport { GlobalKeyValueStore } from \"@webiny/api-core/features/keyValueStore/index.js\";\nimport { S3ContentsReader } from \"~/assetDelivery/index.js\";\nimport { ObjectKey } from \"~/assetDelivery/threatDetection/ObjectKey.js\";\n\ninterface AssetMetadata {\n id: string;\n tenant: string;\n size: number;\n contentType: string;\n bucketKey: string;\n}\n\nexport class S3AssetResolver implements AssetResolver {\n constructor(\n private keyValueStore: GlobalKeyValueStore.Interface,\n private s3: S3,\n private bucket: string\n ) {}\n\n async resolve(request: AssetRequest): Promise<Asset | undefined> {\n const fileId = ObjectKey.from(request.getKey()).id();\n const result = await this.keyValueStore.get<AssetMetadata>(\n `FileManager/File/${fileId}/Metadata`\n );\n\n if (result.isFail()) {\n return undefined;\n }\n\n const metadata = result.value;\n\n const asset = new Asset({\n id: metadata.id,\n tenant: metadata.tenant,\n size: metadata.size,\n contentType: metadata.contentType,\n key: metadata.bucketKey\n });\n\n asset.setContentsReader(new S3ContentsReader(this.s3, this.bucket));\n\n return asset;\n }\n}\n"],"mappings":"AAEA,SAASA,KAAK,QAAQ,0BAA0B;AAEhD,SAASC,gBAAgB;AACzB,SAASC,SAAS;AAUlB,OAAO,MAAMC,eAAe,CAA0B;EAClDC,WAAWA,CACCC,aAA4C,EAC5CC,EAAM,EACNC,MAAc,EACxB;IAAA,KAHUF,aAA4C,GAA5CA,aAA4C;IAAA,KAC5CC,EAAM,GAANA,EAAM;IAAA,KACNC,MAAc,GAAdA,MAAc;EACvB;EAEH,MAAMC,OAAOA,CAACC,OAAqB,EAA8B;IAC7D,MAAMC,MAAM,GAAGR,SAAS,CAACS,IAAI,CAACF,OAAO,CAACG,MAAM,CAAC,CAAC,CAAC,CAACC,EAAE,CAAC,CAAC;IACpD,MAAMC,MAAM,GAAG,MAAM,IAAI,CAACT,aAAa,CAACU,GAAG,CACvC,oBAAoBL,MAAM,WAC9B,CAAC;IAED,IAAII,MAAM,CAACE,MAAM,CAAC,CAAC,EAAE;MACjB,OAAOC,SAAS;IACpB;IAEA,MAAMC,QAAQ,GAAGJ,MAAM,CAACK,KAAK;IAE7B,MAAMC,KAAK,GAAG,IAAIpB,KAAK,CAAC;MACpBa,EAAE,EAAEK,QAAQ,CAACL,EAAE;MACfQ,MAAM,EAAEH,QAAQ,CAACG,MAAM;MACvBC,IAAI,EAAEJ,QAAQ,CAACI,IAAI;MACnBC,WAAW,EAAEL,QAAQ,CAACK,WAAW;MACjCC,GAAG,EAAEN,QAAQ,CAACO;IAClB,CAAC,CAAC;IAEFL,KAAK,CAACM,iBAAiB,CAAC,IAAIzB,gBAAgB,CAAC,IAAI,CAACK,EAAE,EAAE,IAAI,CAACC,MAAM,CAAC,CAAC;IAEnE,OAAOa,KAAK;EAChB;AACJ","ignoreList":[]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { S3 } from "@webiny/aws-sdk/client-s3/index.js";
|
|
2
|
+
import type { Asset, AssetContentsReader } from "@webiny/api-file-manager";
|
|
3
|
+
export declare class S3ContentsReader implements AssetContentsReader {
|
|
4
|
+
private s3;
|
|
5
|
+
private readonly bucket;
|
|
6
|
+
constructor(s3: S3, bucket: string);
|
|
7
|
+
read(asset: Asset): Promise<Buffer>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export class S3ContentsReader {
|
|
2
|
+
constructor(s3, bucket) {
|
|
3
|
+
this.s3 = s3;
|
|
4
|
+
this.bucket = bucket;
|
|
5
|
+
}
|
|
6
|
+
async read(asset) {
|
|
7
|
+
const {
|
|
8
|
+
Body
|
|
9
|
+
} = await this.s3.getObject({
|
|
10
|
+
Bucket: this.bucket,
|
|
11
|
+
Key: asset.getKey()
|
|
12
|
+
});
|
|
13
|
+
if (!Body) {
|
|
14
|
+
throw Error(`Unable to read ${asset.getKey()}!`);
|
|
15
|
+
}
|
|
16
|
+
return Buffer.from(await Body.transformToByteArray());
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
//# sourceMappingURL=S3ContentsReader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["S3ContentsReader","constructor","s3","bucket","read","asset","Body","getObject","Bucket","Key","getKey","Error","Buffer","from","transformToByteArray"],"sources":["S3ContentsReader.ts"],"sourcesContent":["import type { S3 } from \"@webiny/aws-sdk/client-s3/index.js\";\nimport type { Asset, AssetContentsReader } from \"@webiny/api-file-manager\";\n\nexport class S3ContentsReader implements AssetContentsReader {\n private s3: S3;\n private readonly bucket: string;\n\n constructor(s3: S3, bucket: string) {\n this.s3 = s3;\n this.bucket = bucket;\n }\n\n async read(asset: Asset): Promise<Buffer> {\n const { Body } = await this.s3.getObject({\n Bucket: this.bucket,\n Key: asset.getKey()\n });\n\n if (!Body) {\n throw Error(`Unable to read ${asset.getKey()}!`);\n }\n\n return Buffer.from(await Body.transformToByteArray());\n }\n}\n"],"mappings":"AAGA,OAAO,MAAMA,gBAAgB,CAAgC;EAIzDC,WAAWA,CAACC,EAAM,EAAEC,MAAc,EAAE;IAChC,IAAI,CAACD,EAAE,GAAGA,EAAE;IACZ,IAAI,CAACC,MAAM,GAAGA,MAAM;EACxB;EAEA,MAAMC,IAAIA,CAACC,KAAY,EAAmB;IACtC,MAAM;MAAEC;IAAK,CAAC,GAAG,MAAM,IAAI,CAACJ,EAAE,CAACK,SAAS,CAAC;MACrCC,MAAM,EAAE,IAAI,CAACL,MAAM;MACnBM,GAAG,EAAEJ,KAAK,CAACK,MAAM,CAAC;IACtB,CAAC,CAAC;IAEF,IAAI,CAACJ,IAAI,EAAE;MACP,MAAMK,KAAK,CAAC,kBAAkBN,KAAK,CAACK,MAAM,CAAC,CAAC,GAAG,CAAC;IACpD;IAEA,OAAOE,MAAM,CAACC,IAAI,CAAC,MAAMP,IAAI,CAACQ,oBAAoB,CAAC,CAAC,CAAC;EACzD;AACJ","ignoreList":[]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { AssetReply } from "@webiny/api-file-manager";
|
|
2
|
+
export class S3ErrorAssetReply extends AssetReply {
|
|
3
|
+
constructor(message) {
|
|
4
|
+
super({
|
|
5
|
+
code: 400,
|
|
6
|
+
body: () => ({
|
|
7
|
+
error: message
|
|
8
|
+
})
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
//# sourceMappingURL=S3ErrorAssetReply.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["AssetReply","S3ErrorAssetReply","constructor","message","code","body","error"],"sources":["S3ErrorAssetReply.ts"],"sourcesContent":["import { AssetReply } from \"@webiny/api-file-manager\";\n\nexport class S3ErrorAssetReply extends AssetReply {\n constructor(message: string) {\n super({\n code: 400,\n body: () => ({ error: message })\n });\n }\n}\n"],"mappings":"AAAA,SAASA,UAAU,QAAQ,0BAA0B;AAErD,OAAO,MAAMC,iBAAiB,SAASD,UAAU,CAAC;EAC9CE,WAAWA,CAACC,OAAe,EAAE;IACzB,KAAK,CAAC;MACFC,IAAI,EAAE,GAAG;MACTC,IAAI,EAAEA,CAAA,MAAO;QAAEC,KAAK,EAAEH;MAAQ,CAAC;IACnC,CAAC,CAAC;EACN;AACJ","ignoreList":[]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Asset, AssetOutputStrategy, AssetReply } from "@webiny/api-file-manager";
|
|
2
|
+
import type { S3 } from "@webiny/aws-sdk/client-s3/index.js";
|
|
3
|
+
/**
|
|
4
|
+
* This strategy outputs an asset taking into account the size of the asset contents.
|
|
5
|
+
* If the asset is larger than 5MB, a presigned URL will be generated, and a redirect will happen.
|
|
6
|
+
*/
|
|
7
|
+
export declare class S3OutputStrategy implements AssetOutputStrategy {
|
|
8
|
+
private readonly s3;
|
|
9
|
+
private readonly bucket;
|
|
10
|
+
private readonly presignedUrlTtl;
|
|
11
|
+
private readonly assetStreamingMaxSize;
|
|
12
|
+
constructor(s3: S3, bucket: string, presignedUrlTtl: number, assetStreamingMaxSize: number);
|
|
13
|
+
output(asset: Asset): Promise<AssetReply>;
|
|
14
|
+
protected getPresignedUrl(asset: Asset): Promise<string>;
|
|
15
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { GetObjectCommand, getSignedUrl } from "@webiny/aws-sdk/client-s3/index.js";
|
|
2
|
+
import { S3RedirectAssetReply } from "./S3RedirectAssetReply.js";
|
|
3
|
+
import { S3StreamAssetReply } from "./S3StreamAssetReply.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* This strategy outputs an asset taking into account the size of the asset contents.
|
|
7
|
+
* If the asset is larger than 5MB, a presigned URL will be generated, and a redirect will happen.
|
|
8
|
+
*/
|
|
9
|
+
export class S3OutputStrategy {
|
|
10
|
+
constructor(s3, bucket, presignedUrlTtl, assetStreamingMaxSize) {
|
|
11
|
+
this.assetStreamingMaxSize = assetStreamingMaxSize;
|
|
12
|
+
this.presignedUrlTtl = presignedUrlTtl;
|
|
13
|
+
this.s3 = s3;
|
|
14
|
+
this.bucket = bucket;
|
|
15
|
+
}
|
|
16
|
+
async output(asset) {
|
|
17
|
+
if (asset.getSize() > this.assetStreamingMaxSize) {
|
|
18
|
+
console.log(`Asset size is greater than ${this.assetStreamingMaxSize}; redirecting to a presigned S3 URL.`);
|
|
19
|
+
return new S3RedirectAssetReply(await this.getPresignedUrl(asset), this.presignedUrlTtl);
|
|
20
|
+
}
|
|
21
|
+
console.log(`Asset size is smaller than ${this.assetStreamingMaxSize}; streaming directly from Lambda function.`);
|
|
22
|
+
return new S3StreamAssetReply(asset);
|
|
23
|
+
}
|
|
24
|
+
getPresignedUrl(asset) {
|
|
25
|
+
return getSignedUrl(this.s3, new GetObjectCommand({
|
|
26
|
+
Bucket: this.bucket,
|
|
27
|
+
Key: asset.getKey()
|
|
28
|
+
}), {
|
|
29
|
+
expiresIn: this.presignedUrlTtl
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
//# sourceMappingURL=S3OutputStrategy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["GetObjectCommand","getSignedUrl","S3RedirectAssetReply","S3StreamAssetReply","S3OutputStrategy","constructor","s3","bucket","presignedUrlTtl","assetStreamingMaxSize","output","asset","getSize","console","log","getPresignedUrl","Bucket","Key","getKey","expiresIn"],"sources":["S3OutputStrategy.ts"],"sourcesContent":["import type { Asset, AssetOutputStrategy, AssetReply } from \"@webiny/api-file-manager\";\nimport type { S3 } from \"@webiny/aws-sdk/client-s3/index.js\";\nimport { GetObjectCommand, getSignedUrl } from \"@webiny/aws-sdk/client-s3/index.js\";\nimport { S3RedirectAssetReply } from \"~/assetDelivery/s3/S3RedirectAssetReply.js\";\nimport { S3StreamAssetReply } from \"~/assetDelivery/s3/S3StreamAssetReply.js\";\n\n/**\n * This strategy outputs an asset taking into account the size of the asset contents.\n * If the asset is larger than 5MB, a presigned URL will be generated, and a redirect will happen.\n */\nexport class S3OutputStrategy implements AssetOutputStrategy {\n private readonly s3: S3;\n private readonly bucket: string;\n private readonly presignedUrlTtl: number;\n private readonly assetStreamingMaxSize: number;\n\n constructor(s3: S3, bucket: string, presignedUrlTtl: number, assetStreamingMaxSize: number) {\n this.assetStreamingMaxSize = assetStreamingMaxSize;\n this.presignedUrlTtl = presignedUrlTtl;\n this.s3 = s3;\n this.bucket = bucket;\n }\n\n async output(asset: Asset): Promise<AssetReply> {\n if (asset.getSize() > this.assetStreamingMaxSize) {\n console.log(\n `Asset size is greater than ${this.assetStreamingMaxSize}; redirecting to a presigned S3 URL.`\n );\n\n return new S3RedirectAssetReply(\n await this.getPresignedUrl(asset),\n this.presignedUrlTtl\n );\n }\n\n console.log(\n `Asset size is smaller than ${this.assetStreamingMaxSize}; streaming directly from Lambda function.`\n );\n return new S3StreamAssetReply(asset);\n }\n\n protected getPresignedUrl(asset: Asset) {\n return getSignedUrl(\n this.s3,\n new GetObjectCommand({\n Bucket: this.bucket,\n Key: asset.getKey()\n }),\n { expiresIn: this.presignedUrlTtl }\n );\n }\n}\n"],"mappings":"AAEA,SAASA,gBAAgB,EAAEC,YAAY,QAAQ,oCAAoC;AACnF,SAASC,oBAAoB;AAC7B,SAASC,kBAAkB;;AAE3B;AACA;AACA;AACA;AACA,OAAO,MAAMC,gBAAgB,CAAgC;EAMzDC,WAAWA,CAACC,EAAM,EAAEC,MAAc,EAAEC,eAAuB,EAAEC,qBAA6B,EAAE;IACxF,IAAI,CAACA,qBAAqB,GAAGA,qBAAqB;IAClD,IAAI,CAACD,eAAe,GAAGA,eAAe;IACtC,IAAI,CAACF,EAAE,GAAGA,EAAE;IACZ,IAAI,CAACC,MAAM,GAAGA,MAAM;EACxB;EAEA,MAAMG,MAAMA,CAACC,KAAY,EAAuB;IAC5C,IAAIA,KAAK,CAACC,OAAO,CAAC,CAAC,GAAG,IAAI,CAACH,qBAAqB,EAAE;MAC9CI,OAAO,CAACC,GAAG,CACP,8BAA8B,IAAI,CAACL,qBAAqB,sCAC5D,CAAC;MAED,OAAO,IAAIP,oBAAoB,CAC3B,MAAM,IAAI,CAACa,eAAe,CAACJ,KAAK,CAAC,EACjC,IAAI,CAACH,eACT,CAAC;IACL;IAEAK,OAAO,CAACC,GAAG,CACP,8BAA8B,IAAI,CAACL,qBAAqB,4CAC5D,CAAC;IACD,OAAO,IAAIN,kBAAkB,CAACQ,KAAK,CAAC;EACxC;EAEUI,eAAeA,CAACJ,KAAY,EAAE;IACpC,OAAOV,YAAY,CACf,IAAI,CAACK,EAAE,EACP,IAAIN,gBAAgB,CAAC;MACjBgB,MAAM,EAAE,IAAI,CAACT,MAAM;MACnBU,GAAG,EAAEN,KAAK,CAACO,MAAM,CAAC;IACtB,CAAC,CAAC,EACF;MAAEC,SAAS,EAAE,IAAI,CAACX;IAAgB,CACtC,CAAC;EACL;AACJ","ignoreList":[]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { AssetReply } from "@webiny/api-file-manager";
|
|
2
|
+
import { ResponseHeaders } from "@webiny/handler";
|
|
3
|
+
export class S3RedirectAssetReply extends AssetReply {
|
|
4
|
+
constructor(url, cacheDuration) {
|
|
5
|
+
super({
|
|
6
|
+
code: 301,
|
|
7
|
+
headers: ResponseHeaders.create({
|
|
8
|
+
location: url,
|
|
9
|
+
"cache-control": "public, max-age=" + cacheDuration
|
|
10
|
+
}),
|
|
11
|
+
body: () => ""
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
//# sourceMappingURL=S3RedirectAssetReply.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["AssetReply","ResponseHeaders","S3RedirectAssetReply","constructor","url","cacheDuration","code","headers","create","location","body"],"sources":["S3RedirectAssetReply.ts"],"sourcesContent":["import { AssetReply } from \"@webiny/api-file-manager\";\nimport { ResponseHeaders } from \"@webiny/handler\";\n\nexport class S3RedirectAssetReply extends AssetReply {\n constructor(url: string, cacheDuration: number) {\n super({\n code: 301,\n headers: ResponseHeaders.create({\n location: url,\n \"cache-control\": \"public, max-age=\" + cacheDuration\n }),\n body: () => \"\"\n });\n }\n}\n"],"mappings":"AAAA,SAASA,UAAU,QAAQ,0BAA0B;AACrD,SAASC,eAAe,QAAQ,iBAAiB;AAEjD,OAAO,MAAMC,oBAAoB,SAASF,UAAU,CAAC;EACjDG,WAAWA,CAACC,GAAW,EAAEC,aAAqB,EAAE;IAC5C,KAAK,CAAC;MACFC,IAAI,EAAE,GAAG;MACTC,OAAO,EAAEN,eAAe,CAACO,MAAM,CAAC;QAC5BC,QAAQ,EAAEL,GAAG;QACb,eAAe,EAAE,kBAAkB,GAAGC;MAC1C,CAAC,CAAC;MACFK,IAAI,EAAEA,CAAA,KAAM;IAChB,CAAC,CAAC;EACN;AACJ","ignoreList":[]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { AssetReply } from "@webiny/api-file-manager";
|
|
2
|
+
import { ResponseHeaders } from "@webiny/handler";
|
|
3
|
+
export class S3StreamAssetReply extends AssetReply {
|
|
4
|
+
constructor(asset) {
|
|
5
|
+
super({
|
|
6
|
+
code: 200,
|
|
7
|
+
headers: ResponseHeaders.create({
|
|
8
|
+
"cache-control": `public, max-age=${86400 * 365}`,
|
|
9
|
+
"content-type": asset.getContentType()
|
|
10
|
+
}),
|
|
11
|
+
body: () => asset.getContents()
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
//# sourceMappingURL=S3StreamAssetReply.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["AssetReply","ResponseHeaders","S3StreamAssetReply","constructor","asset","code","headers","create","getContentType","body","getContents"],"sources":["S3StreamAssetReply.ts"],"sourcesContent":["import type { Asset } from \"@webiny/api-file-manager\";\nimport { AssetReply } from \"@webiny/api-file-manager\";\nimport { ResponseHeaders } from \"@webiny/handler\";\n\nexport class S3StreamAssetReply extends AssetReply {\n constructor(asset: Asset) {\n super({\n code: 200,\n headers: ResponseHeaders.create({\n \"cache-control\": `public, max-age=${86400 * 365}`,\n \"content-type\": asset.getContentType()\n }),\n body: () => asset.getContents()\n });\n }\n}\n"],"mappings":"AACA,SAASA,UAAU,QAAQ,0BAA0B;AACrD,SAASC,eAAe,QAAQ,iBAAiB;AAEjD,OAAO,MAAMC,kBAAkB,SAASF,UAAU,CAAC;EAC/CG,WAAWA,CAACC,KAAY,EAAE;IACtB,KAAK,CAAC;MACFC,IAAI,EAAE,GAAG;MACTC,OAAO,EAAEL,eAAe,CAACM,MAAM,CAAC;QAC5B,eAAe,EAAE,mBAAmB,KAAK,GAAG,GAAG,EAAE;QACjD,cAAc,EAAEH,KAAK,CAACI,cAAc,CAAC;MACzC,CAAC,CAAC;MACFC,IAAI,EAAEA,CAAA,KAAML,KAAK,CAACM,WAAW,CAAC;IAClC,CAAC,CAAC;EACN;AACJ","ignoreList":[]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { S3 } from "@webiny/aws-sdk/client-s3/index.js";
|
|
2
|
+
import type { Asset, AssetRequest, AssetTransformationStrategy } from "@webiny/api-file-manager";
|
|
3
|
+
interface SharpTransformationParams {
|
|
4
|
+
s3: S3;
|
|
5
|
+
bucket: string;
|
|
6
|
+
imageResizeWidths: number[];
|
|
7
|
+
}
|
|
8
|
+
export declare class SharpTransform implements AssetTransformationStrategy {
|
|
9
|
+
private readonly params;
|
|
10
|
+
constructor(params: SharpTransformationParams);
|
|
11
|
+
transform(assetRequest: AssetRequest, asset: Asset): Promise<Asset>;
|
|
12
|
+
private transformAsset;
|
|
13
|
+
private optimizeAsset;
|
|
14
|
+
private isAssetAnimated;
|
|
15
|
+
private optimizePng;
|
|
16
|
+
private optimizeJpeg;
|
|
17
|
+
}
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import sharp from "sharp";
|
|
2
|
+
import { WidthCollection } from "./transformation/WidthCollection.js";
|
|
3
|
+
import * as utils from "./transformation/utils.js";
|
|
4
|
+
import { CallableContentsReader } from "./transformation/CallableContentsReader.js";
|
|
5
|
+
import { AssetKeyGenerator } from "./transformation/AssetKeyGenerator.js";
|
|
6
|
+
export class SharpTransform {
|
|
7
|
+
constructor(params) {
|
|
8
|
+
this.params = params;
|
|
9
|
+
}
|
|
10
|
+
async transform(assetRequest, asset) {
|
|
11
|
+
if (!utils.SUPPORTED_TRANSFORMABLE_IMAGES.includes(asset.getExtension())) {
|
|
12
|
+
console.log(`Transformations/optimizations of ${asset.getContentType()} assets are not supported. Skipping.`);
|
|
13
|
+
return asset;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// `original` is part of the request, but it won't even get to this point in the execution.
|
|
17
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
18
|
+
const {
|
|
19
|
+
original,
|
|
20
|
+
...options
|
|
21
|
+
} = assetRequest.getOptions();
|
|
22
|
+
const transformedAsset = asset.clone();
|
|
23
|
+
if (Object.keys(options).length > 0) {
|
|
24
|
+
// Transformations were requested.
|
|
25
|
+
return this.transformAsset(transformedAsset, options);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Return an optimized asset.
|
|
29
|
+
return this.optimizeAsset(transformedAsset);
|
|
30
|
+
}
|
|
31
|
+
async transformAsset(asset, options) {
|
|
32
|
+
if (options.width) {
|
|
33
|
+
const {
|
|
34
|
+
s3,
|
|
35
|
+
bucket
|
|
36
|
+
} = this.params;
|
|
37
|
+
const assetKey = new AssetKeyGenerator(asset);
|
|
38
|
+
const transformedAssetKey = assetKey.getTransformedImageKey(options);
|
|
39
|
+
try {
|
|
40
|
+
const {
|
|
41
|
+
Body
|
|
42
|
+
} = await s3.getObject({
|
|
43
|
+
Bucket: bucket,
|
|
44
|
+
Key: transformedAssetKey
|
|
45
|
+
});
|
|
46
|
+
if (!Body) {
|
|
47
|
+
throw new Error(`Missing image body!`);
|
|
48
|
+
}
|
|
49
|
+
const buffer = Buffer.from(await Body.transformToByteArray());
|
|
50
|
+
const newAsset = asset.withProps({
|
|
51
|
+
size: buffer.length
|
|
52
|
+
});
|
|
53
|
+
newAsset.setContentsReader(new CallableContentsReader(() => buffer));
|
|
54
|
+
console.log(`Return a previously transformed asset`, {
|
|
55
|
+
key: transformedAssetKey,
|
|
56
|
+
size: newAsset.getSize()
|
|
57
|
+
});
|
|
58
|
+
return newAsset;
|
|
59
|
+
} catch {
|
|
60
|
+
const optimizedImage = await this.optimizeAsset(asset);
|
|
61
|
+
const widths = new WidthCollection(this.params.imageResizeWidths);
|
|
62
|
+
const width = widths.getClosestOrMax(options.width);
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* `width` is the only transformation we currently support.
|
|
66
|
+
*/
|
|
67
|
+
console.log(`Resize the asset (width: ${width})`);
|
|
68
|
+
const buffer = await optimizedImage.getContents();
|
|
69
|
+
const transformedBuffer = await sharp(buffer, {
|
|
70
|
+
animated: this.isAssetAnimated(asset)
|
|
71
|
+
}).withMetadata().resize({
|
|
72
|
+
width,
|
|
73
|
+
withoutEnlargement: true
|
|
74
|
+
}).toBuffer();
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Transformations are applied to the optimized image.
|
|
78
|
+
*/
|
|
79
|
+
const newAsset = asset.withProps({
|
|
80
|
+
size: transformedBuffer.length
|
|
81
|
+
});
|
|
82
|
+
newAsset.setContentsReader(new CallableContentsReader(() => transformedBuffer));
|
|
83
|
+
await s3.putObject({
|
|
84
|
+
Bucket: bucket,
|
|
85
|
+
Key: transformedAssetKey,
|
|
86
|
+
ContentType: newAsset.getContentType(),
|
|
87
|
+
Body: await newAsset.getContents()
|
|
88
|
+
});
|
|
89
|
+
console.log(`Return the resized asset`, {
|
|
90
|
+
key: transformedAssetKey,
|
|
91
|
+
size: newAsset.getSize()
|
|
92
|
+
});
|
|
93
|
+
return newAsset;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return asset;
|
|
97
|
+
}
|
|
98
|
+
async optimizeAsset(asset) {
|
|
99
|
+
const {
|
|
100
|
+
s3,
|
|
101
|
+
bucket
|
|
102
|
+
} = this.params;
|
|
103
|
+
console.log("Optimize asset", {
|
|
104
|
+
id: asset.getId(),
|
|
105
|
+
key: asset.getKey(),
|
|
106
|
+
size: asset.getSize(),
|
|
107
|
+
type: asset.getContentType()
|
|
108
|
+
});
|
|
109
|
+
const assetKey = new AssetKeyGenerator(asset);
|
|
110
|
+
const optimizedAssetKey = assetKey.getOptimizedImageKey();
|
|
111
|
+
try {
|
|
112
|
+
const {
|
|
113
|
+
Body
|
|
114
|
+
} = await s3.getObject({
|
|
115
|
+
Bucket: bucket,
|
|
116
|
+
Key: optimizedAssetKey
|
|
117
|
+
});
|
|
118
|
+
if (!Body) {
|
|
119
|
+
throw new Error(`Missing image body!`);
|
|
120
|
+
}
|
|
121
|
+
console.log("Return a previously optimized asset", optimizedAssetKey);
|
|
122
|
+
const buffer = Buffer.from(await Body.transformToByteArray());
|
|
123
|
+
const newAsset = asset.withProps({
|
|
124
|
+
size: buffer.length
|
|
125
|
+
});
|
|
126
|
+
newAsset.setContentsReader(new CallableContentsReader(() => buffer));
|
|
127
|
+
return newAsset;
|
|
128
|
+
} catch {
|
|
129
|
+
console.log("Create an optimized version of the original asset", asset.getKey());
|
|
130
|
+
// If not found, create an optimized version of the original asset.
|
|
131
|
+
const buffer = await asset.getContents();
|
|
132
|
+
const optimizationMap = {
|
|
133
|
+
"image/png": buffer => this.optimizePng(buffer),
|
|
134
|
+
"image/jpeg": buffer => this.optimizeJpeg(buffer),
|
|
135
|
+
"image/jpg": buffer => this.optimizeJpeg(buffer)
|
|
136
|
+
};
|
|
137
|
+
const optimization = optimizationMap[asset.getContentType()];
|
|
138
|
+
if (!optimization) {
|
|
139
|
+
console.log(`No optimizations defined for ${asset.getContentType()}`);
|
|
140
|
+
return asset;
|
|
141
|
+
}
|
|
142
|
+
const optimizedBuffer = await optimization(buffer).toBuffer();
|
|
143
|
+
console.log("Optimized asset size", optimizedBuffer.length);
|
|
144
|
+
const newAsset = asset.withProps({
|
|
145
|
+
size: optimizedBuffer.length
|
|
146
|
+
});
|
|
147
|
+
newAsset.setContentsReader(new CallableContentsReader(() => optimizedBuffer));
|
|
148
|
+
await s3.putObject({
|
|
149
|
+
Bucket: bucket,
|
|
150
|
+
Key: optimizedAssetKey,
|
|
151
|
+
ContentType: newAsset.getContentType(),
|
|
152
|
+
Body: await newAsset.getContents()
|
|
153
|
+
});
|
|
154
|
+
return newAsset;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
isAssetAnimated(asset) {
|
|
158
|
+
return ["gif", "webp"].includes(asset.getExtension());
|
|
159
|
+
}
|
|
160
|
+
optimizePng(buffer) {
|
|
161
|
+
return sharp(buffer).resize({
|
|
162
|
+
width: 2560,
|
|
163
|
+
withoutEnlargement: true,
|
|
164
|
+
fit: "inside"
|
|
165
|
+
}).png({
|
|
166
|
+
compressionLevel: 9,
|
|
167
|
+
adaptiveFiltering: true,
|
|
168
|
+
force: true
|
|
169
|
+
}).withMetadata();
|
|
170
|
+
}
|
|
171
|
+
optimizeJpeg(buffer) {
|
|
172
|
+
return sharp(buffer).resize({
|
|
173
|
+
width: 2560,
|
|
174
|
+
withoutEnlargement: true,
|
|
175
|
+
fit: "inside"
|
|
176
|
+
}).withMetadata().toFormat("jpeg", {
|
|
177
|
+
quality: 90
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
//# sourceMappingURL=SharpTransform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["sharp","WidthCollection","utils","CallableContentsReader","AssetKeyGenerator","SharpTransform","constructor","params","transform","assetRequest","asset","SUPPORTED_TRANSFORMABLE_IMAGES","includes","getExtension","console","log","getContentType","original","options","getOptions","transformedAsset","clone","Object","keys","length","transformAsset","optimizeAsset","width","s3","bucket","assetKey","transformedAssetKey","getTransformedImageKey","Body","getObject","Bucket","Key","Error","buffer","Buffer","from","transformToByteArray","newAsset","withProps","size","setContentsReader","key","getSize","optimizedImage","widths","imageResizeWidths","getClosestOrMax","getContents","transformedBuffer","animated","isAssetAnimated","withMetadata","resize","withoutEnlargement","toBuffer","putObject","ContentType","id","getId","getKey","type","optimizedAssetKey","getOptimizedImageKey","optimizationMap","optimizePng","optimizeJpeg","optimization","optimizedBuffer","fit","png","compressionLevel","adaptiveFiltering","force","toFormat","quality"],"sources":["SharpTransform.ts"],"sourcesContent":["import sharp from \"sharp\";\nimport type { S3 } from \"@webiny/aws-sdk/client-s3/index.js\";\nimport type {\n Asset,\n AssetRequest,\n AssetRequestOptions,\n AssetTransformationStrategy\n} from \"@webiny/api-file-manager\";\nimport { WidthCollection } from \"./transformation/WidthCollection.js\";\nimport * as utils from \"./transformation/utils.js\";\nimport { CallableContentsReader } from \"./transformation/CallableContentsReader.js\";\nimport { AssetKeyGenerator } from \"./transformation/AssetKeyGenerator.js\";\n\ninterface SharpTransformationParams {\n s3: S3;\n bucket: string;\n imageResizeWidths: number[];\n}\n\nexport class SharpTransform implements AssetTransformationStrategy {\n private readonly params: SharpTransformationParams;\n\n constructor(params: SharpTransformationParams) {\n this.params = params;\n }\n\n async transform(assetRequest: AssetRequest, asset: Asset): Promise<Asset> {\n if (!utils.SUPPORTED_TRANSFORMABLE_IMAGES.includes(asset.getExtension())) {\n console.log(\n `Transformations/optimizations of ${asset.getContentType()} assets are not supported. Skipping.`\n );\n return asset;\n }\n\n // `original` is part of the request, but it won't even get to this point in the execution.\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { original, ...options } = assetRequest.getOptions();\n\n const transformedAsset = asset.clone();\n\n if (Object.keys(options).length > 0) {\n // Transformations were requested.\n return this.transformAsset(transformedAsset, options);\n }\n\n // Return an optimized asset.\n return this.optimizeAsset(transformedAsset);\n }\n\n private async transformAsset(asset: Asset, options: Omit<AssetRequestOptions, \"original\">) {\n if (options.width) {\n const { s3, bucket } = this.params;\n\n const assetKey = new AssetKeyGenerator(asset);\n const transformedAssetKey = assetKey.getTransformedImageKey(options);\n\n try {\n const { Body } = await s3.getObject({\n Bucket: bucket,\n Key: transformedAssetKey\n });\n\n if (!Body) {\n throw new Error(`Missing image body!`);\n }\n\n const buffer = Buffer.from(await Body.transformToByteArray());\n\n const newAsset = asset.withProps({ size: buffer.length });\n newAsset.setContentsReader(new CallableContentsReader(() => buffer));\n\n console.log(`Return a previously transformed asset`, {\n key: transformedAssetKey,\n size: newAsset.getSize()\n });\n\n return newAsset;\n } catch {\n const optimizedImage = await this.optimizeAsset(asset);\n\n const widths = new WidthCollection(this.params.imageResizeWidths);\n const width = widths.getClosestOrMax(options.width);\n\n /**\n * `width` is the only transformation we currently support.\n */\n console.log(`Resize the asset (width: ${width})`);\n const buffer = await optimizedImage.getContents();\n const transformedBuffer = await sharp(buffer, {\n animated: this.isAssetAnimated(asset)\n })\n .withMetadata()\n .resize({ width, withoutEnlargement: true })\n .toBuffer();\n\n /**\n * Transformations are applied to the optimized image.\n */\n const newAsset = asset.withProps({ size: transformedBuffer.length });\n newAsset.setContentsReader(new CallableContentsReader(() => transformedBuffer));\n\n await s3.putObject({\n Bucket: bucket,\n Key: transformedAssetKey,\n ContentType: newAsset.getContentType(),\n Body: await newAsset.getContents()\n });\n\n console.log(`Return the resized asset`, {\n key: transformedAssetKey,\n size: newAsset.getSize()\n });\n\n return newAsset;\n }\n }\n\n return asset;\n }\n\n private async optimizeAsset(asset: Asset) {\n const { s3, bucket } = this.params;\n\n console.log(\"Optimize asset\", {\n id: asset.getId(),\n key: asset.getKey(),\n size: asset.getSize(),\n type: asset.getContentType()\n });\n\n const assetKey = new AssetKeyGenerator(asset);\n const optimizedAssetKey = assetKey.getOptimizedImageKey();\n\n try {\n const { Body } = await s3.getObject({\n Bucket: bucket,\n Key: optimizedAssetKey\n });\n\n if (!Body) {\n throw new Error(`Missing image body!`);\n }\n\n console.log(\"Return a previously optimized asset\", optimizedAssetKey);\n\n const buffer = Buffer.from(await Body.transformToByteArray());\n\n const newAsset = asset.withProps({ size: buffer.length });\n newAsset.setContentsReader(new CallableContentsReader(() => buffer));\n\n return newAsset;\n } catch {\n console.log(\"Create an optimized version of the original asset\", asset.getKey());\n // If not found, create an optimized version of the original asset.\n const buffer = await asset.getContents();\n\n const optimizationMap: Record<string, ((buffer: Buffer) => sharp.Sharp) | undefined> = {\n \"image/png\": (buffer: Buffer) => this.optimizePng(buffer),\n \"image/jpeg\": (buffer: Buffer) => this.optimizeJpeg(buffer),\n \"image/jpg\": (buffer: Buffer) => this.optimizeJpeg(buffer)\n };\n\n const optimization = optimizationMap[asset.getContentType()];\n\n if (!optimization) {\n console.log(`No optimizations defined for ${asset.getContentType()}`);\n return asset;\n }\n\n const optimizedBuffer = await optimization(buffer).toBuffer();\n\n console.log(\"Optimized asset size\", optimizedBuffer.length);\n\n const newAsset = asset.withProps({ size: optimizedBuffer.length });\n newAsset.setContentsReader(new CallableContentsReader(() => optimizedBuffer));\n\n await s3.putObject({\n Bucket: bucket,\n Key: optimizedAssetKey,\n ContentType: newAsset.getContentType(),\n Body: await newAsset.getContents()\n });\n\n return newAsset;\n }\n }\n\n private isAssetAnimated(asset: Asset) {\n return [\"gif\", \"webp\"].includes(asset.getExtension());\n }\n\n private optimizePng(buffer: Buffer) {\n return sharp(buffer)\n .resize({ width: 2560, withoutEnlargement: true, fit: \"inside\" })\n .png({ compressionLevel: 9, adaptiveFiltering: true, force: true })\n .withMetadata();\n }\n\n private optimizeJpeg(buffer: Buffer) {\n return sharp(buffer)\n .resize({ width: 2560, withoutEnlargement: true, fit: \"inside\" })\n .withMetadata()\n .toFormat(\"jpeg\", { quality: 90 });\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -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
|
+
}
|