@webiny/api-file-manager-s3 0.0.0-mt-2 → 0.0.0-unstable.06b2ede40f

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 (151) hide show
  1. package/assetDelivery/assetDeliveryConfig.d.ts +2 -0
  2. package/assetDelivery/assetDeliveryConfig.js +52 -0
  3. package/assetDelivery/assetDeliveryConfig.js.map +1 -0
  4. package/assetDelivery/createAssetDelivery.d.ts +3 -0
  5. package/assetDelivery/createAssetDelivery.js +30 -0
  6. package/assetDelivery/createAssetDelivery.js.map +1 -0
  7. package/assetDelivery/createCustomAssetDelivery.d.ts +12 -0
  8. package/assetDelivery/createCustomAssetDelivery.js +28 -0
  9. package/assetDelivery/createCustomAssetDelivery.js.map +1 -0
  10. package/assetDelivery/customAssets/CustomAsset.d.ts +6 -0
  11. package/assetDelivery/customAssets/CustomAsset.js +14 -0
  12. package/assetDelivery/customAssets/CustomAsset.js.map +1 -0
  13. package/assetDelivery/customAssets/CustomAssetProcessor.d.ts +10 -0
  14. package/assetDelivery/customAssets/CustomAssetProcessor.js +25 -0
  15. package/assetDelivery/customAssets/CustomAssetProcessor.js.map +1 -0
  16. package/assetDelivery/customAssets/S3CustomAssetResolver.d.ts +15 -0
  17. package/assetDelivery/customAssets/S3CustomAssetResolver.js +90 -0
  18. package/assetDelivery/customAssets/S3CustomAssetResolver.js.map +1 -0
  19. package/assetDelivery/customAssets/customAssetDeliveryConfig.d.ts +1 -0
  20. package/assetDelivery/customAssets/customAssetDeliveryConfig.js +30 -0
  21. package/assetDelivery/customAssets/customAssetDeliveryConfig.js.map +1 -0
  22. package/assetDelivery/index.d.ts +9 -0
  23. package/assetDelivery/index.js +70 -0
  24. package/assetDelivery/index.js.map +1 -0
  25. package/assetDelivery/s3/S3AssetMetadataReader.d.ts +15 -0
  26. package/assetDelivery/s3/S3AssetMetadataReader.js +36 -0
  27. package/assetDelivery/s3/S3AssetMetadataReader.js.map +1 -0
  28. package/assetDelivery/s3/S3AssetResolver.d.ts +9 -0
  29. package/assetDelivery/s3/S3AssetResolver.js +37 -0
  30. package/assetDelivery/s3/S3AssetResolver.js.map +1 -0
  31. package/assetDelivery/s3/S3ContentsReader.d.ts +10 -0
  32. package/assetDelivery/s3/S3ContentsReader.js +27 -0
  33. package/assetDelivery/s3/S3ContentsReader.js.map +1 -0
  34. package/assetDelivery/s3/S3ErrorAssetReply.d.ts +4 -0
  35. package/assetDelivery/s3/S3ErrorAssetReply.js +20 -0
  36. package/assetDelivery/s3/S3ErrorAssetReply.js.map +1 -0
  37. package/assetDelivery/s3/S3OutputStrategy.d.ts +15 -0
  38. package/assetDelivery/s3/S3OutputStrategy.js +40 -0
  39. package/assetDelivery/s3/S3OutputStrategy.js.map +1 -0
  40. package/assetDelivery/s3/S3RedirectAssetReply.d.ts +4 -0
  41. package/assetDelivery/s3/S3RedirectAssetReply.js +23 -0
  42. package/assetDelivery/s3/S3RedirectAssetReply.js.map +1 -0
  43. package/assetDelivery/s3/S3StreamAssetReply.d.ts +5 -0
  44. package/assetDelivery/s3/S3StreamAssetReply.js +23 -0
  45. package/assetDelivery/s3/S3StreamAssetReply.js.map +1 -0
  46. package/assetDelivery/s3/SharpTransform.d.ts +18 -0
  47. package/assetDelivery/s3/SharpTransform.js +192 -0
  48. package/assetDelivery/s3/SharpTransform.js.map +1 -0
  49. package/assetDelivery/s3/transformation/AssetKeyGenerator.d.ts +8 -0
  50. package/assetDelivery/s3/transformation/AssetKeyGenerator.js +29 -0
  51. package/assetDelivery/s3/transformation/AssetKeyGenerator.js.map +1 -0
  52. package/assetDelivery/s3/transformation/CallableContentsReader.d.ts +12 -0
  53. package/assetDelivery/s3/transformation/CallableContentsReader.js +17 -0
  54. package/assetDelivery/s3/transformation/CallableContentsReader.js.map +1 -0
  55. package/assetDelivery/s3/transformation/WidthCollection.d.ts +7 -0
  56. package/assetDelivery/s3/transformation/WidthCollection.js +27 -0
  57. package/assetDelivery/s3/transformation/WidthCollection.js.map +1 -0
  58. package/assetDelivery/s3/transformation/legacyUtils.d.ts +12 -0
  59. package/assetDelivery/s3/transformation/legacyUtils.js +34 -0
  60. package/assetDelivery/s3/transformation/legacyUtils.js.map +1 -0
  61. package/assetDelivery/s3/transformation/utils.d.ts +11 -0
  62. package/assetDelivery/s3/transformation/utils.js +33 -0
  63. package/assetDelivery/s3/transformation/utils.js.map +1 -0
  64. package/assetDelivery/threatDetection/createThreatDetectionEventHandler.d.ts +2 -0
  65. package/assetDelivery/threatDetection/createThreatDetectionEventHandler.js +62 -0
  66. package/assetDelivery/threatDetection/createThreatDetectionEventHandler.js.map +1 -0
  67. package/assetDelivery/threatDetection/createThreatDetectionPluginLoader.d.ts +2 -0
  68. package/assetDelivery/threatDetection/createThreatDetectionPluginLoader.js +13 -0
  69. package/assetDelivery/threatDetection/createThreatDetectionPluginLoader.js.map +1 -0
  70. package/assetDelivery/threatDetection/index.d.ts +2 -0
  71. package/assetDelivery/threatDetection/index.js +29 -0
  72. package/assetDelivery/threatDetection/index.js.map +1 -0
  73. package/assetDelivery/threatDetection/processThreatScanResult.d.ts +2 -0
  74. package/assetDelivery/threatDetection/processThreatScanResult.js +66 -0
  75. package/assetDelivery/threatDetection/processThreatScanResult.js.map +1 -0
  76. package/assetDelivery/threatDetection/types.d.ts +13 -0
  77. package/assetDelivery/threatDetection/types.js +7 -0
  78. package/assetDelivery/threatDetection/types.js.map +1 -0
  79. package/assetDelivery/types.d.ts +11 -0
  80. package/assetDelivery/types.js +7 -0
  81. package/assetDelivery/types.js.map +1 -0
  82. package/flushCdnCache/CdnPathsGenerator.d.ts +4 -0
  83. package/flushCdnCache/CdnPathsGenerator.js +14 -0
  84. package/flushCdnCache/CdnPathsGenerator.js.map +1 -0
  85. package/flushCdnCache/InvalidateCacheTask.d.ts +18 -0
  86. package/flushCdnCache/InvalidateCacheTask.js +78 -0
  87. package/flushCdnCache/InvalidateCacheTask.js.map +1 -0
  88. package/flushCdnCache/flushCacheOnFileDelete.d.ts +3 -0
  89. package/flushCdnCache/flushCacheOnFileDelete.js +34 -0
  90. package/flushCdnCache/flushCacheOnFileDelete.js.map +1 -0
  91. package/flushCdnCache/flushCacheOnFileUpdate.d.ts +3 -0
  92. package/flushCdnCache/flushCacheOnFileUpdate.js +40 -0
  93. package/flushCdnCache/flushCacheOnFileUpdate.js.map +1 -0
  94. package/flushCdnCache/index.d.ts +1 -0
  95. package/flushCdnCache/index.js +15 -0
  96. package/flushCdnCache/index.js.map +1 -0
  97. package/flushCdnCache/invalidateCacheTaskDefinition.d.ts +2 -0
  98. package/flushCdnCache/invalidateCacheTaskDefinition.js +22 -0
  99. package/flushCdnCache/invalidateCacheTaskDefinition.js.map +1 -0
  100. package/index.d.ts +4 -1
  101. package/index.js +27 -7
  102. package/index.js.map +1 -0
  103. package/multiPartUpload/CompleteMultiPartUploadUseCase.d.ts +15 -0
  104. package/multiPartUpload/CompleteMultiPartUploadUseCase.js +65 -0
  105. package/multiPartUpload/CompleteMultiPartUploadUseCase.js.map +1 -0
  106. package/multiPartUpload/CreateMultiPartUploadUseCase.d.ts +20 -0
  107. package/multiPartUpload/CreateMultiPartUploadUseCase.js +48 -0
  108. package/multiPartUpload/CreateMultiPartUploadUseCase.js.map +1 -0
  109. package/package.json +29 -16
  110. package/plugins/addFileMetadata.d.ts +10 -0
  111. package/plugins/addFileMetadata.js +67 -0
  112. package/plugins/addFileMetadata.js.map +1 -0
  113. package/plugins/checkPermissions.d.ts +4 -0
  114. package/plugins/checkPermissions.js +44 -0
  115. package/plugins/checkPermissions.js.map +1 -0
  116. package/plugins/fileStorageS3.d.ts +2 -2
  117. package/plugins/fileStorageS3.js +47 -46
  118. package/plugins/fileStorageS3.js.map +1 -0
  119. package/plugins/graphqlFileStorageS3.d.ts +2 -2
  120. package/plugins/graphqlFileStorageS3.js +137 -59
  121. package/plugins/graphqlFileStorageS3.js.map +1 -0
  122. package/types.d.ts +20 -0
  123. package/types.js +7 -1
  124. package/types.js.map +1 -0
  125. package/utils/FileExtension.d.ts +6 -0
  126. package/utils/FileExtension.js +24 -0
  127. package/utils/FileExtension.js.map +1 -0
  128. package/utils/FileKey.d.ts +11 -0
  129. package/utils/FileKey.js +33 -0
  130. package/utils/FileKey.js.map +1 -0
  131. package/utils/FileKey.test.d.ts +1 -0
  132. package/utils/FileKey.test.js +60 -0
  133. package/utils/FileKey.test.js.map +1 -0
  134. package/utils/FileNormalizer.d.ts +18 -0
  135. package/utils/FileNormalizer.js +49 -0
  136. package/utils/FileNormalizer.js.map +1 -0
  137. package/utils/FileUploadModifier.d.ts +30 -0
  138. package/utils/FileUploadModifier.js +49 -0
  139. package/utils/FileUploadModifier.js.map +1 -0
  140. package/utils/createFileNormalizerFromContext.d.ts +3 -0
  141. package/utils/createFileNormalizerFromContext.js +15 -0
  142. package/utils/createFileNormalizerFromContext.js.map +1 -0
  143. package/utils/getPresignedPostPayload.d.ts +3 -11
  144. package/utils/getPresignedPostPayload.js +14 -55
  145. package/utils/getPresignedPostPayload.js.map +1 -0
  146. package/utils/mimeTypes.d.ts +5 -0
  147. package/utils/mimeTypes.js +23 -0
  148. package/utils/mimeTypes.js.map +1 -0
  149. package/utils/uploadFileToS3.d.ts +5 -1
  150. package/utils/uploadFileToS3.js +9 -12
  151. package/utils/uploadFileToS3.js.map +1 -0
