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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. package/FileManagerS3Feature.d.ts +9 -0
  2. package/FileManagerS3Feature.js +27 -0
  3. package/FileManagerS3Feature.js.map +1 -0
  4. package/assetDelivery/abstractions.d.ts +11 -0
  5. package/assetDelivery/abstractions.js +7 -0
  6. package/assetDelivery/abstractions.js.map +1 -0
  7. package/assetDelivery/assetDeliveryConfig.d.ts +1 -1
  8. package/assetDelivery/assetDeliveryConfig.js +10 -44
  9. package/assetDelivery/assetDeliveryConfig.js.map +1 -1
  10. package/assetDelivery/createAssetDelivery.js +5 -19
  11. package/assetDelivery/createAssetDelivery.js.map +1 -1
  12. package/assetDelivery/feature.d.ts +5 -0
  13. package/assetDelivery/feature.js +36 -0
  14. package/assetDelivery/feature.js.map +1 -0
  15. package/assetDelivery/index.js +0 -2
  16. package/assetDelivery/s3/LazySharpTransform.d.ts +34 -0
  17. package/assetDelivery/s3/LazySharpTransform.js +34 -0
  18. package/assetDelivery/s3/LazySharpTransform.js.map +1 -0
  19. package/assetDelivery/s3/S3AssetResolver.d.ts +3 -0
  20. package/assetDelivery/s3/S3AssetResolver.js +32 -22
  21. package/assetDelivery/s3/S3AssetResolver.js.map +1 -1
  22. package/assetDelivery/s3/S3ContentsReader.js +13 -16
  23. package/assetDelivery/s3/S3ContentsReader.js.map +1 -1
  24. package/assetDelivery/s3/S3ErrorAssetReply.js +10 -9
  25. package/assetDelivery/s3/S3ErrorAssetReply.js.map +1 -1
  26. package/assetDelivery/s3/S3OutputStrategy.d.ts +5 -5
  27. package/assetDelivery/s3/S3OutputStrategy.js +33 -27
  28. package/assetDelivery/s3/S3OutputStrategy.js.map +1 -1
  29. package/assetDelivery/s3/S3RedirectAssetReply.js +12 -11
  30. package/assetDelivery/s3/S3RedirectAssetReply.js.map +1 -1
  31. package/assetDelivery/s3/S3StreamAssetReply.js +12 -11
  32. package/assetDelivery/s3/S3StreamAssetReply.js.map +1 -1
  33. package/assetDelivery/s3/SharpTransform.d.ts +21 -13
  34. package/assetDelivery/s3/SharpTransform.js +164 -173
  35. package/assetDelivery/s3/SharpTransform.js.map +1 -1
  36. package/assetDelivery/s3/transformation/AssetKeyGenerator.js +18 -17
  37. package/assetDelivery/s3/transformation/AssetKeyGenerator.js.map +1 -1
  38. package/assetDelivery/s3/transformation/CallableContentsReader.js +8 -7
  39. package/assetDelivery/s3/transformation/CallableContentsReader.js.map +1 -1
  40. package/assetDelivery/s3/transformation/WidthCollection.js +15 -16
  41. package/assetDelivery/s3/transformation/WidthCollection.js.map +1 -1
  42. package/assetDelivery/s3/transformation/utils.js +24 -30
  43. package/assetDelivery/s3/transformation/utils.js.map +1 -1
  44. package/assetDelivery/threatDetection/ObjectKey.js +15 -14
  45. package/assetDelivery/threatDetection/ObjectKey.js.map +1 -1
  46. package/assetDelivery/threatDetection/createThreatDetectionEventHandler.d.ts +21 -1
  47. package/assetDelivery/threatDetection/createThreatDetectionEventHandler.js +46 -44
  48. package/assetDelivery/threatDetection/createThreatDetectionEventHandler.js.map +1 -1
  49. package/assetDelivery/threatDetection/createThreatDetectionPluginLoader.js +2 -3
  50. package/assetDelivery/threatDetection/createThreatDetectionPluginLoader.js.map +1 -1
  51. package/assetDelivery/threatDetection/index.js +0 -2
  52. package/assetDelivery/threatDetection/processThreatScanResult.js +51 -55
  53. package/assetDelivery/threatDetection/processThreatScanResult.js.map +1 -1
  54. package/assetDelivery/threatDetection/types.js +0 -3
  55. package/assetDelivery/types.d.ts +3 -0
  56. package/assetDelivery/types.js +0 -3
  57. package/enterprise/ApplyThreatScanning/CreateFileWithThreatScanDecorator.d.ts +3 -1
  58. package/enterprise/ApplyThreatScanning/CreateFileWithThreatScanDecorator.js +22 -13
  59. package/enterprise/ApplyThreatScanning/CreateFileWithThreatScanDecorator.js.map +1 -1
  60. package/enterprise/ApplyThreatScanning/feature.js +6 -5
  61. package/enterprise/ApplyThreatScanning/feature.js.map +1 -1
  62. package/features/DeleteFileFromBucket/DeleteFileFromBucketHandler.js +26 -27
  63. package/features/DeleteFileFromBucket/DeleteFileFromBucketHandler.js.map +1 -1
  64. package/features/DeleteFileFromBucket/DeleteS3FolderTask.d.ts +9 -4
  65. package/features/DeleteFileFromBucket/DeleteS3FolderTask.js +49 -53
  66. package/features/DeleteFileFromBucket/DeleteS3FolderTask.js.map +1 -1
  67. package/features/DeleteFileFromBucket/feature.js +7 -6
  68. package/features/DeleteFileFromBucket/feature.js.map +1 -1
  69. package/features/ExtractMetadata/ExtractMetadataHandler.js +18 -19
  70. package/features/ExtractMetadata/ExtractMetadataHandler.js.map +1 -1
  71. package/features/ExtractMetadata/ExtractMetadataTask.d.ts +11 -6
  72. package/features/ExtractMetadata/ExtractMetadataTask.js +86 -116
  73. package/features/ExtractMetadata/ExtractMetadataTask.js.map +1 -1
  74. package/features/ExtractMetadata/feature.js +7 -6
  75. package/features/ExtractMetadata/feature.js.map +1 -1
  76. package/features/FlushCache/FlushCacheOnFileDeleteHandler.js +20 -19
  77. package/features/FlushCache/FlushCacheOnFileDeleteHandler.js.map +1 -1
  78. package/features/FlushCache/FlushCacheOnFileUpdateHandler.js +22 -26
  79. package/features/FlushCache/FlushCacheOnFileUpdateHandler.js.map +1 -1
  80. package/features/FlushCache/InvalidateCacheTask.d.ts +11 -6
  81. package/features/FlushCache/InvalidateCacheTask.js +75 -78
  82. package/features/FlushCache/InvalidateCacheTask.js.map +1 -1
  83. package/features/FlushCache/feature.js +8 -7
  84. package/features/FlushCache/feature.js.map +1 -1
  85. package/features/GetFileContentsById/GetFileContentsByIdUseCase.d.ts +13 -0
  86. package/features/GetFileContentsById/GetFileContentsByIdUseCase.js +40 -0
  87. package/features/GetFileContentsById/GetFileContentsByIdUseCase.js.map +1 -0
  88. package/features/{GetFileContents → GetFileContentsById}/feature.d.ts +1 -1
  89. package/features/GetFileContentsById/feature.js +11 -0
  90. package/features/GetFileContentsById/feature.js.map +1 -0
  91. package/features/GetFileContentsByKey/GetFileContentsByKeyUseCase.d.ts +13 -0
  92. package/features/GetFileContentsByKey/GetFileContentsByKeyUseCase.js +40 -0
  93. package/features/GetFileContentsByKey/GetFileContentsByKeyUseCase.js.map +1 -0
  94. package/features/GetFileContentsByKey/feature.d.ts +4 -0
  95. package/features/GetFileContentsByKey/feature.js +11 -0
  96. package/features/GetFileContentsByKey/feature.js.map +1 -0
  97. package/features/WriteFileMetadata/MetadataReader.js +9 -10
  98. package/features/WriteFileMetadata/MetadataReader.js.map +1 -1
  99. package/features/WriteFileMetadata/MetadataWriter.js +25 -25
  100. package/features/WriteFileMetadata/MetadataWriter.js.map +1 -1
  101. package/features/WriteFileMetadata/WriteMetadataAfterBatchCreateHandler.js +14 -12
  102. package/features/WriteFileMetadata/WriteMetadataAfterBatchCreateHandler.js.map +1 -1
  103. package/features/WriteFileMetadata/WriteMetadataAfterCreateHandler.js +16 -12
  104. package/features/WriteFileMetadata/WriteMetadataAfterCreateHandler.js.map +1 -1
  105. package/features/WriteFileMetadata/feature.js +7 -6
  106. package/features/WriteFileMetadata/feature.js.map +1 -1
  107. package/graphql/S3GraphQLSchema.d.ts +10 -0
  108. package/graphql/S3GraphQLSchema.js +233 -0
  109. package/graphql/S3GraphQLSchema.js.map +1 -0
  110. package/graphql/checkPermissions.js +17 -32
  111. package/graphql/checkPermissions.js.map +1 -1
  112. package/index.d.ts +2 -2
  113. package/index.js +1 -25
  114. package/multiPartUpload/CompleteMultiPartUploadUseCase.js +50 -53
  115. package/multiPartUpload/CompleteMultiPartUploadUseCase.js.map +1 -1
  116. package/multiPartUpload/CreateMultiPartUploadUseCase.js +31 -38
  117. package/multiPartUpload/CreateMultiPartUploadUseCase.js.map +1 -1
  118. package/package.json +27 -23
  119. package/types.d.ts +1 -1
  120. package/types.js +1 -3
  121. package/utils/CdnPathsGenerator.js +8 -4
  122. package/utils/CdnPathsGenerator.js.map +1 -1
  123. package/utils/FileExtension.js +12 -13
  124. package/utils/FileExtension.js.map +1 -1
  125. package/utils/FileKey.js +29 -21
  126. package/utils/FileKey.js.map +1 -1
  127. package/utils/FileKey.test.js +49 -49
  128. package/utils/FileKey.test.js.map +1 -1
  129. package/utils/FileNormalizer.js +31 -46
  130. package/utils/FileNormalizer.js.map +1 -1
  131. package/utils/FileUploadModifier.d.ts +8 -2
  132. package/utils/FileUploadModifier.js +35 -33
  133. package/utils/FileUploadModifier.js.map +1 -1
  134. package/utils/createFileNormalizerFromContext.js +5 -4
  135. package/utils/createFileNormalizerFromContext.js.map +1 -1
  136. package/utils/getPresignedPostPayload.js +36 -33
  137. package/utils/getPresignedPostPayload.js.map +1 -1
  138. package/utils/mimeTypes.js +6 -10
  139. package/utils/mimeTypes.js.map +1 -1
  140. package/utils/uploadFileToS3.d.ts +1 -1
  141. package/utils/uploadFileToS3.js +11 -10
  142. package/utils/uploadFileToS3.js.map +1 -1
  143. package/assetDelivery/index.js.map +0 -1
  144. package/assetDelivery/threatDetection/index.js.map +0 -1
  145. package/assetDelivery/threatDetection/types.js.map +0 -1
  146. package/assetDelivery/types.js.map +0 -1
  147. package/features/GetFileContents/GetFileContentsUseCase.d.ts +0 -13
  148. package/features/GetFileContents/GetFileContentsUseCase.js +0 -41
  149. package/features/GetFileContents/GetFileContentsUseCase.js.map +0 -1
  150. package/features/GetFileContents/feature.js +0 -10
  151. package/features/GetFileContents/feature.js.map +0 -1
  152. package/graphql/schema.d.ts +0 -1
  153. package/graphql/schema.js +0 -204
  154. package/graphql/schema.js.map +0 -1
  155. package/index.js.map +0 -1
  156. package/types.js.map +0 -1
@@ -0,0 +1,9 @@
1
+ import { type Container } from "@webiny/feature/api";
2
+ import type { AssetDeliveryParams } from "./assetDelivery/types.js";
3
+ export interface FileManagerS3FeatureConfig {
4
+ assetDelivery?: AssetDeliveryParams;
5
+ }
6
+ export declare const FileManagerS3Feature: {
7
+ name: string;
8
+ register(container: Container, context?: FileManagerS3FeatureConfig | undefined): void;
9
+ };
@@ -0,0 +1,27 @@
1
+ import { createFeature } from "@webiny/feature/api";
2
+ import { S3GraphQLSchema } from "./graphql/S3GraphQLSchema.js";
3
+ import { DeleteFileFromBucketFeature } from "./features/DeleteFileFromBucket/feature.js";
4
+ import { WriteFileMetadataFeature } from "./features/WriteFileMetadata/feature.js";
5
+ import { ApplyThreatScanningFeature } from "./enterprise/ApplyThreatScanning/feature.js";
6
+ import { FlushCacheFeature } from "./features/FlushCache/feature.js";
7
+ import { ExtractMetadataFeature } from "./features/ExtractMetadata/feature.js";
8
+ import { GetFileContentsByIdFeature } from "./features/GetFileContentsById/feature.js";
9
+ import { GetFileContentsByKeyFeature } from "./features/GetFileContentsByKey/feature.js";
10
+ import { createS3AssetDeliveryFeature } from "./assetDelivery/feature.js";
11
+ const FileManagerS3Feature = createFeature({
12
+ name: "FileManagerS3",
13
+ register (container, config = {}) {
14
+ createS3AssetDeliveryFeature(config.assetDelivery).register(container);
15
+ FlushCacheFeature.register(container);
16
+ DeleteFileFromBucketFeature.register(container);
17
+ ExtractMetadataFeature.register(container);
18
+ WriteFileMetadataFeature.register(container);
19
+ GetFileContentsByIdFeature.register(container);
20
+ GetFileContentsByKeyFeature.register(container);
21
+ container.register(S3GraphQLSchema);
22
+ ApplyThreatScanningFeature.register(container);
23
+ }
24
+ });
25
+ export { FileManagerS3Feature };
26
+
27
+ //# sourceMappingURL=FileManagerS3Feature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileManagerS3Feature.js","sources":["../src/FileManagerS3Feature.ts"],"sourcesContent":["import { type Container, createFeature } from \"@webiny/feature/api\";\nimport { S3GraphQLSchema } from \"./graphql/S3GraphQLSchema.js\";\nimport { DeleteFileFromBucketFeature } from \"~/features/DeleteFileFromBucket/feature.js\";\nimport { WriteFileMetadataFeature } from \"~/features/WriteFileMetadata/feature.js\";\nimport { ApplyThreatScanningFeature } from \"~/enterprise/ApplyThreatScanning/feature.js\";\nimport { FlushCacheFeature } from \"~/features/FlushCache/feature.js\";\nimport { ExtractMetadataFeature } from \"~/features/ExtractMetadata/feature.js\";\nimport { GetFileContentsByIdFeature } from \"~/features/GetFileContentsById/feature.js\";\nimport { GetFileContentsByKeyFeature } from \"~/features/GetFileContentsByKey/feature.js\";\nimport { createS3AssetDeliveryFeature } from \"./assetDelivery/feature.js\";\nimport type { AssetDeliveryParams } from \"./assetDelivery/types.js\";\n\nexport interface FileManagerS3FeatureConfig {\n assetDelivery?: AssetDeliveryParams;\n}\n\nexport const FileManagerS3Feature = createFeature({\n name: \"FileManagerS3\",\n register(container: Container, config: FileManagerS3FeatureConfig = {}) {\n // Register S3-specific asset delivery implementations (S3AssetResolver, S3OutputStrategy).\n // These replace the null implementations from AssetDeliveryFeature in FileManagerAppFeature.\n createS3AssetDeliveryFeature(config.assetDelivery).register(container);\n\n // S3 file-operation features.\n FlushCacheFeature.register(container);\n DeleteFileFromBucketFeature.register(container);\n ExtractMetadataFeature.register(container);\n WriteFileMetadataFeature.register(container);\n GetFileContentsByIdFeature.register(container);\n GetFileContentsByKeyFeature.register(container);\n\n // Static S3 GraphQL schema (extends FmQuery/FmMutation) — a DI-native\n // CoreGraphQLSchemaFactory contributor (declares its resolver dependencies).\n container.register(S3GraphQLSchema);\n\n // Threat scanning is WCP-gated, but the license is per-request (loaded post-register). Register\n // unconditionally; CreateFileWithThreatScanDecorator + the GuardDuty event handler both guard\n // on canUseFileManagerThreatDetection() at request time and no-op/pass-through when unlicensed.\n ApplyThreatScanningFeature.register(container);\n }\n});\n"],"names":["FileManagerS3Feature","createFeature","container","config","createS3AssetDeliveryFeature","FlushCacheFeature","DeleteFileFromBucketFeature","ExtractMetadataFeature","WriteFileMetadataFeature","GetFileContentsByIdFeature","GetFileContentsByKeyFeature","S3GraphQLSchema","ApplyThreatScanningFeature"],"mappings":";;;;;;;;;;AAgBO,MAAMA,uBAAuBC,cAAc;IAC9C,MAAM;IACN,UAASC,SAAoB,EAAEC,SAAqC,CAAC,CAAC;QAGlEC,6BAA6BD,OAAO,aAAa,EAAE,QAAQ,CAACD;QAG5DG,kBAAkB,QAAQ,CAACH;QAC3BI,4BAA4B,QAAQ,CAACJ;QACrCK,uBAAuB,QAAQ,CAACL;QAChCM,yBAAyB,QAAQ,CAACN;QAClCO,2BAA2B,QAAQ,CAACP;QACpCQ,4BAA4B,QAAQ,CAACR;QAIrCA,UAAU,QAAQ,CAACS;QAKnBC,2BAA2B,QAAQ,CAACV;IACxC;AACJ"}
@@ -0,0 +1,11 @@
1
+ import type { S3 } from "@webiny/aws-sdk/client-s3/index.js";
2
+ import type { ImageFormat } from "@webiny/api-file-manager/features/assetDelivery/transformation/index.js";
3
+ export interface IS3AssetDeliveryConfig {
4
+ presignedUrlTtl: number;
5
+ imageResizeWidths: number[];
6
+ imageQuality?: Partial<Record<ImageFormat, number>>;
7
+ assetStreamingMaxSize: number;
8
+ }
9
+ export declare const S3AssetDeliveryConfig: import("@webiny/di").Abstraction<IS3AssetDeliveryConfig>;
10
+ export declare const S3Client: import("@webiny/di").Abstraction<S3>;
11
+ export declare const S3Bucket: import("@webiny/di").Abstraction<string>;
@@ -0,0 +1,7 @@
1
+ import { createAbstraction } from "@webiny/feature/api";
2
+ const S3AssetDeliveryConfig = createAbstraction("AssetDelivery/S3Config");
3
+ const S3Client = createAbstraction("AssetDelivery/S3Client");
4
+ const S3Bucket = createAbstraction("AssetDelivery/S3Bucket");
5
+ export { S3AssetDeliveryConfig, S3Bucket, S3Client };
6
+
7
+ //# sourceMappingURL=abstractions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assetDelivery/abstractions.js","sources":["../../src/assetDelivery/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { S3 } from \"@webiny/aws-sdk/client-s3/index.js\";\nimport type { ImageFormat } from \"@webiny/api-file-manager/features/assetDelivery/transformation/index.js\";\n\nexport interface IS3AssetDeliveryConfig {\n presignedUrlTtl: number;\n imageResizeWidths: number[];\n imageQuality?: Partial<Record<ImageFormat, number>>;\n assetStreamingMaxSize: number;\n}\n\nexport const S3AssetDeliveryConfig =\n createAbstraction<IS3AssetDeliveryConfig>(\"AssetDelivery/S3Config\");\n\nexport const S3Client = createAbstraction<S3>(\"AssetDelivery/S3Client\");\n\nexport const S3Bucket = createAbstraction<string>(\"AssetDelivery/S3Bucket\");\n"],"names":["S3AssetDeliveryConfig","createAbstraction","S3Client","S3Bucket"],"mappings":";AAWO,MAAMA,wBACTC,kBAA0C;AAEvC,MAAMC,WAAWD,kBAAsB;AAEvC,MAAME,WAAWF,kBAA0B"}
@@ -1,2 +1,2 @@
1
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)[])[];
2
+ export declare const assetDeliveryConfig: (params: AssetDeliveryParams) => import("@webiny/handler").RegisterExtensionPlugin<import("@webiny/handler/types").Context>[];
@@ -1,47 +1,13 @@
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
- })];
1
+ import { createRegisterExtensionPlugin } from "@webiny/handler";
2
+ import { createS3AssetDeliveryFeature } from "./feature.js";
3
+ const assetDeliveryConfig = (params)=>{
4
+ const feature = createS3AssetDeliveryFeature(params);
5
+ return [
6
+ createRegisterExtensionPlugin((context)=>{
7
+ feature.register(context.container);
8
+ })
9
+ ];
45
10
  };