@@ -0,0 +1,2 @@
1
+ import type { AssetDeliveryParams } from "./types";
2
+ export declare const assetDeliveryConfig: (params: AssetDeliveryParams) => (import("@webiny/api-file-manager").AssetDeliveryConfigModifierPlugin | (import("@webiny/handler").ModifyFastifyPlugin | import("@webiny/api-file-manager").AssetDeliveryConfigModifierPlugin)[])[];
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.assetDeliveryConfig = void 0;
7
+ var _apiFileManager = require("@webiny/api-file-manager");
8
+ var _clientS = require("@webiny/aws-sdk/client-s3");
9
+ var _S3AssetResolver = require("./s3/S3AssetResolver");
10
+ var _S3OutputStrategy = require("./s3/S3OutputStrategy");
11
+ var _SharpTransform = require("./s3/SharpTransform");
12
+ const assetDeliveryConfig = params => {
13
+ const bucket = process.env.S3_BUCKET;
14
+ const region = process.env.AWS_REGION;
15
+ const {
16
+ // Presigned URLs last 1 hour
17
+ presignedUrlTtl = 3600,
18
+ imageResizeWidths = [100, 300, 500, 750, 1000, 1500, 2500],
19
+ /**
20
+ * Even though Lambda's response payload limit is 6,291,556 bytes, we leave some room for the response envelope.
21
+ * 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.
22
+ */
23
+ assetStreamingMaxSize = 4718592,
24
+ ...baseParams
25
+ } = params;
26
+ return [
27
+ // Base asset delivery
28
+ (0, _apiFileManager.createAssetDelivery)(baseParams),
29
+ // S3 plugins
30
+ (0, _apiFileManager.createAssetDeliveryConfig)(config => {
31
+ const s3 = new _clientS.S3({
32
+ region
33
+ });
34
+ config.decorateAssetResolver(() => {
35
+ // This resolver loads file information from the `.metadata` file.
36
+ return new _S3AssetResolver.S3AssetResolver(s3, bucket);
37
+ });
38
+ config.decorateAssetOutputStrategy(() => {
39
+ return new _S3OutputStrategy.S3OutputStrategy(s3, bucket, presignedUrlTtl, assetStreamingMaxSize);
40
+ });
41
+ config.decorateAssetTransformationStrategy(() => {
42
+ return new _SharpTransform.SharpTransform({
43
+ s3,
44
+ bucket,
45
+ imageResizeWidths
46
+ });
47
+ });
48
+ })];
49
+ };
50
+ exports.assetDeliveryConfig = assetDeliveryConfig;
51
+
52
+ //# sourceMappingURL=assetDeliveryConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_apiFileManager","require","_clientS","_S3AssetResolver","_S3OutputStrategy","_SharpTransform","assetDeliveryConfig","params","bucket","process","env","S3_BUCKET","region","AWS_REGION","presignedUrlTtl","imageResizeWidths","assetStreamingMaxSize","baseParams","createBaseAssetDelivery","createAssetDeliveryConfig","config","s3","S3","decorateAssetResolver","S3AssetResolver","decorateAssetOutputStrategy","S3OutputStrategy","decorateAssetTransformationStrategy","SharpTransform","exports"],"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\";\nimport { S3AssetResolver } from \"~/assetDelivery/s3/S3AssetResolver\";\nimport { S3OutputStrategy } from \"~/assetDelivery/s3/S3OutputStrategy\";\nimport { SharpTransform } from \"~/assetDelivery/s3/SharpTransform\";\nimport type { AssetDeliveryParams } from \"~/assetDelivery/types\";\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 = [100, 300, 500, 750, 1000, 1500, 2500],\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 ...baseParams\n } = params;\n\n return [\n // Base asset delivery\n createBaseAssetDelivery(baseParams),\n // S3 plugins\n createAssetDeliveryConfig(config => {\n const s3 = new S3({ region });\n\n config.decorateAssetResolver(() => {\n // This resolver loads file information from the `.metadata` file.\n return new S3AssetResolver(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,IAAAA,eAAA,GAAAC,OAAA;AAIA,IAAAC,QAAA,GAAAD,OAAA;AACA,IAAAE,gBAAA,GAAAF,OAAA;AACA,IAAAG,iBAAA,GAAAH,OAAA;AACA,IAAAI,eAAA,GAAAJ,OAAA;AAGO,MAAMK,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,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC1D;AACR;AACA;AACA;IACQC,qBAAqB,GAAG,OAAO;IAC/B,GAAGC;EACP,CAAC,GAAGV,MAAM;EAEV,OAAO;EACH;EACA,IAAAW,mCAAuB,EAACD,UAAU,CAAC;EACnC;EACA,IAAAE,yCAAyB,EAACC,MAAM,IAAI;IAChC,MAAMC,EAAE,GAAG,IAAIC,WAAE,CAAC;MAAEV;IAAO,CAAC,CAAC;IAE7BQ,MAAM,CAACG,qBAAqB,CAAC,MAAM;MAC/B;MACA,OAAO,IAAIC,gCAAe,CAACH,EAAE,EAAEb,MAAM,CAAC;IAC1C,CAAC,CAAC;IAEFY,MAAM,CAACK,2BAA2B,CAAC,MAAM;MACrC,OAAO,IAAIC,kCAAgB,CAACL,EAAE,EAAEb,MAAM,EAAEM,eAAe,EAAEE,qBAAqB,CAAC;IACnF,CAAC,CAAC;IAEFI,MAAM,CAACO,mCAAmC,CAAC,MAAM;MAC7C,OAAO,IAAIC,8BAAc,CAAC;QAAEP,EAAE;QAAEb,MAAM;QAAEO;MAAkB,CAAC,CAAC;IAChE,CAAC,CAAC;EACN,CAAC,CAAC,CACL;AACL,CAAC;AAACc,OAAA,CAAAvB,mBAAA,GAAAA,mBAAA","ignoreList":[]}
@@ -0,0 +1,3 @@
1
+ import type { PluginFactory } from "@webiny/plugins/types";
2
+ import type { AssetDeliveryParams } from "./types";
3
+ export declare const createAssetDelivery: (params: AssetDeliveryParams) => PluginFactory[];
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createAssetDelivery = void 0;
7
+ var _apiFileManager = require("@webiny/api-file-manager");
8
+ var _threatDetection = require("./threatDetection");
9
+ const createAssetDelivery = params => {
10
+ return [
11
+ /**
12
+ * We only want to load this plugin in the context of the Asset Delivery Lambda function.
13
+ */
14
+ (0, _apiFileManager.createAssetDeliveryPluginLoader)(() => {
15
+ return import(/* webpackChunkName: "s3AssetDelivery" */"./assetDeliveryConfig").then(({
16
+ assetDeliveryConfig
17
+ }) => assetDeliveryConfig(params));
18
+ }),
19
+ /**
20
+ * We only want to load this plugin in the context of the Threat Detection Lambda function.
21
+ */
22
+ (0, _threatDetection.createThreatDetectionPluginLoader)(() => {
23
+ return import(/* webpackChunkName: "threatDetectionEventHandler" */"./threatDetection/createThreatDetectionEventHandler").then(({
24
+ createThreatDetectionEventHandler
25
+ }) => createThreatDetectionEventHandler());
26
+ })];
27
+ };
28
+ exports.createAssetDelivery = createAssetDelivery;
29
+
30
+ //# sourceMappingURL=createAssetDelivery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_apiFileManager","require","_threatDetection","createAssetDelivery","params","createAssetDeliveryPluginLoader","then","assetDeliveryConfig","createThreatDetectionPluginLoader","createThreatDetectionEventHandler","exports"],"sources":["createAssetDelivery.ts"],"sourcesContent":["import { createAssetDeliveryPluginLoader } from \"@webiny/api-file-manager\";\nimport type { PluginFactory } from \"@webiny/plugins/types\";\nimport { createThreatDetectionPluginLoader } from \"~/assetDelivery/threatDetection\";\nimport type { AssetDeliveryParams } from \"~/assetDelivery/types\";\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(/* webpackChunkName: \"s3AssetDelivery\" */ \"./assetDeliveryConfig\").then(\n ({ assetDeliveryConfig }) => assetDeliveryConfig(params)\n );\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\"\n ).then(({ createThreatDetectionEventHandler }) => createThreatDetectionEventHandler());\n })\n ];\n};\n"],"mappings":";;;;;;AAAA,IAAAA,eAAA,GAAAC,OAAA;AAEA,IAAAC,gBAAA,GAAAD,OAAA;AAGO,MAAME,mBAAmB,GAAIC,MAA2B,IAAsB;EACjF,OAAO;EACH;AACR;AACA;EACQ,IAAAC,+CAA+B,EAAC,MAAM;IAClC,OAAO,MAAM,CAAC,gEAAiE,CAAC,CAACC,IAAI,CACjF,CAAC;MAAEC;IAAoB,CAAC,KAAKA,mBAAmB,CAACH,MAAM,CAC3D,CAAC;EACL,CAAC,CAAC;EACF;AACR;AACA;EACQ,IAAAI,kDAAiC,EAAC,MAAM;IACpC,OAAO,MAAM,CACT,0GACJ,CAAC,CAACF,IAAI,CAAC,CAAC;MAAEG;IAAkC,CAAC,KAAKA,iCAAiC,CAAC,CAAC,CAAC;EAC1F,CAAC,CAAC,CACL;AACL,CAAC;AAACC,OAAA,CAAAP,mBAAA,GAAAA,mBAAA","ignoreList":[]}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * !! EXPERIMENTAL !!
3
+ *
4
+ * This plugin is used to enable delivery of assets derived from the original asset uploaded via the FM.
5
+ * These are usually files that go through background processing, video transcoding, image optimization, etc.
6
+ * Since these derived files are not managed through the File Manager, the default delivery mechanism will not be able
7
+ * to resolve them.
8
+ *
9
+ * With this plugin, we add a custom asset resolver, which tries to resolve the requested asset within the folder
10
+ * it's located in, and if found, it will simply be delivered back to the client, without any transformations applied.
11
+ */
12
+ export declare const createCustomAssetDelivery: () => import("@webiny/plugins/types").PluginFactory;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createCustomAssetDelivery = void 0;
7
+ var _apiFileManager = require("@webiny/api-file-manager");
8
+ /**
9
+ * !! EXPERIMENTAL !!
10
+ *
11
+ * This plugin is used to enable delivery of assets derived from the original asset uploaded via the FM.
12
+ * These are usually files that go through background processing, video transcoding, image optimization, etc.
13
+ * Since these derived files are not managed through the File Manager, the default delivery mechanism will not be able
14
+ * to resolve them.
15
+ *
16
+ * With this plugin, we add a custom asset resolver, which tries to resolve the requested asset within the folder
17
+ * it's located in, and if found, it will simply be delivered back to the client, without any transformations applied.
18
+ */
19
+ const createCustomAssetDelivery = () => {
20
+ return (0, _apiFileManager.createAssetDeliveryPluginLoader)(async () => {
21
+ return import(/* webpackChunkName: "customAssetDelivery" */"./customAssets/customAssetDeliveryConfig").then(({
22
+ customAssetDeliveryConfig
23
+ }) => customAssetDeliveryConfig());
24
+ });
25
+ };
26
+ exports.createCustomAssetDelivery = createCustomAssetDelivery;
27
+
28
+ //# sourceMappingURL=createCustomAssetDelivery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_apiFileManager","require","createCustomAssetDelivery","createAssetDeliveryPluginLoader","then","customAssetDeliveryConfig","exports"],"sources":["createCustomAssetDelivery.ts"],"sourcesContent":["import { createAssetDeliveryPluginLoader } from \"@webiny/api-file-manager\";\n\n/**\n * !! EXPERIMENTAL !!\n *\n * This plugin is used to enable delivery of assets derived from the original asset uploaded via the FM.\n * These are usually files that go through background processing, video transcoding, image optimization, etc.\n * Since these derived files are not managed through the File Manager, the default delivery mechanism will not be able\n * to resolve them.\n *\n * With this plugin, we add a custom asset resolver, which tries to resolve the requested asset within the folder\n * it's located in, and if found, it will simply be delivered back to the client, without any transformations applied.\n */\nexport const createCustomAssetDelivery = () => {\n return createAssetDeliveryPluginLoader(async () => {\n return import(\n /* webpackChunkName: \"customAssetDelivery\" */ \"./customAssets/customAssetDeliveryConfig\"\n ).then(({ customAssetDeliveryConfig }) => customAssetDeliveryConfig());\n });\n};\n"],"mappings":";;;;;;AAAA,IAAAA,eAAA,GAAAC,OAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,yBAAyB,GAAGA,CAAA,KAAM;EAC3C,OAAO,IAAAC,+CAA+B,EAAC,YAAY;IAC/C,OAAO,MAAM,CACT,uFACJ,CAAC,CAACC,IAAI,CAAC,CAAC;MAAEC;IAA0B,CAAC,KAAKA,yBAAyB,CAAC,CAAC,CAAC;EAC1E,CAAC,CAAC;AACN,CAAC;AAACC,OAAA,CAAAJ,yBAAA,GAAAA,yBAAA","ignoreList":[]}
@@ -0,0 +1,6 @@
1
+ import { Asset } from "@webiny/api-file-manager";
2
+ /**
3
+ * This class is used to differentiate between regular and custom assets.
4
+ */
5
+ export declare class CustomAsset extends Asset {
6
+ }
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.CustomAsset = void 0;
7
+ var _apiFileManager = require("@webiny/api-file-manager");
8
+ /**
9
+ * This class is used to differentiate between regular and custom assets.
10
+ */
11
+ class CustomAsset extends _apiFileManager.Asset {}
12
+ exports.CustomAsset = CustomAsset;
13
+
14
+ //# sourceMappingURL=CustomAsset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_apiFileManager","require","CustomAsset","Asset","exports"],"sources":["CustomAsset.ts"],"sourcesContent":["import { Asset } from \"@webiny/api-file-manager\";\n\n/**\n * This class is used to differentiate between regular and custom assets.\n */\nexport class CustomAsset extends Asset {}\n"],"mappings":";;;;;;AAAA,IAAAA,eAAA,GAAAC,OAAA;AAEA;AACA;AACA;AACO,MAAMC,WAAW,SAASC,qBAAK,CAAC;AAAEC,OAAA,CAAAF,WAAA,GAAAA,WAAA","ignoreList":[]}
@@ -0,0 +1,10 @@
1
+ import type { Asset, AssetProcessor, AssetRequest } from "@webiny/api-file-manager";
2
+ /**
3
+ * We don't want to run any kind of transformations on custom assets.
4
+ * Custom assets are usually pre-processed and ready to be delivered to the client.
5
+ */
6
+ export declare class CustomAssetProcessor implements AssetProcessor {
7
+ private assetProcessor;
8
+ constructor(assetProcessor: AssetProcessor);
9
+ process(assetRequest: AssetRequest, asset: Asset): Promise<Asset>;
10
+ }
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.CustomAssetProcessor = void 0;
7
+ var _CustomAsset = require("./CustomAsset");
8
+ /**
9
+ * We don't want to run any kind of transformations on custom assets.
10
+ * Custom assets are usually pre-processed and ready to be delivered to the client.
11
+ */
12
+ class CustomAssetProcessor {
13
+ constructor(assetProcessor) {
14
+ this.assetProcessor = assetProcessor;
15
+ }
16
+ async process(assetRequest, asset) {
17
+ if (asset instanceof _CustomAsset.CustomAsset) {
18
+ return asset;
19
+ }
20
+ return this.assetProcessor.process(assetRequest, asset);
21
+ }
22
+ }
23
+ exports.CustomAssetProcessor = CustomAssetProcessor;
24
+
25
+ //# sourceMappingURL=CustomAssetProcessor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_CustomAsset","require","CustomAssetProcessor","constructor","assetProcessor","process","assetRequest","asset","CustomAsset","exports"],"sources":["CustomAssetProcessor.ts"],"sourcesContent":["import type { Asset, AssetProcessor, AssetRequest } from \"@webiny/api-file-manager\";\nimport { CustomAsset } from \"./CustomAsset\";\n\n/**\n * We don't want to run any kind of transformations on custom assets.\n * Custom assets are usually pre-processed and ready to be delivered to the client.\n */\nexport class CustomAssetProcessor implements AssetProcessor {\n private assetProcessor: AssetProcessor;\n\n constructor(assetProcessor: AssetProcessor) {\n this.assetProcessor = assetProcessor;\n }\n\n async process(assetRequest: AssetRequest, asset: Asset): Promise<Asset> {\n if (asset instanceof CustomAsset) {\n return asset;\n }\n\n return this.assetProcessor.process(assetRequest, asset);\n }\n}\n"],"mappings":";;;;;;AACA,IAAAA,YAAA,GAAAC,OAAA;AAEA;AACA;AACA;AACA;AACO,MAAMC,oBAAoB,CAA2B;EAGxDC,WAAWA,CAACC,cAA8B,EAAE;IACxC,IAAI,CAACA,cAAc,GAAGA,cAAc;EACxC;EAEA,MAAMC,OAAOA,CAACC,YAA0B,EAAEC,KAAY,EAAkB;IACpE,IAAIA,KAAK,YAAYC,wBAAW,EAAE;MAC9B,OAAOD,KAAK;IAChB;IAEA,OAAO,IAAI,CAACH,cAAc,CAACC,OAAO,CAACC,YAAY,EAAEC,KAAK,CAAC;EAC3D;AACJ;AAACE,OAAA,CAAAP,oBAAA,GAAAA,oBAAA","ignoreList":[]}
@@ -0,0 +1,15 @@
1
+ import type { S3 } from "@webiny/aws-sdk/client-s3";
2
+ import type { Asset, AssetRequest, AssetResolver } from "@webiny/api-file-manager";
3
+ /**
4
+ * This asset resolver kicks in only if the default resolution fails to resolve an asset.
5
+ * The goal of this resolver is to fetch .metadata from the original file that was uploaded via th File Manager.
6
+ */
7
+ export declare class S3CustomAssetResolver implements AssetResolver {
8
+ private readonly s3;
9
+ private readonly bucket;
10
+ private assetResolver;
11
+ constructor(s3: S3, bucket: string, assetResolver: AssetResolver);
12
+ resolve(request: AssetRequest): Promise<Asset | undefined>;
13
+ private findMetadata;
14
+ private getFileAttributes;
15
+ }
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.S3CustomAssetResolver = void 0;
8
+ var _path = _interopRequireDefault(require("path"));
9
+ var _S3AssetMetadataReader = require("../s3/S3AssetMetadataReader");
10
+ var _S3ContentsReader = require("../s3/S3ContentsReader");
11
+ var _CustomAsset = require("./CustomAsset");
12
+ /**
13
+ * This asset resolver kicks in only if the default resolution fails to resolve an asset.
14
+ * The goal of this resolver is to fetch .metadata from the original file that was uploaded via th File Manager.
15
+ */
16
+ class S3CustomAssetResolver {
17
+ constructor(s3, bucket, assetResolver) {
18
+ this.assetResolver = assetResolver;
19
+ this.s3 = s3;
20
+ this.bucket = bucket;
21
+ }
22
+ async resolve(request) {
23
+ const resolvedAsset = await this.assetResolver.resolve(request);
24
+ if (resolvedAsset) {
25
+ return resolvedAsset;
26
+ }
27
+ try {
28
+ const originalFileMetadataKey = await this.findMetadata(request);
29
+ if (!originalFileMetadataKey) {
30
+ return undefined;
31
+ }
32
+
33
+ // We need to fetch the actual size and content type of the file.
34
+ const attrs = await this.getFileAttributes(request.getKey());
35
+ if (!attrs) {
36
+ return undefined;
37
+ }
38
+ const metadataReader = new _S3AssetMetadataReader.S3AssetMetadataReader(this.s3, this.bucket);
39
+ const metadata = await metadataReader.getMetadata(originalFileMetadataKey.replace(".metadata", ""));
40
+ const asset = new _CustomAsset.CustomAsset({
41
+ // These attributes do not change between the original and derived files.
42
+ id: metadata.id,
43
+ tenant: metadata.tenant,
44
+ locale: metadata.locale,
45
+ // Assign the size and content type of the requested file.
46
+ size: attrs.size,
47
+ contentType: attrs.contentType,
48
+ key: request.getKey()
49
+ });
50
+ asset.setContentsReader(new _S3ContentsReader.S3ContentsReader(this.s3, this.bucket));
51
+ return asset;
52
+ } catch (error) {
53
+ console.error(error);
54
+ return undefined;
55
+ }
56
+ }
57
+
58
+ // https://d1s78zhy5i2noq.cloudfront.net/files/65a99721c20390000869e3d3/9l9iafhgn-17.jpeg
59
+
60
+ async findMetadata(request) {
61
+ const requestFolder = _path.default.dirname(request.getKey());
62
+ const assetList = await this.s3.listObjects({
63
+ Bucket: this.bucket,
64
+ Prefix: requestFolder + "/"
65
+ });
66
+ if (!assetList.Contents) {
67
+ return undefined;
68
+ }
69
+
70
+ // We assume that there's only one asset with the `.metadata`, and that's the original file.
71
+ const metadata = assetList.Contents.find(file => file.Key?.endsWith(".metadata"));
72
+ return metadata ? metadata.Key : undefined;
73
+ }
74
+ async getFileAttributes(key) {
75
+ const head = await this.s3.headObject({
76
+ Bucket: this.bucket,
77
+ Key: key
78
+ });
79
+ if (!head) {
80
+ return undefined;
81
+ }
82
+ return {
83
+ size: head.ContentLength || 0,
84
+ contentType: head.ContentType || ""
85
+ };
86
+ }
87
+ }
88
+ exports.S3CustomAssetResolver = S3CustomAssetResolver;
89
+
90
+ //# sourceMappingURL=S3CustomAssetResolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_path","_interopRequireDefault","require","_S3AssetMetadataReader","_S3ContentsReader","_CustomAsset","S3CustomAssetResolver","constructor","s3","bucket","assetResolver","resolve","request","resolvedAsset","originalFileMetadataKey","findMetadata","undefined","attrs","getFileAttributes","getKey","metadataReader","S3AssetMetadataReader","metadata","getMetadata","replace","asset","CustomAsset","id","tenant","locale","size","contentType","key","setContentsReader","S3ContentsReader","error","console","requestFolder","path","dirname","assetList","listObjects","Bucket","Prefix","Contents","find","file","Key","endsWith","head","headObject","ContentLength","ContentType","exports"],"sources":["S3CustomAssetResolver.ts"],"sourcesContent":["import path from \"path\";\nimport type { S3 } from \"@webiny/aws-sdk/client-s3\";\nimport type { Asset, AssetRequest, AssetResolver } from \"@webiny/api-file-manager\";\nimport { S3AssetMetadataReader } from \"~/assetDelivery/s3/S3AssetMetadataReader\";\nimport { S3ContentsReader } from \"~/assetDelivery/s3/S3ContentsReader\";\nimport { CustomAsset } from \"./CustomAsset\";\n\n/**\n * This asset resolver kicks in only if the default resolution fails to resolve an asset.\n * The goal of this resolver is to fetch .metadata from the original file that was uploaded via th File Manager.\n */\nexport class S3CustomAssetResolver implements AssetResolver {\n private readonly s3: S3;\n private readonly bucket: string;\n private assetResolver: AssetResolver;\n\n constructor(s3: S3, bucket: string, assetResolver: AssetResolver) {\n this.assetResolver = assetResolver;\n this.s3 = s3;\n this.bucket = bucket;\n }\n\n async resolve(request: AssetRequest): Promise<Asset | undefined> {\n const resolvedAsset = await this.assetResolver.resolve(request);\n\n if (resolvedAsset) {\n return resolvedAsset;\n }\n\n try {\n const originalFileMetadataKey = await this.findMetadata(request);\n\n if (!originalFileMetadataKey) {\n return undefined;\n }\n\n // We need to fetch the actual size and content type of the file.\n const attrs = await this.getFileAttributes(request.getKey());\n\n if (!attrs) {\n return undefined;\n }\n\n const metadataReader = new S3AssetMetadataReader(this.s3, this.bucket);\n const metadata = await metadataReader.getMetadata(\n originalFileMetadataKey.replace(\".metadata\", \"\")\n );\n\n const asset = new CustomAsset({\n // These attributes do not change between the original and derived files.\n id: metadata.id,\n tenant: metadata.tenant,\n locale: metadata.locale,\n // Assign the size and content type of the requested file.\n size: attrs.size,\n contentType: attrs.contentType,\n key: request.getKey()\n });\n\n asset.setContentsReader(new S3ContentsReader(this.s3, this.bucket));\n\n return asset;\n } catch (error) {\n console.error(error);\n return undefined;\n }\n }\n\n // https://d1s78zhy5i2noq.cloudfront.net/files/65a99721c20390000869e3d3/9l9iafhgn-17.jpeg\n\n private async findMetadata(request: AssetRequest) {\n const requestFolder = path.dirname(request.getKey());\n\n const assetList = await this.s3.listObjects({\n Bucket: this.bucket,\n Prefix: requestFolder + \"/\"\n });\n\n if (!assetList.Contents) {\n return undefined;\n }\n\n // We assume that there's only one asset with the `.metadata`, and that's the original file.\n const metadata = assetList.Contents.find(file => file.Key?.endsWith(\".metadata\"));\n\n return metadata ? metadata.Key : undefined;\n }\n\n private async getFileAttributes(key: string) {\n const head = await this.s3.headObject({\n Bucket: this.bucket,\n Key: key\n });\n\n if (!head) {\n return undefined;\n }\n\n return {\n size: head.ContentLength || 0,\n contentType: head.ContentType || \"\"\n };\n }\n}\n"],"mappings":";;;;;;;AAAA,IAAAA,KAAA,GAAAC,sBAAA,CAAAC,OAAA;AAGA,IAAAC,sBAAA,GAAAD,OAAA;AACA,IAAAE,iBAAA,GAAAF,OAAA;AACA,IAAAG,YAAA,GAAAH,OAAA;AAEA;AACA;AACA;AACA;AACO,MAAMI,qBAAqB,CAA0B;EAKxDC,WAAWA,CAACC,EAAM,EAAEC,MAAc,EAAEC,aAA4B,EAAE;IAC9D,IAAI,CAACA,aAAa,GAAGA,aAAa;IAClC,IAAI,CAACF,EAAE,GAAGA,EAAE;IACZ,IAAI,CAACC,MAAM,GAAGA,MAAM;EACxB;EAEA,MAAME,OAAOA,CAACC,OAAqB,EAA8B;IAC7D,MAAMC,aAAa,GAAG,MAAM,IAAI,CAACH,aAAa,CAACC,OAAO,CAACC,OAAO,CAAC;IAE/D,IAAIC,aAAa,EAAE;MACf,OAAOA,aAAa;IACxB;IAEA,IAAI;MACA,MAAMC,uBAAuB,GAAG,MAAM,IAAI,CAACC,YAAY,CAACH,OAAO,CAAC;MAEhE,IAAI,CAACE,uBAAuB,EAAE;QAC1B,OAAOE,SAAS;MACpB;;MAEA;MACA,MAAMC,KAAK,GAAG,MAAM,IAAI,CAACC,iBAAiB,CAACN,OAAO,CAACO,MAAM,CAAC,CAAC,CAAC;MAE5D,IAAI,CAACF,KAAK,EAAE;QACR,OAAOD,SAAS;MACpB;MAEA,MAAMI,cAAc,GAAG,IAAIC,4CAAqB,CAAC,IAAI,CAACb,EAAE,EAAE,IAAI,CAACC,MAAM,CAAC;MACtE,MAAMa,QAAQ,GAAG,MAAMF,cAAc,CAACG,WAAW,CAC7CT,uBAAuB,CAACU,OAAO,CAAC,WAAW,EAAE,EAAE,CACnD,CAAC;MAED,MAAMC,KAAK,GAAG,IAAIC,wBAAW,CAAC;QAC1B;QACAC,EAAE,EAAEL,QAAQ,CAACK,EAAE;QACfC,MAAM,EAAEN,QAAQ,CAACM,MAAM;QACvBC,MAAM,EAAEP,QAAQ,CAACO,MAAM;QACvB;QACAC,IAAI,EAAEb,KAAK,CAACa,IAAI;QAChBC,WAAW,EAAEd,KAAK,CAACc,WAAW;QAC9BC,GAAG,EAAEpB,OAAO,CAACO,MAAM,CAAC;MACxB,CAAC,CAAC;MAEFM,KAAK,CAACQ,iBAAiB,CAAC,IAAIC,kCAAgB,CAAC,IAAI,CAAC1B,EAAE,EAAE,IAAI,CAACC,MAAM,CAAC,CAAC;MAEnE,OAAOgB,KAAK;IAChB,CAAC,CAAC,OAAOU,KAAK,EAAE;MACZC,OAAO,CAACD,KAAK,CAACA,KAAK,CAAC;MACpB,OAAOnB,SAAS;IACpB;EACJ;;EAEA;;EAEA,MAAcD,YAAYA,CAACH,OAAqB,EAAE;IAC9C,MAAMyB,aAAa,GAAGC,aAAI,CAACC,OAAO,CAAC3B,OAAO,CAACO,MAAM,CAAC,CAAC,CAAC;IAEpD,MAAMqB,SAAS,GAAG,MAAM,IAAI,CAAChC,EAAE,CAACiC,WAAW,CAAC;MACxCC,MAAM,EAAE,IAAI,CAACjC,MAAM;MACnBkC,MAAM,EAAEN,aAAa,GAAG;IAC5B,CAAC,CAAC;IAEF,IAAI,CAACG,SAAS,CAACI,QAAQ,EAAE;MACrB,OAAO5B,SAAS;IACpB;;IAEA;IACA,MAAMM,QAAQ,GAAGkB,SAAS,CAACI,QAAQ,CAACC,IAAI,CAACC,IAAI,IAAIA,IAAI,CAACC,GAAG,EAAEC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAEjF,OAAO1B,QAAQ,GAAGA,QAAQ,CAACyB,GAAG,GAAG/B,SAAS;EAC9C;EAEA,MAAcE,iBAAiBA,CAACc,GAAW,EAAE;IACzC,MAAMiB,IAAI,GAAG,MAAM,IAAI,CAACzC,EAAE,CAAC0C,UAAU,CAAC;MAClCR,MAAM,EAAE,IAAI,CAACjC,MAAM;MACnBsC,GAAG,EAAEf;IACT,CAAC,CAAC;IAEF,IAAI,CAACiB,IAAI,EAAE;MACP,OAAOjC,SAAS;IACpB;IAEA,OAAO;MACHc,IAAI,EAAEmB,IAAI,CAACE,aAAa,IAAI,CAAC;MAC7BpB,WAAW,EAAEkB,IAAI,CAACG,WAAW,IAAI;IACrC,CAAC;EACL;AACJ;AAACC,OAAA,CAAA/C,qBAAA,GAAAA,qBAAA","ignoreList":[]}
@@ -0,0 +1 @@
1
+ export declare const customAssetDeliveryConfig: () => import("@webiny/api-file-manager").AssetDeliveryConfigModifierPlugin;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.customAssetDeliveryConfig = void 0;
7
+ var _apiFileManager = require("@webiny/api-file-manager");
8
+ var _clientS = require("@webiny/aws-sdk/client-s3");
9
+ var _S3CustomAssetResolver = require("./S3CustomAssetResolver");
10
+ var _CustomAssetProcessor = require("./CustomAssetProcessor");
11
+ const customAssetDeliveryConfig = () => {
12
+ return (0, _apiFileManager.createAssetDeliveryConfig)(config => {
13
+ config.decorateAssetResolver(({
14
+ assetResolver
15
+ }) => {
16
+ const s3 = new _clientS.S3({
17
+ region: process.env.AWS_REGION
18
+ });
19
+ return new _S3CustomAssetResolver.S3CustomAssetResolver(s3, String(process.env.S3_BUCKET), assetResolver);
20
+ });
21
+ config.decorateAssetProcessor(({
22
+ assetProcessor
23
+ }) => {
24
+ return new _CustomAssetProcessor.CustomAssetProcessor(assetProcessor);
25
+ });
26
+ });
27
+ };
28
+ exports.customAssetDeliveryConfig = customAssetDeliveryConfig;
29
+
30
+ //# sourceMappingURL=customAssetDeliveryConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_apiFileManager","require","_clientS","_S3CustomAssetResolver","_CustomAssetProcessor","customAssetDeliveryConfig","createAssetDeliveryConfig","config","decorateAssetResolver","assetResolver","s3","S3","region","process","env","AWS_REGION","S3CustomAssetResolver","String","S3_BUCKET","decorateAssetProcessor","assetProcessor","CustomAssetProcessor","exports"],"sources":["customAssetDeliveryConfig.ts"],"sourcesContent":["import { createAssetDeliveryConfig } from \"@webiny/api-file-manager\";\nimport { S3 } from \"@webiny/aws-sdk/client-s3\";\nimport { S3CustomAssetResolver } from \"./S3CustomAssetResolver\";\nimport { CustomAssetProcessor } from \"~/assetDelivery/customAssets/CustomAssetProcessor\";\n\nexport const customAssetDeliveryConfig = () => {\n return createAssetDeliveryConfig(config => {\n config.decorateAssetResolver(({ assetResolver }) => {\n const s3 = new S3({ region: process.env.AWS_REGION });\n return new S3CustomAssetResolver(s3, String(process.env.S3_BUCKET), assetResolver);\n });\n\n config.decorateAssetProcessor(({ assetProcessor }) => {\n return new CustomAssetProcessor(assetProcessor);\n });\n });\n};\n"],"mappings":";;;;;;AAAA,IAAAA,eAAA,GAAAC,OAAA;AACA,IAAAC,QAAA,GAAAD,OAAA;AACA,IAAAE,sBAAA,GAAAF,OAAA;AACA,IAAAG,qBAAA,GAAAH,OAAA;AAEO,MAAMI,yBAAyB,GAAGA,CAAA,KAAM;EAC3C,OAAO,IAAAC,yCAAyB,EAACC,MAAM,IAAI;IACvCA,MAAM,CAACC,qBAAqB,CAAC,CAAC;MAAEC;IAAc,CAAC,KAAK;MAChD,MAAMC,EAAE,GAAG,IAAIC,WAAE,CAAC;QAAEC,MAAM,EAAEC,OAAO,CAACC,GAAG,CAACC;MAAW,CAAC,CAAC;MACrD,OAAO,IAAIC,4CAAqB,CAACN,EAAE,EAAEO,MAAM,CAACJ,OAAO,CAACC,GAAG,CAACI,SAAS,CAAC,EAAET,aAAa,CAAC;IACtF,CAAC,CAAC;IAEFF,MAAM,CAACY,sBAAsB,CAAC,CAAC;MAAEC;IAAe,CAAC,KAAK;MAClD,OAAO,IAAIC,0CAAoB,CAACD,cAAc,CAAC;IACnD,CAAC,CAAC;EACN,CAAC,CAAC;AACN,CAAC;AAACE,OAAA,CAAAjB,yBAAA,GAAAA,yBAAA","ignoreList":[]}
@@ -0,0 +1,9 @@
1
+ export { S3AssetResolver } from "./s3/S3AssetResolver";
2
+ export { S3AssetMetadataReader } from "./s3/S3AssetMetadataReader";
3
+ export { S3OutputStrategy } from "./s3/S3OutputStrategy";
4
+ export { S3ContentsReader } from "./s3/S3ContentsReader";
5
+ export { S3ErrorAssetReply } from "./s3/S3ErrorAssetReply";
6
+ export { S3RedirectAssetReply } from "./s3/S3RedirectAssetReply";
7
+ export { S3StreamAssetReply } from "./s3/S3StreamAssetReply";
8
+ export { SharpTransform } from "./s3/SharpTransform";
9
+ export { CallableContentsReader } from "./s3/transformation/CallableContentsReader";
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "CallableContentsReader", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _CallableContentsReader.CallableContentsReader;
10
+ }
11
+ });
12
+ Object.defineProperty(exports, "S3AssetMetadataReader", {
13
+ enumerable: true,
14
+ get: function () {
15
+ return _S3AssetMetadataReader.S3AssetMetadataReader;
16
+ }
17
+ });
18
+ Object.defineProperty(exports, "S3AssetResolver", {
19
+ enumerable: true,
20
+ get: function () {
21
+ return _S3AssetResolver.S3AssetResolver;
22
+ }
23
+ });
24
+ Object.defineProperty(exports, "S3ContentsReader", {
25
+ enumerable: true,
26
+ get: function () {
27
+ return _S3ContentsReader.S3ContentsReader;
28
+ }
29
+ });
30
+ Object.defineProperty(exports, "S3ErrorAssetReply", {
31
+ enumerable: true,
32
+ get: function () {
33
+ return _S3ErrorAssetReply.S3ErrorAssetReply;
34
+ }
35
+ });
36
+ Object.defineProperty(exports, "S3OutputStrategy", {
37
+ enumerable: true,
38
+ get: function () {
39
+ return _S3OutputStrategy.S3OutputStrategy;
40
+ }
41
+ });
42
+ Object.defineProperty(exports, "S3RedirectAssetReply", {
43
+ enumerable: true,
44
+ get: function () {
45
+ return _S3RedirectAssetReply.S3RedirectAssetReply;
46
+ }
47
+ });
48
+ Object.defineProperty(exports, "S3StreamAssetReply", {
49
+ enumerable: true,
50
+ get: function () {
51
+ return _S3StreamAssetReply.S3StreamAssetReply;
52
+ }
53
+ });
54
+ Object.defineProperty(exports, "SharpTransform", {
55
+ enumerable: true,
56
+ get: function () {
57
+ return _SharpTransform.SharpTransform;
58
+ }
59
+ });
60
+ var _S3AssetResolver = require("./s3/S3AssetResolver");
61
+ var _S3AssetMetadataReader = require("./s3/S3AssetMetadataReader");
62
+ var _S3OutputStrategy = require("./s3/S3OutputStrategy");
63
+ var _S3ContentsReader = require("./s3/S3ContentsReader");
64
+ var _S3ErrorAssetReply = require("./s3/S3ErrorAssetReply");
65
+ var _S3RedirectAssetReply = require("./s3/S3RedirectAssetReply");
66
+ var _S3StreamAssetReply = require("./s3/S3StreamAssetReply");
67
+ var _SharpTransform = require("./s3/SharpTransform");
68
+ var _CallableContentsReader = require("./s3/transformation/CallableContentsReader");
69
+
70
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_S3AssetResolver","require","_S3AssetMetadataReader","_S3OutputStrategy","_S3ContentsReader","_S3ErrorAssetReply","_S3RedirectAssetReply","_S3StreamAssetReply","_SharpTransform","_CallableContentsReader"],"sources":["index.ts"],"sourcesContent":["export { S3AssetResolver } from \"./s3/S3AssetResolver\";\nexport { S3AssetMetadataReader } from \"./s3/S3AssetMetadataReader\";\nexport { S3OutputStrategy } from \"./s3/S3OutputStrategy\";\nexport { S3ContentsReader } from \"./s3/S3ContentsReader\";\nexport { S3ErrorAssetReply } from \"./s3/S3ErrorAssetReply\";\nexport { S3RedirectAssetReply } from \"./s3/S3RedirectAssetReply\";\nexport { S3StreamAssetReply } from \"./s3/S3StreamAssetReply\";\nexport { SharpTransform } from \"./s3/SharpTransform\";\nexport { CallableContentsReader } from \"./s3/transformation/CallableContentsReader\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,gBAAA,GAAAC,OAAA;AACA,IAAAC,sBAAA,GAAAD,OAAA;AACA,IAAAE,iBAAA,GAAAF,OAAA;AACA,IAAAG,iBAAA,GAAAH,OAAA;AACA,IAAAI,kBAAA,GAAAJ,OAAA;AACA,IAAAK,qBAAA,GAAAL,OAAA;AACA,IAAAM,mBAAA,GAAAN,OAAA;AACA,IAAAO,eAAA,GAAAP,OAAA;AACA,IAAAQ,uBAAA,GAAAR,OAAA","ignoreList":[]}
@@ -0,0 +1,15 @@
1
+ import type { S3 } from "@webiny/aws-sdk/client-s3";
2
+ interface AssetMetadata {
3
+ id: string;
4
+ tenant: string;
5
+ locale: string;
6
+ size: number;
7
+ contentType: string;
8
+ }
9
+ export declare class S3AssetMetadataReader {
10
+ private readonly s3;
11
+ private readonly bucket;
12
+ constructor(s3: S3, bucket: string);
13
+ getMetadata(key: string): Promise<AssetMetadata>;
14
+ }
15
+ export {};
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.S3AssetMetadataReader = void 0;
7
+ class S3AssetMetadataReader {
8
+ constructor(s3, bucket) {
9
+ this.bucket = bucket;
10
+ this.s3 = s3;
11
+ }
12
+ async getMetadata(key) {
13
+ const metadataKey = `${key}.metadata`;
14
+ console.log("Reading metadata", metadataKey);
15
+ const {
16
+ Body
17
+ } = await this.s3.getObject({
18
+ Bucket: this.bucket,
19
+ Key: metadataKey
20
+ });
21
+ if (!Body) {
22
+ throw Error(`Missing or corrupted ${metadataKey} file!`);
23
+ }
24
+ const metadata = JSON.parse(await Body.transformToString());
25
+ return {
26
+ id: metadata.id,
27
+ tenant: metadata.tenant,
28
+ locale: metadata.locale,
29
+ size: metadata.size,
30
+ contentType: metadata.contentType
31
+ };
32
+ }
33
+ }
34
+ exports.S3AssetMetadataReader = S3AssetMetadataReader;
35
+
36
+ //# sourceMappingURL=S3AssetMetadataReader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["S3AssetMetadataReader","constructor","s3","bucket","getMetadata","key","metadataKey","console","log","Body","getObject","Bucket","Key","Error","metadata","JSON","parse","transformToString","id","tenant","locale","size","contentType","exports"],"sources":["S3AssetMetadataReader.ts"],"sourcesContent":["import type { S3 } from \"@webiny/aws-sdk/client-s3\";\n\ninterface AssetMetadata {\n id: string;\n tenant: string;\n locale: string;\n size: number;\n contentType: string;\n}\n\nexport class S3AssetMetadataReader {\n private readonly s3: S3;\n private readonly bucket: string;\n\n constructor(s3: S3, bucket: string) {\n this.bucket = bucket;\n this.s3 = s3;\n }\n\n async getMetadata(key: string): Promise<AssetMetadata> {\n const metadataKey = `${key}.metadata`;\n\n console.log(\"Reading metadata\", metadataKey);\n\n const { Body } = await this.s3.getObject({\n Bucket: this.bucket,\n Key: metadataKey\n });\n\n if (!Body) {\n throw Error(`Missing or corrupted ${metadataKey} file!`);\n }\n\n const metadata = JSON.parse(await Body.transformToString());\n\n return {\n id: metadata.id,\n tenant: metadata.tenant,\n locale: metadata.locale,\n size: metadata.size,\n contentType: metadata.contentType\n };\n }\n}\n"],"mappings":";;;;;;AAUO,MAAMA,qBAAqB,CAAC;EAI/BC,WAAWA,CAACC,EAAM,EAAEC,MAAc,EAAE;IAChC,IAAI,CAACA,MAAM,GAAGA,MAAM;IACpB,IAAI,CAACD,EAAE,GAAGA,EAAE;EAChB;EAEA,MAAME,WAAWA,CAACC,GAAW,EAA0B;IACnD,MAAMC,WAAW,GAAG,GAAGD,GAAG,WAAW;IAErCE,OAAO,CAACC,GAAG,CAAC,kBAAkB,EAAEF,WAAW,CAAC;IAE5C,MAAM;MAAEG;IAAK,CAAC,GAAG,MAAM,IAAI,CAACP,EAAE,CAACQ,SAAS,CAAC;MACrCC,MAAM,EAAE,IAAI,CAACR,MAAM;MACnBS,GAAG,EAAEN;IACT,CAAC,CAAC;IAEF,IAAI,CAACG,IAAI,EAAE;MACP,MAAMI,KAAK,CAAC,wBAAwBP,WAAW,QAAQ,CAAC;IAC5D;IAEA,MAAMQ,QAAQ,GAAGC,IAAI,CAACC,KAAK,CAAC,MAAMP,IAAI,CAACQ,iBAAiB,CAAC,CAAC,CAAC;IAE3D,OAAO;MACHC,EAAE,EAAEJ,QAAQ,CAACI,EAAE;MACfC,MAAM,EAAEL,QAAQ,CAACK,MAAM;MACvBC,MAAM,EAAEN,QAAQ,CAACM,MAAM;MACvBC,IAAI,EAAEP,QAAQ,CAACO,IAAI;MACnBC,WAAW,EAAER,QAAQ,CAACQ;IAC1B,CAAC;EACL;AACJ;AAACC,OAAA,CAAAvB,qBAAA,GAAAA,qBAAA","ignoreList":[]}
@@ -0,0 +1,9 @@
1
+ import type { S3 } from "@webiny/aws-sdk/client-s3";
2
+ import type { AssetRequest, AssetResolver } from "@webiny/api-file-manager";
3
+ import { Asset } from "@webiny/api-file-manager";
4
+ export declare class S3AssetResolver implements AssetResolver {
5
+ private readonly s3;
6
+ private readonly bucket;
7
+ constructor(s3: S3, bucket: string);
8
+ resolve(request: AssetRequest): Promise<Asset | undefined>;
9
+ }
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.S3AssetResolver = void 0;
7
+ var _apiFileManager = require("@webiny/api-file-manager");
8
+ var _S3AssetMetadataReader = require("./S3AssetMetadataReader");
9
+ var _S3ContentsReader = require("./S3ContentsReader");
10
+ class S3AssetResolver {
11
+ constructor(s3, bucket) {
12
+ this.s3 = s3;
13
+ this.bucket = bucket;
14
+ }
15
+ async resolve(request) {
16
+ try {
17
+ const metadataReader = new _S3AssetMetadataReader.S3AssetMetadataReader(this.s3, this.bucket);
18
+ const metadata = await metadataReader.getMetadata(request.getKey());
19
+ const asset = new _apiFileManager.Asset({
20
+ id: metadata.id,
21
+ tenant: metadata.tenant,
22
+ locale: metadata.locale,
23
+ size: metadata.size,
24
+ contentType: metadata.contentType,
25
+ key: request.getKey()
26
+ });
27
+ asset.setContentsReader(new _S3ContentsReader.S3ContentsReader(this.s3, this.bucket));
28
+ return asset;
29
+ } catch (error) {
30
+ console.log(`S3AssetResolver failed to read metadata: ${error.message}`);
31
+ return undefined;
32
+ }
33
+ }
34
+ }
35
+ exports.S3AssetResolver = S3AssetResolver;
36
+
37
+ //# sourceMappingURL=S3AssetResolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_apiFileManager","require","_S3AssetMetadataReader","_S3ContentsReader","S3AssetResolver","constructor","s3","bucket","resolve","request","metadataReader","S3AssetMetadataReader","metadata","getMetadata","getKey","asset","Asset","id","tenant","locale","size","contentType","key","setContentsReader","S3ContentsReader","error","console","log","message","undefined","exports"],"sources":["S3AssetResolver.ts"],"sourcesContent":["import type { S3 } from \"@webiny/aws-sdk/client-s3\";\nimport type { AssetRequest, AssetResolver } from \"@webiny/api-file-manager\";\nimport { Asset } from \"@webiny/api-file-manager\";\nimport { S3AssetMetadataReader } from \"./S3AssetMetadataReader\";\nimport { S3ContentsReader } from \"./S3ContentsReader\";\n\nexport class S3AssetResolver implements AssetResolver {\n private readonly 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 resolve(request: AssetRequest): Promise<Asset | undefined> {\n try {\n const metadataReader = new S3AssetMetadataReader(this.s3, this.bucket);\n const metadata = await metadataReader.getMetadata(request.getKey());\n\n const asset = new Asset({\n id: metadata.id,\n tenant: metadata.tenant,\n locale: metadata.locale,\n size: metadata.size,\n contentType: metadata.contentType,\n key: request.getKey()\n });\n\n asset.setContentsReader(new S3ContentsReader(this.s3, this.bucket));\n\n return asset;\n } catch (error) {\n console.log(`S3AssetResolver failed to read metadata: ${error.message}`);\n return undefined;\n }\n }\n}\n"],"mappings":";;;;;;AAEA,IAAAA,eAAA,GAAAC,OAAA;AACA,IAAAC,sBAAA,GAAAD,OAAA;AACA,IAAAE,iBAAA,GAAAF,OAAA;AAEO,MAAMG,eAAe,CAA0B;EAIlDC,WAAWA,CAACC,EAAM,EAAEC,MAAc,EAAE;IAChC,IAAI,CAACD,EAAE,GAAGA,EAAE;IACZ,IAAI,CAACC,MAAM,GAAGA,MAAM;EACxB;EAEA,MAAMC,OAAOA,CAACC,OAAqB,EAA8B;IAC7D,IAAI;MACA,MAAMC,cAAc,GAAG,IAAIC,4CAAqB,CAAC,IAAI,CAACL,EAAE,EAAE,IAAI,CAACC,MAAM,CAAC;MACtE,MAAMK,QAAQ,GAAG,MAAMF,cAAc,CAACG,WAAW,CAACJ,OAAO,CAACK,MAAM,CAAC,CAAC,CAAC;MAEnE,MAAMC,KAAK,GAAG,IAAIC,qBAAK,CAAC;QACpBC,EAAE,EAAEL,QAAQ,CAACK,EAAE;QACfC,MAAM,EAAEN,QAAQ,CAACM,MAAM;QACvBC,MAAM,EAAEP,QAAQ,CAACO,MAAM;QACvBC,IAAI,EAAER,QAAQ,CAACQ,IAAI;QACnBC,WAAW,EAAET,QAAQ,CAACS,WAAW;QACjCC,GAAG,EAAEb,OAAO,CAACK,MAAM,CAAC;MACxB,CAAC,CAAC;MAEFC,KAAK,CAACQ,iBAAiB,CAAC,IAAIC,kCAAgB,CAAC,IAAI,CAAClB,EAAE,EAAE,IAAI,CAACC,MAAM,CAAC,CAAC;MAEnE,OAAOQ,KAAK;IAChB,CAAC,CAAC,OAAOU,KAAK,EAAE;MACZC,OAAO,CAACC,GAAG,CAAC,4CAA4CF,KAAK,CAACG,OAAO,EAAE,CAAC;MACxE,OAAOC,SAAS;IACpB;EACJ;AACJ;AAACC,OAAA,CAAA1B,eAAA,GAAAA,eAAA","ignoreList":[]}
@@ -0,0 +1,10 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ import type { S3 } from "@webiny/aws-sdk/client-s3";
4
+ import type { Asset, AssetContentsReader } from "@webiny/api-file-manager";
5
+ export declare class S3ContentsReader implements AssetContentsReader {
6
+ private s3;
7
+ private readonly bucket;
8
+ constructor(s3: S3, bucket: string);
9
+ read(asset: Asset): Promise<Buffer>;
10
+ }