11
+ export { assetDeliveryConfig };
46
12
 
47
13
  //# sourceMappingURL=assetDeliveryConfig.js.map
@@ -1 +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":[]}
1
+ {"version":3,"file":"assetDelivery/assetDeliveryConfig.js","sources":["../../src/assetDelivery/assetDeliveryConfig.ts"],"sourcesContent":["import { createRegisterExtensionPlugin } from \"@webiny/handler\";\nimport type { AssetDeliveryParams } from \"~/assetDelivery/types.js\";\nimport { createS3AssetDeliveryFeature } from \"~/assetDelivery/feature.js\";\n\nexport const assetDeliveryConfig = (params: AssetDeliveryParams) => {\n const feature = createS3AssetDeliveryFeature(params);\n\n return [\n createRegisterExtensionPlugin(context => {\n feature.register(context.container);\n })\n ];\n};\n"],"names":["assetDeliveryConfig","params","feature","createS3AssetDeliveryFeature","createRegisterExtensionPlugin","context"],"mappings":";;AAIO,MAAMA,sBAAsB,CAACC;IAChC,MAAMC,UAAUC,6BAA6BF;IAE7C,OAAO;QACHG,8BAA8BC,CAAAA;YAC1BH,QAAQ,QAAQ,CAACG,QAAQ,SAAS;QACtC;KACH;AACL"}
@@ -1,23 +1,9 @@
1
1
  import { createAssetDeliveryPluginLoader } from "@webiny/api-file-manager";
2
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
- };
3
+ const createAssetDelivery = (params = {})=>[
4
+ createAssetDeliveryPluginLoader(()=>import("./assetDeliveryConfig.js").then(({ assetDeliveryConfig })=>assetDeliveryConfig(params))),
5
+ createThreatDetectionPluginLoader(()=>import("./threatDetection/createThreatDetectionEventHandler.js").then(({ createThreatDetectionEventHandler })=>createThreatDetectionEventHandler()))
6
+ ];
7
+ export { createAssetDelivery };
22
8
 
23
9
  //# sourceMappingURL=createAssetDelivery.js.map
@@ -1 +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":[]}
1
+ {"version":3,"file":"assetDelivery/createAssetDelivery.js","sources":["../../src/assetDelivery/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"],"names":["createAssetDelivery","params","createAssetDeliveryPluginLoader","assetDeliveryConfig","createThreatDetectionPluginLoader","createThreatDetectionEventHandler"],"mappings":";;AAKO,MAAMA,sBAAsB,CAACC,SAA8B,CAAC,CAAC,GACzD;QAIHC,gCAAgC,IACrB,MAAM,CAAN,4BAEL,IAAI,CAAC,CAAC,EAAEC,mBAAmB,EAAE,GAAKA,oBAAoBF;QAK5DG,kCAAkC,IACvB,MAAM,CAAN,0DAEL,IAAI,CAAC,CAAC,EAAEC,iCAAiC,EAAE,GAAKA;KAEzD"}
@@ -0,0 +1,5 @@
1
+ import type { AssetDeliveryParams } from "./types.js";
2
+ export declare const createS3AssetDeliveryFeature: (params?: AssetDeliveryParams) => {
3
+ name: string;
4
+ register(container: import("@webiny/di").Container): void;
5
+ };
@@ -0,0 +1,36 @@
1
+ import { createFeature } from "@webiny/feature/api";
2
+ import { createS3 } from "@webiny/aws-sdk/client-s3/index.js";
3
+ import { S3AssetDeliveryConfig, S3Bucket, S3Client } from "./abstractions.js";
4
+ import { S3AssetResolverImpl } from "./s3/S3AssetResolver.js";
5
+ import { S3OutputStrategyImpl } from "./s3/S3OutputStrategy.js";
6
+ import { LazySharpTransformImpl } from "./s3/LazySharpTransform.js";
7
+ const createS3AssetDeliveryFeature = (params = {})=>createFeature({
8
+ name: "AssetDelivery/S3",
9
+ register (container) {
10
+ container.registerFactory(S3Client, ()=>createS3());
11
+ container.registerInstance(S3Bucket, process.env.S3_BUCKET);
12
+ container.registerInstance(S3AssetDeliveryConfig, {
13
+ presignedUrlTtl: params.presignedUrlTtl ?? 3600,
14
+ imageResizeWidths: params.imageResizeWidths ?? [
15
+ 128,
16
+ 384,
17
+ 640,
18
+ 750,
19
+ 828,
20
+ 1080,
21
+ 1200,
22
+ 1920,
23
+ 2048,
24
+ 3840
25
+ ],
26
+ imageQuality: params.imageQuality ?? {},
27
+ assetStreamingMaxSize: params.assetStreamingMaxSize ?? 4718592
28
+ });
29
+ container.register(S3AssetResolverImpl);
30
+ container.register(S3OutputStrategyImpl);
31
+ if ("asset-delivery" === process.env.WEBINY_FUNCTION_TYPE) container.register(LazySharpTransformImpl).inSingletonScope();
32
+ }
33
+ });
34
+ export { createS3AssetDeliveryFeature };
35
+
36
+ //# sourceMappingURL=feature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assetDelivery/feature.js","sources":["../../src/assetDelivery/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { createS3 } from \"@webiny/aws-sdk/client-s3/index.js\";\nimport { S3Client, S3Bucket, S3AssetDeliveryConfig } from \"./abstractions.js\";\nimport type { AssetDeliveryParams } from \"./types.js\";\nimport { S3AssetResolverImpl } from \"./s3/S3AssetResolver.js\";\nimport { S3OutputStrategyImpl } from \"./s3/S3OutputStrategy.js\";\nimport { LazySharpTransformImpl } from \"./s3/LazySharpTransform.js\";\n\nexport const createS3AssetDeliveryFeature = (params: AssetDeliveryParams = {}) => {\n return createFeature({\n name: \"AssetDelivery/S3\",\n register(container) {\n // register() runs for every request, so build the client only when something resolves\n // it, and reuse it across requests. Building it here cost every request an S3 client.\n container.registerFactory(S3Client, () => createS3());\n container.registerInstance(S3Bucket, process.env.S3_BUCKET as string);\n container.registerInstance(S3AssetDeliveryConfig, {\n presignedUrlTtl: params.presignedUrlTtl ?? 3600,\n imageResizeWidths: params.imageResizeWidths ?? [\n 128, 384, 640, 750, 828, 1080, 1200, 1920, 2048, 3840\n ],\n imageQuality: params.imageQuality ?? {},\n assetStreamingMaxSize: params.assetStreamingMaxSize ?? 4718592\n });\n\n container.register(S3AssetResolverImpl);\n container.register(S3OutputStrategyImpl);\n\n if (process.env.WEBINY_FUNCTION_TYPE === \"asset-delivery\") {\n // Registered eagerly; `sharp` is still loaded lazily, inside the handler.\n container.register(LazySharpTransformImpl).inSingletonScope();\n }\n }\n });\n};\n"],"names":["createS3AssetDeliveryFeature","params","createFeature","container","S3Client","createS3","S3Bucket","process","S3AssetDeliveryConfig","S3AssetResolverImpl","S3OutputStrategyImpl","LazySharpTransformImpl"],"mappings":";;;;;;AAQO,MAAMA,+BAA+B,CAACC,SAA8B,CAAC,CAAC,GAClEC,cAAc;QACjB,MAAM;QACN,UAASC,SAAS;YAGdA,UAAU,eAAe,CAACC,UAAU,IAAMC;YAC1CF,UAAU,gBAAgB,CAACG,UAAUC,QAAQ,GAAG,CAAC,SAAS;YAC1DJ,UAAU,gBAAgB,CAACK,uBAAuB;gBAC9C,iBAAiBP,OAAO,eAAe,IAAI;gBAC3C,mBAAmBA,OAAO,iBAAiB,IAAI;oBAC3C;oBAAK;oBAAK;oBAAK;oBAAK;oBAAK;oBAAM;oBAAM;oBAAM;oBAAM;iBACpD;gBACD,cAAcA,OAAO,YAAY,IAAI,CAAC;gBACtC,uBAAuBA,OAAO,qBAAqB,IAAI;YAC3D;YAEAE,UAAU,QAAQ,CAACM;YACnBN,UAAU,QAAQ,CAACO;YAEnB,IAAIH,AAAqC,qBAArCA,QAAQ,GAAG,CAAC,oBAAoB,EAEhCJ,UAAU,QAAQ,CAACQ,wBAAwB,gBAAgB;QAEnE;IACJ"}
@@ -6,5 +6,3 @@ export { S3RedirectAssetReply } from "./s3/S3RedirectAssetReply.js";
6
6
  export { S3StreamAssetReply } from "./s3/S3StreamAssetReply.js";
7
7
  export { SharpTransform } from "./s3/SharpTransform.js";
8
8
  export { CallableContentsReader } from "./s3/transformation/CallableContentsReader.js";
9
-
10
- //# sourceMappingURL=index.js.map
@@ -0,0 +1,34 @@
1
+ import type { S3 } from "@webiny/aws-sdk/client-s3/index.js";
2
+ import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
3
+ import { GetFileUseCase } from "@webiny/api-file-manager/features/file/GetFile/index.js";
4
+ import { ImageAssetTypeHandler } from "@webiny/api-file-manager/features/assetDelivery/assetTypes/image/index.js";
5
+ import type { Asset } from "@webiny/api-file-manager/delivery/AssetDelivery/Asset.js";
6
+ import type { AssetRequest } from "@webiny/api-file-manager/delivery/AssetDelivery/AssetRequest.js";
7
+ import type { IS3AssetDeliveryConfig } from "../../assetDelivery/abstractions.js";
8
+ /**
9
+ * Defers loading `sharp` until an image is actually transformed.
10
+ *
11
+ * The dynamic import is deliberate — it keeps `sharp` out of the main bundle (note the
12
+ * `webpackChunkName`). That import is async and DI resolution is not, which is why this used to be
13
+ * a per-request `RequestContextInitializer` that imported the module and then registered the real
14
+ * handler. `IAssetTypeHandler` has a single async method, so the import can be awaited there
15
+ * instead.
16
+ *
17
+ * The constructed handler IS memoized: the initializer registered it `.inSingletonScope()`, and
18
+ * nothing below caches the instance (Node caches the module, not the object built from it).
19
+ */
20
+ declare class LazySharpTransform implements ImageAssetTypeHandler.Interface {
21
+ private readonly s3;
22
+ private readonly bucket;
23
+ private readonly config;
24
+ private readonly identityContext;
25
+ private readonly getFile;
26
+ private handler;
27
+ constructor(s3: S3, bucket: string, config: IS3AssetDeliveryConfig, identityContext: IdentityContext.Interface, getFile: GetFileUseCase.Interface);
28
+ private resolveHandler;
29
+ handle(assetRequest: AssetRequest, asset: Asset): Promise<Asset>;
30
+ }
31
+ export declare const LazySharpTransformImpl: typeof LazySharpTransform & {
32
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-file-manager/features/assetDelivery/abstractions/AssetType.js").IAssetTypeHandler>;
33
+ };
34
+ export {};
@@ -0,0 +1,34 @@
1
+ import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
2
+ import { GetFileUseCase } from "@webiny/api-file-manager/features/file/GetFile/index.js";
3
+ import { ImageAssetTypeHandler } from "@webiny/api-file-manager/features/assetDelivery/assetTypes/image/index.js";
4
+ import { S3AssetDeliveryConfig, S3Bucket, S3Client } from "../abstractions.js";
5
+ class LazySharpTransform {
6
+ constructor(s3, bucket, config, identityContext, getFile){
7
+ this.s3 = s3;
8
+ this.bucket = bucket;
9
+ this.config = config;
10
+ this.identityContext = identityContext;
11
+ this.getFile = getFile;
12
+ this.handler = null;
13
+ }
14
+ resolveHandler() {
15
+ if (!this.handler) this.handler = import("./SharpTransform.js").then(({ SharpTransform })=>new SharpTransform(this.s3, this.bucket, this.config, this.identityContext, this.getFile));
16
+ return this.handler;
17
+ }
18
+ async handle(assetRequest, asset) {
19
+ return (await this.resolveHandler()).handle(assetRequest, asset);
20
+ }
21
+ }
22
+ const LazySharpTransformImpl = ImageAssetTypeHandler.createImplementation({
23
+ implementation: LazySharpTransform,
24
+ dependencies: [
25
+ S3Client,
26
+ S3Bucket,
27
+ S3AssetDeliveryConfig,
28
+ IdentityContext,
29
+ GetFileUseCase
30
+ ]
31
+ });
32
+ export { LazySharpTransformImpl };
33
+
34
+ //# sourceMappingURL=LazySharpTransform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assetDelivery/s3/LazySharpTransform.js","sources":["../../../src/assetDelivery/s3/LazySharpTransform.ts"],"sourcesContent":["import type { S3 } from \"@webiny/aws-sdk/client-s3/index.js\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\nimport { GetFileUseCase } from \"@webiny/api-file-manager/features/file/GetFile/index.js\";\nimport { ImageAssetTypeHandler } from \"@webiny/api-file-manager/features/assetDelivery/assetTypes/image/index.js\";\nimport type { Asset } from \"@webiny/api-file-manager/delivery/AssetDelivery/Asset.js\";\nimport type { AssetRequest } from \"@webiny/api-file-manager/delivery/AssetDelivery/AssetRequest.js\";\nimport { S3AssetDeliveryConfig, S3Bucket, S3Client } from \"~/assetDelivery/abstractions.js\";\nimport type { IS3AssetDeliveryConfig } from \"~/assetDelivery/abstractions.js\";\n\n/**\n * Defers loading `sharp` until an image is actually transformed.\n *\n * The dynamic import is deliberate — it keeps `sharp` out of the main bundle (note the\n * `webpackChunkName`). That import is async and DI resolution is not, which is why this used to be\n * a per-request `RequestContextInitializer` that imported the module and then registered the real\n * handler. `IAssetTypeHandler` has a single async method, so the import can be awaited there\n * instead.\n *\n * The constructed handler IS memoized: the initializer registered it `.inSingletonScope()`, and\n * nothing below caches the instance (Node caches the module, not the object built from it).\n */\nclass LazySharpTransform implements ImageAssetTypeHandler.Interface {\n private handler: Promise<ImageAssetTypeHandler.Interface> | null = null;\n\n constructor(\n private readonly s3: S3,\n private readonly bucket: string,\n private readonly config: IS3AssetDeliveryConfig,\n private readonly identityContext: IdentityContext.Interface,\n private readonly getFile: GetFileUseCase.Interface\n ) {}\n\n private resolveHandler(): Promise<ImageAssetTypeHandler.Interface> {\n if (!this.handler) {\n this.handler = import(\n /* webpackChunkName: \"s3AssetDelivery\" */ \"./SharpTransform.js\"\n ).then(\n ({ SharpTransform }) =>\n new SharpTransform(\n this.s3,\n this.bucket,\n this.config,\n this.identityContext,\n this.getFile\n )\n );\n }\n return this.handler;\n }\n\n async handle(assetRequest: AssetRequest, asset: Asset): Promise<Asset> {\n return (await this.resolveHandler()).handle(assetRequest, asset);\n }\n}\n\nexport const LazySharpTransformImpl = ImageAssetTypeHandler.createImplementation({\n implementation: LazySharpTransform,\n dependencies: [S3Client, S3Bucket, S3AssetDeliveryConfig, IdentityContext, GetFileUseCase]\n});\n"],"names":["LazySharpTransform","s3","bucket","config","identityContext","getFile","SharpTransform","assetRequest","asset","LazySharpTransformImpl","ImageAssetTypeHandler","S3Client","S3Bucket","S3AssetDeliveryConfig","IdentityContext","GetFileUseCase"],"mappings":";;;;AAqBA,MAAMA;IAGF,YACqBC,EAAM,EACNC,MAAc,EACdC,MAA8B,EAC9BC,eAA0C,EAC1CC,OAAiC,CACpD;aALmBJ,EAAE,GAAFA;aACAC,MAAM,GAANA;aACAC,MAAM,GAANA;aACAC,eAAe,GAAfA;aACAC,OAAO,GAAPA;aAPb,OAAO,GAAoD;IAQhE;IAEK,iBAA2D;QAC/D,IAAI,CAAC,IAAI,CAAC,OAAO,EACb,IAAI,CAAC,OAAO,GAAG,MAAM,CAAN,uBAEb,IAAI,CACF,CAAC,EAAEC,cAAc,EAAE,GACf,IAAIA,eACA,IAAI,CAAC,EAAE,EACP,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,eAAe,EACpB,IAAI,CAAC,OAAO;QAI5B,OAAO,IAAI,CAAC,OAAO;IACvB;IAEA,MAAM,OAAOC,YAA0B,EAAEC,KAAY,EAAkB;QACnE,OAAQ,OAAM,IAAI,CAAC,cAAc,EAAC,EAAG,MAAM,CAACD,cAAcC;IAC9D;AACJ;AAEO,MAAMC,yBAAyBC,sBAAsB,oBAAoB,CAAC;IAC7E,gBAAgBV;IAChB,cAAc;QAACW;QAAUC;QAAUC;QAAuBC;QAAiBC;KAAe;AAC9F"}
@@ -9,3 +9,6 @@ export declare class S3AssetResolver implements AssetResolver {
9
9
  constructor(keyValueStore: GlobalKeyValueStore.Interface, s3: S3, bucket: string);
10
10
  resolve(request: AssetRequest): Promise<Asset | undefined>;
11
11
  }
12
+ export declare const S3AssetResolverImpl: typeof S3AssetResolver & {
13
+ __abstraction: import("@webiny/di").Abstraction<AssetResolver>;
14
+ };
@@ -1,29 +1,39 @@
1
1
  import { Asset } from "@webiny/api-file-manager";
2
+ import { AssetResolver } from "@webiny/api-file-manager/features/assetDelivery/abstractions.js";
3
+ import { GlobalKeyValueStore } from "@webiny/api-core/features/keyValueStore/index.js";
2
4
  import { S3ContentsReader } from "../index.js";
3
5
  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;
6
+ import { S3Bucket, S3Client } from "../abstractions.js";
7
+ class S3AssetResolver {
8
+ constructor(keyValueStore, s3, bucket){
9
+ this.keyValueStore = keyValueStore;
10
+ this.s3 = s3;
11
+ this.bucket = bucket;
12
+ }
13
+ async resolve(request) {
14
+ const fileId = ObjectKey.from(request.getKey()).id();
15
+ const result = await this.keyValueStore.get(`FileManager/File/${fileId}/Metadata`);
16
+ if (result.isFail()) return;
17
+ const metadata = result.value;
18
+ const asset = new Asset({
19
+ id: metadata.id,
20
+ tenant: metadata.tenant,
21
+ size: metadata.size,
22
+ contentType: metadata.contentType,
23
+ key: metadata.bucketKey
24
+ });
25
+ asset.setContentsReader(new S3ContentsReader(this.s3, this.bucket));
26
+ return asset;
15
27
  }
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
+ const S3AssetResolverImpl = AssetResolver.createImplementation({
30
+ implementation: S3AssetResolver,
31
+ dependencies: [
32
+ GlobalKeyValueStore,
33
+ S3Client,
34
+ S3Bucket
35
+ ]
36
+ });
37
+ export { S3AssetResolver, S3AssetResolverImpl };
28
38
 
29
39
  //# sourceMappingURL=S3AssetResolver.js.map
@@ -1 +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":[]}
1
+ {"version":3,"file":"assetDelivery/s3/S3AssetResolver.js","sources":["../../../src/assetDelivery/s3/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 { AssetResolver as AssetResolverAbstraction } from \"@webiny/api-file-manager/features/assetDelivery/abstractions.js\";\nimport { GlobalKeyValueStore } from \"@webiny/api-core/features/keyValueStore/index.js\";\nimport { S3ContentsReader } from \"~/assetDelivery/index.js\";\nimport { ObjectKey } from \"~/assetDelivery/threatDetection/ObjectKey.js\";\nimport { S3Client, S3Bucket } from \"~/assetDelivery/abstractions.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\nexport const S3AssetResolverImpl = AssetResolverAbstraction.createImplementation({\n implementation: S3AssetResolver,\n dependencies: [GlobalKeyValueStore, S3Client, S3Bucket]\n});\n"],"names":["S3AssetResolver","keyValueStore","s3","bucket","request","fileId","ObjectKey","result","metadata","asset","Asset","S3ContentsReader","S3AssetResolverImpl","AssetResolverAbstraction","GlobalKeyValueStore","S3Client","S3Bucket"],"mappings":";;;;;;AAiBO,MAAMA;IACT,YACYC,aAA4C,EAC5CC,EAAM,EACNC,MAAc,CACxB;aAHUF,aAAa,GAAbA;aACAC,EAAE,GAAFA;aACAC,MAAM,GAANA;IACT;IAEH,MAAM,QAAQC,OAAqB,EAA8B;QAC7D,MAAMC,SAASC,UAAU,IAAI,CAACF,QAAQ,MAAM,IAAI,EAAE;QAClD,MAAMG,SAAS,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,CACvC,CAAC,iBAAiB,EAAEF,OAAO,SAAS,CAAC;QAGzC,IAAIE,OAAO,MAAM,IACb;QAGJ,MAAMC,WAAWD,OAAO,KAAK;QAE7B,MAAME,QAAQ,IAAIC,MAAM;YACpB,IAAIF,SAAS,EAAE;YACf,QAAQA,SAAS,MAAM;YACvB,MAAMA,SAAS,IAAI;YACnB,aAAaA,SAAS,WAAW;YACjC,KAAKA,SAAS,SAAS;QAC3B;QAEAC,MAAM,iBAAiB,CAAC,IAAIE,iBAAiB,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM;QAEjE,OAAOF;IACX;AACJ;AAEO,MAAMG,sBAAsBC,cAAAA,oBAA6C,CAAC;IAC7E,gBAAgBb;IAChB,cAAc;QAACc;QAAqBC;QAAUC;KAAS;AAC3D"}
@@ -1,20 +1,17 @@
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()}!`);
1
+ class S3ContentsReader {
2
+ constructor(s3, bucket){
3
+ this.s3 = s3;
4
+ this.bucket = bucket;
5
+ }
6
+ async read(asset) {
7
+ const { Body } = await this.s3.getObject({
8
+ Bucket: this.bucket,
9
+ Key: asset.getKey()
10
+ });
11
+ if (!Body) throw Error(`Unable to read ${asset.getKey()}!`);
12
+ return Buffer.from(await Body.transformToByteArray());
15
13
  }
16
- return Buffer.from(await Body.transformToByteArray());
17
- }
18
14
  }
15
+ export { S3ContentsReader };
19
16
 
20
17
  //# sourceMappingURL=S3ContentsReader.js.map
@@ -1 +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":[]}
1
+ {"version":3,"file":"assetDelivery/s3/S3ContentsReader.js","sources":["../../../src/assetDelivery/s3/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"],"names":["S3ContentsReader","s3","bucket","asset","Body","Error","Buffer"],"mappings":"AAGO,MAAMA;IAIT,YAAYC,EAAM,EAAEC,MAAc,CAAE;QAChC,IAAI,CAAC,EAAE,GAAGD;QACV,IAAI,CAAC,MAAM,GAAGC;IAClB;IAEA,MAAM,KAAKC,KAAY,EAAmB;QACtC,MAAM,EAAEC,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC;YACrC,QAAQ,IAAI,CAAC,MAAM;YACnB,KAAKD,MAAM,MAAM;QACrB;QAEA,IAAI,CAACC,MACD,MAAMC,MAAM,CAAC,eAAe,EAAEF,MAAM,MAAM,GAAG,CAAC,CAAC;QAGnD,OAAOG,OAAO,IAAI,CAAC,MAAMF,KAAK,oBAAoB;IACtD;AACJ"}
@@ -1,13 +1,14 @@
1
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
- }
2
+ class S3ErrorAssetReply extends AssetReply {
3
+ constructor(message){
4
+ super({
5
+ code: 400,
6
+ body: ()=>({
7
+ error: message
8
+ })
9
+ });
10
+ }
11
11
  }
12
+ export { S3ErrorAssetReply };
12
13
 
13
14
  //# sourceMappingURL=S3ErrorAssetReply.js.map
@@ -1 +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":[]}
1
+ {"version":3,"file":"assetDelivery/s3/S3ErrorAssetReply.js","sources":["../../../src/assetDelivery/s3/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"],"names":["S3ErrorAssetReply","AssetReply","message"],"mappings":";AAEO,MAAMA,0BAA0BC;IACnC,YAAYC,OAAe,CAAE;QACzB,KAAK,CAAC;YACF,MAAM;YACN,MAAM,IAAO;oBAAE,OAAOA;gBAAQ;QAClC;IACJ;AACJ"}
@@ -1,15 +1,15 @@
1
1
  import type { Asset, AssetOutputStrategy, AssetReply } from "@webiny/api-file-manager";
2
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
- */
3
+ import type { IS3AssetDeliveryConfig } from "../../assetDelivery/abstractions.js";
7
4
  export declare class S3OutputStrategy implements AssetOutputStrategy {
8
5
  private readonly s3;
9
6
  private readonly bucket;
10
7
  private readonly presignedUrlTtl;
11
8
  private readonly assetStreamingMaxSize;
12
- constructor(s3: S3, bucket: string, presignedUrlTtl: number, assetStreamingMaxSize: number);
9
+ constructor(s3: S3, bucket: string, config: IS3AssetDeliveryConfig);
13
10
  output(asset: Asset): Promise<AssetReply>;
14
11
  protected getPresignedUrl(asset: Asset): Promise<string>;
15
12
  }
13
+ export declare const S3OutputStrategyImpl: typeof S3OutputStrategy & {
14
+ __abstraction: import("@webiny/di").Abstraction<AssetOutputStrategy>;
15
+ };
@@ -1,34 +1,40 @@
1
+ import { AssetOutputStrategy } from "@webiny/api-file-manager/features/assetDelivery/abstractions.js";
1
2
  import { GetObjectCommand, getSignedUrl } from "@webiny/aws-sdk/client-s3/index.js";
2
3
  import { S3RedirectAssetReply } from "./S3RedirectAssetReply.js";
3
4
  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);
5
+ import { S3AssetDeliveryConfig, S3Bucket, S3Client } from "../abstractions.js";
6
+ class S3OutputStrategy {
7
+ constructor(s3, bucket, config){
8
+ this.s3 = s3;
9
+ this.bucket = bucket;
10
+ this.presignedUrlTtl = config.presignedUrlTtl;
11
+ this.assetStreamingMaxSize = config.assetStreamingMaxSize;
12
+ }
13
+ async output(asset) {
14
+ if (asset.getSize() > this.assetStreamingMaxSize) {
15
+ console.log(`Asset size is greater than ${this.assetStreamingMaxSize}; redirecting to a presigned S3 URL.`);
16
+ return new S3RedirectAssetReply(await this.getPresignedUrl(asset), this.presignedUrlTtl);
17
+ }
18
+ console.log(`Asset size is smaller than ${this.assetStreamingMaxSize}; streaming directly from Lambda function.`);
19
+ return new S3StreamAssetReply(asset);
20
+ }
21
+ getPresignedUrl(asset) {
22
+ return getSignedUrl(this.s3, new GetObjectCommand({
23
+ Bucket: this.bucket,
24
+ Key: asset.getKey()
25
+ }), {
26
+ expiresIn: this.presignedUrlTtl
27
+ });
20
28
  }
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
29
  }
30
+ const S3OutputStrategyImpl = AssetOutputStrategy.createImplementation({
31
+ implementation: S3OutputStrategy,
32
+ dependencies: [
33
+ S3Client,
34
+ S3Bucket,
35
+ S3AssetDeliveryConfig
36
+ ]
37
+ });
38
+ export { S3OutputStrategy, S3OutputStrategyImpl };
33
39
 
34
40
  //# sourceMappingURL=S3OutputStrategy.js.map