@webiny/api-file-manager-s3 5.41.4 → 5.42.0-beta.0

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.
@@ -10,7 +10,7 @@ const createAssetDelivery = params => {
10
10
  * We only want to load this plugin in the context of the Asset Delivery Lambda function.
11
11
  */
12
12
  return (0, _apiFileManager.createAssetDeliveryPluginLoader)(() => {
13
- return import( /* webpackChunkName: "s3AssetDelivery" */"./assetDeliveryConfig").then(({
13
+ return import(/* webpackChunkName: "s3AssetDelivery" */"./assetDeliveryConfig").then(({
14
14
  assetDeliveryConfig
15
15
  }) => assetDeliveryConfig(params));
16
16
  });
@@ -1 +1 @@
1
- {"version":3,"names":["_apiFileManager","require","createAssetDelivery","params","createAssetDeliveryPluginLoader","then","assetDeliveryConfig","exports"],"sources":["createAssetDelivery.ts"],"sourcesContent":["import { createAssetDeliveryPluginLoader } from \"@webiny/api-file-manager\";\nimport { PluginFactory } from \"@webiny/plugins/types\";\nimport type { AssetDeliveryParams } from \"./assetDeliveryConfig\";\n\nexport const createAssetDelivery = (params: AssetDeliveryParams): PluginFactory => {\n /**\n * We only want to load this plugin in the context of the Asset Delivery Lambda function.\n */\n return createAssetDeliveryPluginLoader(() => {\n return import(/* webpackChunkName: \"s3AssetDelivery\" */ \"./assetDeliveryConfig\").then(\n ({ assetDeliveryConfig }) => assetDeliveryConfig(params)\n );\n });\n};\n"],"mappings":";;;;;;AAAA,IAAAA,eAAA,GAAAC,OAAA;AAIO,MAAMC,mBAAmB,GAAIC,MAA2B,IAAoB;EAC/E;AACJ;AACA;EACI,OAAO,IAAAC,+CAA+B,EAAC,MAAM;IACzC,OAAO,MAAM,EAAC,gEAAiE,CAAC,CAACC,IAAI,CACjF,CAAC;MAAEC;IAAoB,CAAC,KAAKA,mBAAmB,CAACH,MAAM,CAC3D,CAAC;EACL,CAAC,CAAC;AACN,CAAC;AAACI,OAAA,CAAAL,mBAAA,GAAAA,mBAAA","ignoreList":[]}
1
+ {"version":3,"names":["_apiFileManager","require","createAssetDelivery","params","createAssetDeliveryPluginLoader","then","assetDeliveryConfig","exports"],"sources":["createAssetDelivery.ts"],"sourcesContent":["import { createAssetDeliveryPluginLoader } from \"@webiny/api-file-manager\";\nimport { PluginFactory } from \"@webiny/plugins/types\";\nimport type { AssetDeliveryParams } from \"./assetDeliveryConfig\";\n\nexport const createAssetDelivery = (params: AssetDeliveryParams): PluginFactory => {\n /**\n * We only want to load this plugin in the context of the Asset Delivery Lambda function.\n */\n return createAssetDeliveryPluginLoader(() => {\n return import(/* webpackChunkName: \"s3AssetDelivery\" */ \"./assetDeliveryConfig\").then(\n ({ assetDeliveryConfig }) => assetDeliveryConfig(params)\n );\n });\n};\n"],"mappings":";;;;;;AAAA,IAAAA,eAAA,GAAAC,OAAA;AAIO,MAAMC,mBAAmB,GAAIC,MAA2B,IAAoB;EAC/E;AACJ;AACA;EACI,OAAO,IAAAC,+CAA+B,EAAC,MAAM;IACzC,OAAO,MAAM,CAAC,gEAAiE,CAAC,CAACC,IAAI,CACjF,CAAC;MAAEC;IAAoB,CAAC,KAAKA,mBAAmB,CAACH,MAAM,CAC3D,CAAC;EACL,CAAC,CAAC;AACN,CAAC;AAACI,OAAA,CAAAL,mBAAA,GAAAA,mBAAA","ignoreList":[]}
@@ -18,7 +18,7 @@ var _apiFileManager = require("@webiny/api-file-manager");
18
18
  */
19
19
  const createCustomAssetDelivery = () => {
20
20
  return (0, _apiFileManager.createAssetDeliveryPluginLoader)(async () => {
21
- return import( /* webpackChunkName: "customAssetDelivery" */"./customAssets/customAssetDeliveryConfig").then(({
21
+ return import(/* webpackChunkName: "customAssetDelivery" */"./customAssets/customAssetDeliveryConfig").then(({
22
22
  customAssetDeliveryConfig
23
23
  }) => customAssetDeliveryConfig());
24
24
  });
@@ -1 +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,EACT,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":[]}
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":[]}
@@ -1 +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,GAAI,GAAED,GAAI,WAAU;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,CAAE,wBAAuBP,WAAY,QAAO,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":[]}
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":[]}
@@ -1 +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 { S3 } from \"@webiny/aws-sdk/client-s3\";\nimport { Asset, AssetRequest, AssetResolver } 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":";;;;;;AACA,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,CAAE,4CAA2CF,KAAK,CAACG,OAAQ,EAAC,CAAC;MACxE,OAAOC,SAAS;IACpB;EACJ;AACJ;AAACC,OAAA,CAAA1B,eAAA,GAAAA,eAAA","ignoreList":[]}
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 { S3 } from \"@webiny/aws-sdk/client-s3\";\nimport { Asset, AssetRequest, AssetResolver } 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":";;;;;;AACA,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":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["S3ContentsReader","constructor","s3","bucket","read","asset","Body","getObject","Bucket","Key","getKey","Error","Buffer","from","transformToByteArray","exports"],"sources":["S3ContentsReader.ts"],"sourcesContent":["import { S3 } from \"@webiny/aws-sdk/client-s3\";\nimport { 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":";;;;;;AAGO,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,CAAE,kBAAiBN,KAAK,CAACK,MAAM,CAAC,CAAE,GAAE,CAAC;IACpD;IAEA,OAAOE,MAAM,CAACC,IAAI,CAAC,MAAMP,IAAI,CAACQ,oBAAoB,CAAC,CAAC,CAAC;EACzD;AACJ;AAACC,OAAA,CAAAf,gBAAA,GAAAA,gBAAA","ignoreList":[]}
1
+ {"version":3,"names":["S3ContentsReader","constructor","s3","bucket","read","asset","Body","getObject","Bucket","Key","getKey","Error","Buffer","from","transformToByteArray","exports"],"sources":["S3ContentsReader.ts"],"sourcesContent":["import { S3 } from \"@webiny/aws-sdk/client-s3\";\nimport { 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":";;;;;;AAGO,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;AAACC,OAAA,CAAAf,gBAAA,GAAAA,gBAAA","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["_clientS","require","_S3RedirectAssetReply","_S3StreamAssetReply","S3OutputStrategy","constructor","s3","bucket","presignedUrlTtl","assetStreamingMaxSize","output","asset","getSize","console","log","S3RedirectAssetReply","getPresignedUrl","S3StreamAssetReply","getSignedUrl","GetObjectCommand","Bucket","Key","getKey","expiresIn","exports"],"sources":["S3OutputStrategy.ts"],"sourcesContent":["import { Asset, AssetOutputStrategy, AssetReply } from \"@webiny/api-file-manager\";\nimport { GetObjectCommand, getSignedUrl, S3 } from \"@webiny/aws-sdk/client-s3\";\nimport { S3RedirectAssetReply } from \"~/assetDelivery/s3/S3RedirectAssetReply\";\nimport { S3StreamAssetReply } from \"~/assetDelivery/s3/S3StreamAssetReply\";\n\n/**\n * This strategy outputs an asset taking into account the size of the asset contents.\n * If the asset is larger than 5MB, a presigned URL will be generated, and a redirect will happen.\n */\nexport class S3OutputStrategy implements AssetOutputStrategy {\n private readonly s3: S3;\n private readonly bucket: string;\n private readonly presignedUrlTtl: number;\n private readonly assetStreamingMaxSize: number;\n\n constructor(s3: S3, bucket: string, presignedUrlTtl: number, assetStreamingMaxSize: number) {\n this.assetStreamingMaxSize = assetStreamingMaxSize;\n this.presignedUrlTtl = presignedUrlTtl;\n this.s3 = s3;\n this.bucket = bucket;\n }\n\n async output(asset: Asset): Promise<AssetReply> {\n if (asset.getSize() > this.assetStreamingMaxSize) {\n console.log(\n `Asset size is greater than ${this.assetStreamingMaxSize}; redirecting to a presigned S3 URL.`\n );\n\n return new S3RedirectAssetReply(\n await this.getPresignedUrl(asset),\n this.presignedUrlTtl\n );\n }\n\n console.log(\n `Asset size is smaller than ${this.assetStreamingMaxSize}; streaming directly from Lambda function.`\n );\n return new S3StreamAssetReply(asset);\n }\n\n protected getPresignedUrl(asset: Asset) {\n return getSignedUrl(\n this.s3,\n new GetObjectCommand({\n Bucket: this.bucket,\n Key: asset.getKey()\n }),\n { expiresIn: this.presignedUrlTtl }\n );\n }\n}\n"],"mappings":";;;;;;AACA,IAAAA,QAAA,GAAAC,OAAA;AACA,IAAAC,qBAAA,GAAAD,OAAA;AACA,IAAAE,mBAAA,GAAAF,OAAA;AAEA;AACA;AACA;AACA;AACO,MAAMG,gBAAgB,CAAgC;EAMzDC,WAAWA,CAACC,EAAM,EAAEC,MAAc,EAAEC,eAAuB,EAAEC,qBAA6B,EAAE;IACxF,IAAI,CAACA,qBAAqB,GAAGA,qBAAqB;IAClD,IAAI,CAACD,eAAe,GAAGA,eAAe;IACtC,IAAI,CAACF,EAAE,GAAGA,EAAE;IACZ,IAAI,CAACC,MAAM,GAAGA,MAAM;EACxB;EAEA,MAAMG,MAAMA,CAACC,KAAY,EAAuB;IAC5C,IAAIA,KAAK,CAACC,OAAO,CAAC,CAAC,GAAG,IAAI,CAACH,qBAAqB,EAAE;MAC9CI,OAAO,CAACC,GAAG,CACN,8BAA6B,IAAI,CAACL,qBAAsB,sCAC7D,CAAC;MAED,OAAO,IAAIM,0CAAoB,CAC3B,MAAM,IAAI,CAACC,eAAe,CAACL,KAAK,CAAC,EACjC,IAAI,CAACH,eACT,CAAC;IACL;IAEAK,OAAO,CAACC,GAAG,CACN,8BAA6B,IAAI,CAACL,qBAAsB,4CAC7D,CAAC;IACD,OAAO,IAAIQ,sCAAkB,CAACN,KAAK,CAAC;EACxC;EAEUK,eAAeA,CAACL,KAAY,EAAE;IACpC,OAAO,IAAAO,qBAAY,EACf,IAAI,CAACZ,EAAE,EACP,IAAIa,yBAAgB,CAAC;MACjBC,MAAM,EAAE,IAAI,CAACb,MAAM;MACnBc,GAAG,EAAEV,KAAK,CAACW,MAAM,CAAC;IACtB,CAAC,CAAC,EACF;MAAEC,SAAS,EAAE,IAAI,CAACf;IAAgB,CACtC,CAAC;EACL;AACJ;AAACgB,OAAA,CAAApB,gBAAA,GAAAA,gBAAA","ignoreList":[]}
1
+ {"version":3,"names":["_clientS","require","_S3RedirectAssetReply","_S3StreamAssetReply","S3OutputStrategy","constructor","s3","bucket","presignedUrlTtl","assetStreamingMaxSize","output","asset","getSize","console","log","S3RedirectAssetReply","getPresignedUrl","S3StreamAssetReply","getSignedUrl","GetObjectCommand","Bucket","Key","getKey","expiresIn","exports"],"sources":["S3OutputStrategy.ts"],"sourcesContent":["import { Asset, AssetOutputStrategy, AssetReply } from \"@webiny/api-file-manager\";\nimport { GetObjectCommand, getSignedUrl, S3 } from \"@webiny/aws-sdk/client-s3\";\nimport { S3RedirectAssetReply } from \"~/assetDelivery/s3/S3RedirectAssetReply\";\nimport { S3StreamAssetReply } from \"~/assetDelivery/s3/S3StreamAssetReply\";\n\n/**\n * This strategy outputs an asset taking into account the size of the asset contents.\n * If the asset is larger than 5MB, a presigned URL will be generated, and a redirect will happen.\n */\nexport class S3OutputStrategy implements AssetOutputStrategy {\n private readonly s3: S3;\n private readonly bucket: string;\n private readonly presignedUrlTtl: number;\n private readonly assetStreamingMaxSize: number;\n\n constructor(s3: S3, bucket: string, presignedUrlTtl: number, assetStreamingMaxSize: number) {\n this.assetStreamingMaxSize = assetStreamingMaxSize;\n this.presignedUrlTtl = presignedUrlTtl;\n this.s3 = s3;\n this.bucket = bucket;\n }\n\n async output(asset: Asset): Promise<AssetReply> {\n if (asset.getSize() > this.assetStreamingMaxSize) {\n console.log(\n `Asset size is greater than ${this.assetStreamingMaxSize}; redirecting to a presigned S3 URL.`\n );\n\n return new S3RedirectAssetReply(\n await this.getPresignedUrl(asset),\n this.presignedUrlTtl\n );\n }\n\n console.log(\n `Asset size is smaller than ${this.assetStreamingMaxSize}; streaming directly from Lambda function.`\n );\n return new S3StreamAssetReply(asset);\n }\n\n protected getPresignedUrl(asset: Asset) {\n return getSignedUrl(\n this.s3,\n new GetObjectCommand({\n Bucket: this.bucket,\n Key: asset.getKey()\n }),\n { expiresIn: this.presignedUrlTtl }\n );\n }\n}\n"],"mappings":";;;;;;AACA,IAAAA,QAAA,GAAAC,OAAA;AACA,IAAAC,qBAAA,GAAAD,OAAA;AACA,IAAAE,mBAAA,GAAAF,OAAA;AAEA;AACA;AACA;AACA;AACO,MAAMG,gBAAgB,CAAgC;EAMzDC,WAAWA,CAACC,EAAM,EAAEC,MAAc,EAAEC,eAAuB,EAAEC,qBAA6B,EAAE;IACxF,IAAI,CAACA,qBAAqB,GAAGA,qBAAqB;IAClD,IAAI,CAACD,eAAe,GAAGA,eAAe;IACtC,IAAI,CAACF,EAAE,GAAGA,EAAE;IACZ,IAAI,CAACC,MAAM,GAAGA,MAAM;EACxB;EAEA,MAAMG,MAAMA,CAACC,KAAY,EAAuB;IAC5C,IAAIA,KAAK,CAACC,OAAO,CAAC,CAAC,GAAG,IAAI,CAACH,qBAAqB,EAAE;MAC9CI,OAAO,CAACC,GAAG,CACP,8BAA8B,IAAI,CAACL,qBAAqB,sCAC5D,CAAC;MAED,OAAO,IAAIM,0CAAoB,CAC3B,MAAM,IAAI,CAACC,eAAe,CAACL,KAAK,CAAC,EACjC,IAAI,CAACH,eACT,CAAC;IACL;IAEAK,OAAO,CAACC,GAAG,CACP,8BAA8B,IAAI,CAACL,qBAAqB,4CAC5D,CAAC;IACD,OAAO,IAAIQ,sCAAkB,CAACN,KAAK,CAAC;EACxC;EAEUK,eAAeA,CAACL,KAAY,EAAE;IACpC,OAAO,IAAAO,qBAAY,EACf,IAAI,CAACZ,EAAE,EACP,IAAIa,yBAAgB,CAAC;MACjBC,MAAM,EAAE,IAAI,CAACb,MAAM;MACnBc,GAAG,EAAEV,KAAK,CAACW,MAAM,CAAC;IACtB,CAAC,CAAC,EACF;MAAEC,SAAS,EAAE,IAAI,CAACf;IAAgB,CACtC,CAAC;EACL;AACJ;AAACgB,OAAA,CAAApB,gBAAA,GAAAA,gBAAA","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["_apiFileManager","require","_handler","S3StreamAssetReply","AssetReply","constructor","asset","code","headers","ResponseHeaders","create","getContentType","body","getContents","exports"],"sources":["S3StreamAssetReply.ts"],"sourcesContent":["import { Asset, AssetReply } from \"@webiny/api-file-manager\";\nimport { ResponseHeaders } from \"@webiny/handler\";\n\nexport class S3StreamAssetReply extends AssetReply {\n constructor(asset: Asset) {\n super({\n code: 200,\n headers: ResponseHeaders.create({\n \"cache-control\": `public, max-age=${86400 * 365}`,\n \"content-type\": asset.getContentType()\n }),\n body: () => asset.getContents()\n });\n }\n}\n"],"mappings":";;;;;;AAAA,IAAAA,eAAA,GAAAC,OAAA;AACA,IAAAC,QAAA,GAAAD,OAAA;AAEO,MAAME,kBAAkB,SAASC,0BAAU,CAAC;EAC/CC,WAAWA,CAACC,KAAY,EAAE;IACtB,KAAK,CAAC;MACFC,IAAI,EAAE,GAAG;MACTC,OAAO,EAAEC,wBAAe,CAACC,MAAM,CAAC;QAC5B,eAAe,EAAG,mBAAkB,KAAK,GAAG,GAAI,EAAC;QACjD,cAAc,EAAEJ,KAAK,CAACK,cAAc,CAAC;MACzC,CAAC,CAAC;MACFC,IAAI,EAAEA,CAAA,KAAMN,KAAK,CAACO,WAAW,CAAC;IAClC,CAAC,CAAC;EACN;AACJ;AAACC,OAAA,CAAAX,kBAAA,GAAAA,kBAAA","ignoreList":[]}
1
+ {"version":3,"names":["_apiFileManager","require","_handler","S3StreamAssetReply","AssetReply","constructor","asset","code","headers","ResponseHeaders","create","getContentType","body","getContents","exports"],"sources":["S3StreamAssetReply.ts"],"sourcesContent":["import { Asset, AssetReply } from \"@webiny/api-file-manager\";\nimport { ResponseHeaders } from \"@webiny/handler\";\n\nexport class S3StreamAssetReply extends AssetReply {\n constructor(asset: Asset) {\n super({\n code: 200,\n headers: ResponseHeaders.create({\n \"cache-control\": `public, max-age=${86400 * 365}`,\n \"content-type\": asset.getContentType()\n }),\n body: () => asset.getContents()\n });\n }\n}\n"],"mappings":";;;;;;AAAA,IAAAA,eAAA,GAAAC,OAAA;AACA,IAAAC,QAAA,GAAAD,OAAA;AAEO,MAAME,kBAAkB,SAASC,0BAAU,CAAC;EAC/CC,WAAWA,CAACC,KAAY,EAAE;IACtB,KAAK,CAAC;MACFC,IAAI,EAAE,GAAG;MACTC,OAAO,EAAEC,wBAAe,CAACC,MAAM,CAAC;QAC5B,eAAe,EAAE,mBAAmB,KAAK,GAAG,GAAG,EAAE;QACjD,cAAc,EAAEJ,KAAK,CAACK,cAAc,CAAC;MACzC,CAAC,CAAC;MACFC,IAAI,EAAEA,CAAA,KAAMN,KAAK,CAACO,WAAW,CAAC;IAClC,CAAC,CAAC;EACN;AACJ;AAACC,OAAA,CAAAX,kBAAA,GAAAA,kBAAA","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["_sharp","_interopRequireDefault","require","_WidthCollection","utils","_interopRequireWildcard","_CallableContentsReader","_AssetKeyGenerator","SharpTransform","constructor","params","transform","assetRequest","asset","SUPPORTED_TRANSFORMABLE_IMAGES","includes","getExtension","console","log","getContentType","original","options","getOptions","transformedAsset","clone","Object","keys","length","transformAsset","optimizeAsset","width","s3","bucket","assetKey","AssetKeyGenerator","transformedAssetKey","getTransformedImageKey","Body","getObject","Bucket","Key","Error","buffer","Buffer","from","transformToByteArray","newAsset","withProps","size","setContentsReader","CallableContentsReader","key","getSize","e","optimizedImage","widths","WidthCollection","imageResizeWidths","getClosestOrMax","getContents","transformedBuffer","sharp","animated","isAssetAnimated","withMetadata","resize","withoutEnlargement","toBuffer","putObject","ContentType","id","getId","getKey","type","optimizedAssetKey","getOptimizedImageKey","optimizationMap","optimizePng","optimizeJpeg","optimization","optimizedBuffer","fit","png","compressionLevel","adaptiveFiltering","force","toFormat","quality","exports"],"sources":["SharpTransform.ts"],"sourcesContent":["import sharp from \"sharp\";\nimport { S3 } from \"@webiny/aws-sdk/client-s3\";\nimport {\n Asset,\n AssetRequest,\n AssetRequestOptions,\n AssetTransformationStrategy\n} from \"@webiny/api-file-manager\";\nimport { WidthCollection } from \"./transformation/WidthCollection\";\nimport * as utils from \"./transformation/utils\";\nimport { CallableContentsReader } from \"./transformation/CallableContentsReader\";\nimport { AssetKeyGenerator } from \"./transformation/AssetKeyGenerator\";\n\ninterface SharpTransformationParams {\n s3: S3;\n bucket: string;\n imageResizeWidths: number[];\n}\n\nexport class SharpTransform implements AssetTransformationStrategy {\n private readonly params: SharpTransformationParams;\n\n constructor(params: SharpTransformationParams) {\n this.params = params;\n }\n\n async transform(assetRequest: AssetRequest, asset: Asset): Promise<Asset> {\n if (!utils.SUPPORTED_TRANSFORMABLE_IMAGES.includes(asset.getExtension())) {\n console.log(\n `Transformations/optimizations of ${asset.getContentType()} assets are not supported. Skipping.`\n );\n return asset;\n }\n\n // `original` is part of the request, but it won't even get to this point in the execution.\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { original, ...options } = assetRequest.getOptions();\n\n const transformedAsset = asset.clone();\n\n if (Object.keys(options).length > 0) {\n // Transformations were requested.\n return this.transformAsset(transformedAsset, options);\n }\n\n // Return an optimized asset.\n return this.optimizeAsset(transformedAsset);\n }\n\n private async transformAsset(asset: Asset, options: Omit<AssetRequestOptions, \"original\">) {\n console.log(\"Transform asset\", options);\n if (options.width) {\n const { s3, bucket } = this.params;\n\n const assetKey = new AssetKeyGenerator(asset);\n const transformedAssetKey = assetKey.getTransformedImageKey(options);\n\n try {\n const { Body } = await s3.getObject({\n Bucket: bucket,\n Key: transformedAssetKey\n });\n\n if (!Body) {\n throw new Error(`Missing image body!`);\n }\n\n const buffer = Buffer.from(await Body.transformToByteArray());\n\n const newAsset = asset.withProps({ size: buffer.length });\n newAsset.setContentsReader(new CallableContentsReader(() => buffer));\n\n console.log(`Return a previously transformed asset`, {\n key: transformedAssetKey,\n size: newAsset.getSize()\n });\n\n return newAsset;\n } catch (e) {\n const optimizedImage = await this.optimizeAsset(asset);\n\n const widths = new WidthCollection(this.params.imageResizeWidths);\n const width = widths.getClosestOrMax(options.width);\n\n /**\n * `width` is the only transformation we currently support.\n */\n console.log(`Resize the asset (width: ${width})`);\n const buffer = await optimizedImage.getContents();\n const transformedBuffer = await sharp(buffer, {\n animated: this.isAssetAnimated(asset)\n })\n .withMetadata()\n .resize({ width, withoutEnlargement: true })\n .toBuffer();\n\n /**\n * Transformations are applied to the optimized image.\n */\n const newAsset = asset.withProps({ size: transformedBuffer.length });\n newAsset.setContentsReader(new CallableContentsReader(() => transformedBuffer));\n\n await s3.putObject({\n Bucket: bucket,\n Key: transformedAssetKey,\n ContentType: newAsset.getContentType(),\n Body: await newAsset.getContents()\n });\n\n console.log(`Return the resized asset`, {\n key: transformedAssetKey,\n size: newAsset.getSize()\n });\n\n return newAsset;\n }\n }\n\n return asset;\n }\n\n private async optimizeAsset(asset: Asset) {\n const { s3, bucket } = this.params;\n\n console.log(\"Optimize asset\", {\n id: asset.getId(),\n key: asset.getKey(),\n size: asset.getSize(),\n type: asset.getContentType()\n });\n\n const assetKey = new AssetKeyGenerator(asset);\n const optimizedAssetKey = assetKey.getOptimizedImageKey();\n\n try {\n const { Body } = await s3.getObject({\n Bucket: bucket,\n Key: optimizedAssetKey\n });\n\n if (!Body) {\n throw new Error(`Missing image body!`);\n }\n\n console.log(\"Return a previously optimized asset\", optimizedAssetKey);\n\n const buffer = Buffer.from(await Body.transformToByteArray());\n\n const newAsset = asset.withProps({ size: buffer.length });\n newAsset.setContentsReader(new CallableContentsReader(() => buffer));\n\n return newAsset;\n } catch (e) {\n console.log(\"Create an optimized version of the original asset\", asset.getKey());\n // If not found, create an optimized version of the original asset.\n const buffer = await asset.getContents();\n\n const optimizationMap: Record<string, ((buffer: Buffer) => sharp.Sharp) | undefined> = {\n \"image/png\": (buffer: Buffer) => this.optimizePng(buffer),\n \"image/jpeg\": (buffer: Buffer) => this.optimizeJpeg(buffer),\n \"image/jpg\": (buffer: Buffer) => this.optimizeJpeg(buffer)\n };\n\n const optimization = optimizationMap[asset.getContentType()];\n\n if (!optimization) {\n console.log(`No optimizations defined for ${asset.getContentType()}`);\n return asset;\n }\n\n const optimizedBuffer = await optimization(buffer).toBuffer();\n\n console.log(\"Optimized asset size\", optimizedBuffer.length);\n\n const newAsset = asset.withProps({ size: optimizedBuffer.length });\n newAsset.setContentsReader(new CallableContentsReader(() => optimizedBuffer));\n\n await s3.putObject({\n Bucket: bucket,\n Key: optimizedAssetKey,\n ContentType: newAsset.getContentType(),\n Body: await newAsset.getContents()\n });\n\n return newAsset;\n }\n }\n\n private isAssetAnimated(asset: Asset) {\n return [\"gif\", \"webp\"].includes(asset.getExtension());\n }\n\n private optimizePng(buffer: Buffer) {\n return sharp(buffer)\n .resize({ width: 2560, withoutEnlargement: true, fit: \"inside\" })\n .png({ compressionLevel: 9, adaptiveFiltering: true, force: true })\n .withMetadata();\n }\n\n private optimizeJpeg(buffer: Buffer) {\n return sharp(buffer)\n .resize({ width: 2560, withoutEnlargement: true, fit: \"inside\" })\n .withMetadata()\n .toFormat(\"jpeg\", { quality: 90 });\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_sharp","_interopRequireDefault","require","_WidthCollection","utils","_interopRequireWildcard","_CallableContentsReader","_AssetKeyGenerator","SharpTransform","constructor","params","transform","assetRequest","asset","SUPPORTED_TRANSFORMABLE_IMAGES","includes","getExtension","console","log","getContentType","original","options","getOptions","transformedAsset","clone","Object","keys","length","transformAsset","optimizeAsset","width","s3","bucket","assetKey","AssetKeyGenerator","transformedAssetKey","getTransformedImageKey","Body","getObject","Bucket","Key","Error","buffer","Buffer","from","transformToByteArray","newAsset","withProps","size","setContentsReader","CallableContentsReader","key","getSize","e","optimizedImage","widths","WidthCollection","imageResizeWidths","getClosestOrMax","getContents","transformedBuffer","sharp","animated","isAssetAnimated","withMetadata","resize","withoutEnlargement","toBuffer","putObject","ContentType","id","getId","getKey","type","optimizedAssetKey","getOptimizedImageKey","optimizationMap","optimizePng","optimizeJpeg","optimization","optimizedBuffer","fit","png","compressionLevel","adaptiveFiltering","force","toFormat","quality","exports"],"sources":["SharpTransform.ts"],"sourcesContent":["import sharp from \"sharp\";\nimport { S3 } from \"@webiny/aws-sdk/client-s3\";\nimport {\n Asset,\n AssetRequest,\n AssetRequestOptions,\n AssetTransformationStrategy\n} from \"@webiny/api-file-manager\";\nimport { WidthCollection } from \"./transformation/WidthCollection\";\nimport * as utils from \"./transformation/utils\";\nimport { CallableContentsReader } from \"./transformation/CallableContentsReader\";\nimport { AssetKeyGenerator } from \"./transformation/AssetKeyGenerator\";\n\ninterface SharpTransformationParams {\n s3: S3;\n bucket: string;\n imageResizeWidths: number[];\n}\n\nexport class SharpTransform implements AssetTransformationStrategy {\n private readonly params: SharpTransformationParams;\n\n constructor(params: SharpTransformationParams) {\n this.params = params;\n }\n\n async transform(assetRequest: AssetRequest, asset: Asset): Promise<Asset> {\n if (!utils.SUPPORTED_TRANSFORMABLE_IMAGES.includes(asset.getExtension())) {\n console.log(\n `Transformations/optimizations of ${asset.getContentType()} assets are not supported. Skipping.`\n );\n return asset;\n }\n\n // `original` is part of the request, but it won't even get to this point in the execution.\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { original, ...options } = assetRequest.getOptions();\n\n const transformedAsset = asset.clone();\n\n if (Object.keys(options).length > 0) {\n // Transformations were requested.\n return this.transformAsset(transformedAsset, options);\n }\n\n // Return an optimized asset.\n return this.optimizeAsset(transformedAsset);\n }\n\n private async transformAsset(asset: Asset, options: Omit<AssetRequestOptions, \"original\">) {\n console.log(\"Transform asset\", options);\n if (options.width) {\n const { s3, bucket } = this.params;\n\n const assetKey = new AssetKeyGenerator(asset);\n const transformedAssetKey = assetKey.getTransformedImageKey(options);\n\n try {\n const { Body } = await s3.getObject({\n Bucket: bucket,\n Key: transformedAssetKey\n });\n\n if (!Body) {\n throw new Error(`Missing image body!`);\n }\n\n const buffer = Buffer.from(await Body.transformToByteArray());\n\n const newAsset = asset.withProps({ size: buffer.length });\n newAsset.setContentsReader(new CallableContentsReader(() => buffer));\n\n console.log(`Return a previously transformed asset`, {\n key: transformedAssetKey,\n size: newAsset.getSize()\n });\n\n return newAsset;\n } catch (e) {\n const optimizedImage = await this.optimizeAsset(asset);\n\n const widths = new WidthCollection(this.params.imageResizeWidths);\n const width = widths.getClosestOrMax(options.width);\n\n /**\n * `width` is the only transformation we currently support.\n */\n console.log(`Resize the asset (width: ${width})`);\n const buffer = await optimizedImage.getContents();\n const transformedBuffer = await sharp(buffer, {\n animated: this.isAssetAnimated(asset)\n })\n .withMetadata()\n .resize({ width, withoutEnlargement: true })\n .toBuffer();\n\n /**\n * Transformations are applied to the optimized image.\n */\n const newAsset = asset.withProps({ size: transformedBuffer.length });\n newAsset.setContentsReader(new CallableContentsReader(() => transformedBuffer));\n\n await s3.putObject({\n Bucket: bucket,\n Key: transformedAssetKey,\n ContentType: newAsset.getContentType(),\n Body: await newAsset.getContents()\n });\n\n console.log(`Return the resized asset`, {\n key: transformedAssetKey,\n size: newAsset.getSize()\n });\n\n return newAsset;\n }\n }\n\n return asset;\n }\n\n private async optimizeAsset(asset: Asset) {\n const { s3, bucket } = this.params;\n\n console.log(\"Optimize asset\", {\n id: asset.getId(),\n key: asset.getKey(),\n size: asset.getSize(),\n type: asset.getContentType()\n });\n\n const assetKey = new AssetKeyGenerator(asset);\n const optimizedAssetKey = assetKey.getOptimizedImageKey();\n\n try {\n const { Body } = await s3.getObject({\n Bucket: bucket,\n Key: optimizedAssetKey\n });\n\n if (!Body) {\n throw new Error(`Missing image body!`);\n }\n\n console.log(\"Return a previously optimized asset\", optimizedAssetKey);\n\n const buffer = Buffer.from(await Body.transformToByteArray());\n\n const newAsset = asset.withProps({ size: buffer.length });\n newAsset.setContentsReader(new CallableContentsReader(() => buffer));\n\n return newAsset;\n } catch (e) {\n console.log(\"Create an optimized version of the original asset\", asset.getKey());\n // If not found, create an optimized version of the original asset.\n const buffer = await asset.getContents();\n\n const optimizationMap: Record<string, ((buffer: Buffer) => sharp.Sharp) | undefined> = {\n \"image/png\": (buffer: Buffer) => this.optimizePng(buffer),\n \"image/jpeg\": (buffer: Buffer) => this.optimizeJpeg(buffer),\n \"image/jpg\": (buffer: Buffer) => this.optimizeJpeg(buffer)\n };\n\n const optimization = optimizationMap[asset.getContentType()];\n\n if (!optimization) {\n console.log(`No optimizations defined for ${asset.getContentType()}`);\n return asset;\n }\n\n const optimizedBuffer = await optimization(buffer).toBuffer();\n\n console.log(\"Optimized asset size\", optimizedBuffer.length);\n\n const newAsset = asset.withProps({ size: optimizedBuffer.length });\n newAsset.setContentsReader(new CallableContentsReader(() => optimizedBuffer));\n\n await s3.putObject({\n Bucket: bucket,\n Key: optimizedAssetKey,\n ContentType: newAsset.getContentType(),\n Body: await newAsset.getContents()\n });\n\n return newAsset;\n }\n }\n\n private isAssetAnimated(asset: Asset) {\n return [\"gif\", \"webp\"].includes(asset.getExtension());\n }\n\n private optimizePng(buffer: Buffer) {\n return sharp(buffer)\n .resize({ width: 2560, withoutEnlargement: true, fit: \"inside\" })\n .png({ compressionLevel: 9, adaptiveFiltering: true, force: true })\n .withMetadata();\n }\n\n private optimizeJpeg(buffer: Buffer) {\n return sharp(buffer)\n .resize({ width: 2560, withoutEnlargement: true, fit: \"inside\" })\n .withMetadata()\n .toFormat(\"jpeg\", { quality: 90 });\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["_objectHash","_interopRequireDefault","require","SUPPORTED_IMAGES","exports","SUPPORTED_TRANSFORMABLE_IMAGES","OPTIMIZED_TRANSFORMED_IMAGE_PREFIX","OPTIMIZED_IMAGE_PREFIX","getOptimizedImageKeyPrefix","key","objectHash","getOptimizedTransformedImageKeyPrefix","getImageKey","transformations","prefix"],"sources":["legacyUtils.ts"],"sourcesContent":["import objectHash from \"object-hash\";\n\nconst SUPPORTED_IMAGES = [\".jpg\", \".jpeg\", \".png\", \".svg\", \".gif\"];\nconst SUPPORTED_TRANSFORMABLE_IMAGES = [\".jpg\", \".jpeg\", \".png\"];\n\nconst OPTIMIZED_TRANSFORMED_IMAGE_PREFIX = \"img-o-t-\";\nconst OPTIMIZED_IMAGE_PREFIX = \"img-o-\";\n\nconst getOptimizedImageKeyPrefix = (key: string): string => {\n return `${OPTIMIZED_IMAGE_PREFIX}${objectHash(key)}-`;\n};\n\nconst getOptimizedTransformedImageKeyPrefix = (key: string): string => {\n return `${OPTIMIZED_TRANSFORMED_IMAGE_PREFIX}${objectHash(key)}-`;\n};\n\ninterface GetImageKeyParams {\n key: string;\n transformations?: any;\n}\n\nconst getImageKey = ({ key, transformations }: GetImageKeyParams): string => {\n if (!transformations) {\n const prefix = getOptimizedImageKeyPrefix(key);\n return prefix + key;\n }\n\n const prefix = getOptimizedTransformedImageKeyPrefix(key);\n return `${prefix}${objectHash(transformations)}-${key}`;\n};\n\nexport {\n SUPPORTED_IMAGES,\n SUPPORTED_TRANSFORMABLE_IMAGES,\n OPTIMIZED_TRANSFORMED_IMAGE_PREFIX,\n OPTIMIZED_IMAGE_PREFIX,\n getImageKey,\n getOptimizedImageKeyPrefix,\n getOptimizedTransformedImageKeyPrefix\n};\n"],"mappings":";;;;;;;AAAA,IAAAA,WAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEA,MAAMC,gBAAgB,GAAAC,OAAA,CAAAD,gBAAA,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;AAClE,MAAME,8BAA8B,GAAAD,OAAA,CAAAC,8BAAA,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC;AAEhE,MAAMC,kCAAkC,GAAAF,OAAA,CAAAE,kCAAA,GAAG,UAAU;AACrD,MAAMC,sBAAsB,GAAAH,OAAA,CAAAG,sBAAA,GAAG,QAAQ;AAEvC,MAAMC,0BAA0B,GAAIC,GAAW,IAAa;EACxD,OAAQ,GAAEF,sBAAuB,GAAE,IAAAG,mBAAU,EAACD,GAAG,CAAE,GAAE;AACzD,CAAC;AAACL,OAAA,CAAAI,0BAAA,GAAAA,0BAAA;AAEF,MAAMG,qCAAqC,GAAIF,GAAW,IAAa;EACnE,OAAQ,GAAEH,kCAAmC,GAAE,IAAAI,mBAAU,EAACD,GAAG,CAAE,GAAE;AACrE,CAAC;AAACL,OAAA,CAAAO,qCAAA,GAAAA,qCAAA;AAOF,MAAMC,WAAW,GAAGA,CAAC;EAAEH,GAAG;EAAEI;AAAmC,CAAC,KAAa;EACzE,IAAI,CAACA,eAAe,EAAE;IAClB,MAAMC,MAAM,GAAGN,0BAA0B,CAACC,GAAG,CAAC;IAC9C,OAAOK,MAAM,GAAGL,GAAG;EACvB;EAEA,MAAMK,MAAM,GAAGH,qCAAqC,CAACF,GAAG,CAAC;EACzD,OAAQ,GAAEK,MAAO,GAAE,IAAAJ,mBAAU,EAACG,eAAe,CAAE,IAAGJ,GAAI,EAAC;AAC3D,CAAC;AAACL,OAAA,CAAAQ,WAAA,GAAAA,WAAA","ignoreList":[]}
1
+ {"version":3,"names":["_objectHash","_interopRequireDefault","require","SUPPORTED_IMAGES","exports","SUPPORTED_TRANSFORMABLE_IMAGES","OPTIMIZED_TRANSFORMED_IMAGE_PREFIX","OPTIMIZED_IMAGE_PREFIX","getOptimizedImageKeyPrefix","key","objectHash","getOptimizedTransformedImageKeyPrefix","getImageKey","transformations","prefix"],"sources":["legacyUtils.ts"],"sourcesContent":["import objectHash from \"object-hash\";\n\nconst SUPPORTED_IMAGES = [\".jpg\", \".jpeg\", \".png\", \".svg\", \".gif\"];\nconst SUPPORTED_TRANSFORMABLE_IMAGES = [\".jpg\", \".jpeg\", \".png\"];\n\nconst OPTIMIZED_TRANSFORMED_IMAGE_PREFIX = \"img-o-t-\";\nconst OPTIMIZED_IMAGE_PREFIX = \"img-o-\";\n\nconst getOptimizedImageKeyPrefix = (key: string): string => {\n return `${OPTIMIZED_IMAGE_PREFIX}${objectHash(key)}-`;\n};\n\nconst getOptimizedTransformedImageKeyPrefix = (key: string): string => {\n return `${OPTIMIZED_TRANSFORMED_IMAGE_PREFIX}${objectHash(key)}-`;\n};\n\ninterface GetImageKeyParams {\n key: string;\n transformations?: any;\n}\n\nconst getImageKey = ({ key, transformations }: GetImageKeyParams): string => {\n if (!transformations) {\n const prefix = getOptimizedImageKeyPrefix(key);\n return prefix + key;\n }\n\n const prefix = getOptimizedTransformedImageKeyPrefix(key);\n return `${prefix}${objectHash(transformations)}-${key}`;\n};\n\nexport {\n SUPPORTED_IMAGES,\n SUPPORTED_TRANSFORMABLE_IMAGES,\n OPTIMIZED_TRANSFORMED_IMAGE_PREFIX,\n OPTIMIZED_IMAGE_PREFIX,\n getImageKey,\n getOptimizedImageKeyPrefix,\n getOptimizedTransformedImageKeyPrefix\n};\n"],"mappings":";;;;;;;AAAA,IAAAA,WAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEA,MAAMC,gBAAgB,GAAAC,OAAA,CAAAD,gBAAA,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;AAClE,MAAME,8BAA8B,GAAAD,OAAA,CAAAC,8BAAA,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC;AAEhE,MAAMC,kCAAkC,GAAAF,OAAA,CAAAE,kCAAA,GAAG,UAAU;AACrD,MAAMC,sBAAsB,GAAAH,OAAA,CAAAG,sBAAA,GAAG,QAAQ;AAEvC,MAAMC,0BAA0B,GAAIC,GAAW,IAAa;EACxD,OAAO,GAAGF,sBAAsB,GAAG,IAAAG,mBAAU,EAACD,GAAG,CAAC,GAAG;AACzD,CAAC;AAACL,OAAA,CAAAI,0BAAA,GAAAA,0BAAA;AAEF,MAAMG,qCAAqC,GAAIF,GAAW,IAAa;EACnE,OAAO,GAAGH,kCAAkC,GAAG,IAAAI,mBAAU,EAACD,GAAG,CAAC,GAAG;AACrE,CAAC;AAACL,OAAA,CAAAO,qCAAA,GAAAA,qCAAA;AAOF,MAAMC,WAAW,GAAGA,CAAC;EAAEH,GAAG;EAAEI;AAAmC,CAAC,KAAa;EACzE,IAAI,CAACA,eAAe,EAAE;IAClB,MAAMC,MAAM,GAAGN,0BAA0B,CAACC,GAAG,CAAC;IAC9C,OAAOK,MAAM,GAAGL,GAAG;EACvB;EAEA,MAAMK,MAAM,GAAGH,qCAAqC,CAACF,GAAG,CAAC;EACzD,OAAO,GAAGK,MAAM,GAAG,IAAAJ,mBAAU,EAACG,eAAe,CAAC,IAAIJ,GAAG,EAAE;AAC3D,CAAC;AAACL,OAAA,CAAAQ,WAAA,GAAAA,WAAA","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["_objectHash","_interopRequireDefault","require","SUPPORTED_TRANSFORMABLE_IMAGES","exports","OPTIMIZED_TRANSFORMED_IMAGE_PREFIX","OPTIMIZED_IMAGE_PREFIX","getOptimizedImageKeyPrefix","key","id","name","split","getOptimizedTransformedImageKeyPrefix","transformationsHash","getImageKey","transformations","objectHash"],"sources":["utils.ts"],"sourcesContent":["import objectHash from \"object-hash\";\n\nconst SUPPORTED_TRANSFORMABLE_IMAGES = [\"jpg\", \"jpeg\", \"png\", \"webp\"];\nconst OPTIMIZED_TRANSFORMED_IMAGE_PREFIX = \"img-o-t-\";\nconst OPTIMIZED_IMAGE_PREFIX = \"img-o-\";\n\nconst getOptimizedImageKeyPrefix = (key: string): string => {\n const [id, name] = key.split(\"/\");\n return `${id}/${OPTIMIZED_IMAGE_PREFIX}${name}`;\n};\n\nconst getOptimizedTransformedImageKeyPrefix = (\n key: string,\n transformationsHash: string\n): string => {\n const [id, name] = key.split(\"/\");\n return `${id}/${OPTIMIZED_TRANSFORMED_IMAGE_PREFIX}${transformationsHash}-${name}`;\n};\n\ninterface GetImageKeyParams {\n key: string;\n transformations?: any;\n}\n\nconst getImageKey = ({ key, transformations }: GetImageKeyParams): string => {\n if (!transformations) {\n return getOptimizedImageKeyPrefix(key);\n }\n\n return getOptimizedTransformedImageKeyPrefix(key, objectHash(transformations));\n};\n\nexport {\n SUPPORTED_TRANSFORMABLE_IMAGES,\n OPTIMIZED_TRANSFORMED_IMAGE_PREFIX,\n OPTIMIZED_IMAGE_PREFIX,\n getImageKey,\n getOptimizedImageKeyPrefix,\n getOptimizedTransformedImageKeyPrefix\n};\n"],"mappings":";;;;;;;AAAA,IAAAA,WAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEA,MAAMC,8BAA8B,GAAAC,OAAA,CAAAD,8BAAA,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC;AACrE,MAAME,kCAAkC,GAAAD,OAAA,CAAAC,kCAAA,GAAG,UAAU;AACrD,MAAMC,sBAAsB,GAAAF,OAAA,CAAAE,sBAAA,GAAG,QAAQ;AAEvC,MAAMC,0BAA0B,GAAIC,GAAW,IAAa;EACxD,MAAM,CAACC,EAAE,EAAEC,IAAI,CAAC,GAAGF,GAAG,CAACG,KAAK,CAAC,GAAG,CAAC;EACjC,OAAQ,GAAEF,EAAG,IAAGH,sBAAuB,GAAEI,IAAK,EAAC;AACnD,CAAC;AAACN,OAAA,CAAAG,0BAAA,GAAAA,0BAAA;AAEF,MAAMK,qCAAqC,GAAGA,CAC1CJ,GAAW,EACXK,mBAA2B,KAClB;EACT,MAAM,CAACJ,EAAE,EAAEC,IAAI,CAAC,GAAGF,GAAG,CAACG,KAAK,CAAC,GAAG,CAAC;EACjC,OAAQ,GAAEF,EAAG,IAAGJ,kCAAmC,GAAEQ,mBAAoB,IAAGH,IAAK,EAAC;AACtF,CAAC;AAACN,OAAA,CAAAQ,qCAAA,GAAAA,qCAAA;AAOF,MAAME,WAAW,GAAGA,CAAC;EAAEN,GAAG;EAAEO;AAAmC,CAAC,KAAa;EACzE,IAAI,CAACA,eAAe,EAAE;IAClB,OAAOR,0BAA0B,CAACC,GAAG,CAAC;EAC1C;EAEA,OAAOI,qCAAqC,CAACJ,GAAG,EAAE,IAAAQ,mBAAU,EAACD,eAAe,CAAC,CAAC;AAClF,CAAC;AAACX,OAAA,CAAAU,WAAA,GAAAA,WAAA","ignoreList":[]}
1
+ {"version":3,"names":["_objectHash","_interopRequireDefault","require","SUPPORTED_TRANSFORMABLE_IMAGES","exports","OPTIMIZED_TRANSFORMED_IMAGE_PREFIX","OPTIMIZED_IMAGE_PREFIX","getOptimizedImageKeyPrefix","key","id","name","split","getOptimizedTransformedImageKeyPrefix","transformationsHash","getImageKey","transformations","objectHash"],"sources":["utils.ts"],"sourcesContent":["import objectHash from \"object-hash\";\n\nconst SUPPORTED_TRANSFORMABLE_IMAGES = [\"jpg\", \"jpeg\", \"png\", \"webp\"];\nconst OPTIMIZED_TRANSFORMED_IMAGE_PREFIX = \"img-o-t-\";\nconst OPTIMIZED_IMAGE_PREFIX = \"img-o-\";\n\nconst getOptimizedImageKeyPrefix = (key: string): string => {\n const [id, name] = key.split(\"/\");\n return `${id}/${OPTIMIZED_IMAGE_PREFIX}${name}`;\n};\n\nconst getOptimizedTransformedImageKeyPrefix = (\n key: string,\n transformationsHash: string\n): string => {\n const [id, name] = key.split(\"/\");\n return `${id}/${OPTIMIZED_TRANSFORMED_IMAGE_PREFIX}${transformationsHash}-${name}`;\n};\n\ninterface GetImageKeyParams {\n key: string;\n transformations?: any;\n}\n\nconst getImageKey = ({ key, transformations }: GetImageKeyParams): string => {\n if (!transformations) {\n return getOptimizedImageKeyPrefix(key);\n }\n\n return getOptimizedTransformedImageKeyPrefix(key, objectHash(transformations));\n};\n\nexport {\n SUPPORTED_TRANSFORMABLE_IMAGES,\n OPTIMIZED_TRANSFORMED_IMAGE_PREFIX,\n OPTIMIZED_IMAGE_PREFIX,\n getImageKey,\n getOptimizedImageKeyPrefix,\n getOptimizedTransformedImageKeyPrefix\n};\n"],"mappings":";;;;;;;AAAA,IAAAA,WAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEA,MAAMC,8BAA8B,GAAAC,OAAA,CAAAD,8BAAA,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC;AACrE,MAAME,kCAAkC,GAAAD,OAAA,CAAAC,kCAAA,GAAG,UAAU;AACrD,MAAMC,sBAAsB,GAAAF,OAAA,CAAAE,sBAAA,GAAG,QAAQ;AAEvC,MAAMC,0BAA0B,GAAIC,GAAW,IAAa;EACxD,MAAM,CAACC,EAAE,EAAEC,IAAI,CAAC,GAAGF,GAAG,CAACG,KAAK,CAAC,GAAG,CAAC;EACjC,OAAO,GAAGF,EAAE,IAAIH,sBAAsB,GAAGI,IAAI,EAAE;AACnD,CAAC;AAACN,OAAA,CAAAG,0BAAA,GAAAA,0BAAA;AAEF,MAAMK,qCAAqC,GAAGA,CAC1CJ,GAAW,EACXK,mBAA2B,KAClB;EACT,MAAM,CAACJ,EAAE,EAAEC,IAAI,CAAC,GAAGF,GAAG,CAACG,KAAK,CAAC,GAAG,CAAC;EACjC,OAAO,GAAGF,EAAE,IAAIJ,kCAAkC,GAAGQ,mBAAmB,IAAIH,IAAI,EAAE;AACtF,CAAC;AAACN,OAAA,CAAAQ,qCAAA,GAAAA,qCAAA;AAOF,MAAME,WAAW,GAAGA,CAAC;EAAEN,GAAG;EAAEO;AAAmC,CAAC,KAAa;EACzE,IAAI,CAACA,eAAe,EAAE;IAClB,OAAOR,0BAA0B,CAACC,GAAG,CAAC;EAC1C;EAEA,OAAOI,qCAAqC,CAACJ,GAAG,EAAE,IAAAQ,mBAAU,EAACD,eAAe,CAAC,CAAC;AAClF,CAAC;AAACX,OAAA,CAAAU,WAAA,GAAAA,WAAA","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["CdnPathsGenerator","generate","file","key","aliases","exports"],"sources":["CdnPathsGenerator.ts"],"sourcesContent":["import { File } from \"@webiny/api-file-manager/types\";\n\nexport class CdnPathsGenerator {\n generate(file: File) {\n return [`/files/${file.key}*`, `/private/${file.key}*`, ...file.aliases];\n }\n}\n"],"mappings":";;;;;;AAEO,MAAMA,iBAAiB,CAAC;EAC3BC,QAAQA,CAACC,IAAU,EAAE;IACjB,OAAO,CAAE,UAASA,IAAI,CAACC,GAAI,GAAE,EAAG,YAAWD,IAAI,CAACC,GAAI,GAAE,EAAE,GAAGD,IAAI,CAACE,OAAO,CAAC;EAC5E;AACJ;AAACC,OAAA,CAAAL,iBAAA,GAAAA,iBAAA","ignoreList":[]}
1
+ {"version":3,"names":["CdnPathsGenerator","generate","file","key","aliases","exports"],"sources":["CdnPathsGenerator.ts"],"sourcesContent":["import { File } from \"@webiny/api-file-manager/types\";\n\nexport class CdnPathsGenerator {\n generate(file: File) {\n return [`/files/${file.key}*`, `/private/${file.key}*`, ...file.aliases];\n }\n}\n"],"mappings":";;;;;;AAEO,MAAMA,iBAAiB,CAAC;EAC3BC,QAAQA,CAACC,IAAU,EAAE;IACjB,OAAO,CAAC,UAAUA,IAAI,CAACC,GAAG,GAAG,EAAE,YAAYD,IAAI,CAACC,GAAG,GAAG,EAAE,GAAGD,IAAI,CAACE,OAAO,CAAC;EAC5E;AACJ;AAACC,OAAA,CAAAL,iBAAA,GAAAA,iBAAA","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["_api","require","_clientCloudfront","_utils","ReturnContinue","Error","InvalidateCloudfrontCacheTask","continueIfCode","run","input","response","isCloseToTimeout","manifest","ServiceDiscovery","load","error","message","code","data","distributionId","api","cloudfront","invalidateCache","caller","paths","executeWithRetry","minTimeout","forever","onFailedAttempt","err","includes","name","continue","done","CloudFront","createInvalidation","DistributionId","InvalidationBatch","CallerReference","Date","getTime","Paths","Quantity","length","Items","exports"],"sources":["InvalidateCacheTask.ts"],"sourcesContent":["import { ServiceDiscovery } from \"@webiny/api\";\nimport { CloudFront } from \"@webiny/aws-sdk/client-cloudfront\";\nimport { ITaskRunParams } from \"@webiny/tasks/types\";\nimport { FileManagerContext } from \"@webiny/api-file-manager/types\";\nimport { executeWithRetry } from \"@webiny/utils\";\nimport { ITaskResponseResult } from \"@webiny/tasks/response/abstractions\";\n\nclass ReturnContinue extends Error {}\n\nexport interface InvalidateCacheInput {\n /**\n * Caller of the task (e.g., `fm-before-update`, `fm-after-delete`).\n */\n caller: string;\n /**\n * Cache paths to invalidate.\n */\n paths: string[];\n}\n\nexport class InvalidateCloudfrontCacheTask {\n private continueIfCode = [\"TooManyInvalidationsInProgress\", \"Throttling\"];\n\n public async run({\n input,\n response,\n isCloseToTimeout\n }: ITaskRunParams<FileManagerContext, InvalidateCacheInput>): Promise<ITaskResponseResult> {\n const manifest = await ServiceDiscovery.load();\n\n if (!manifest) {\n return response.error({\n message: `Unable to invalidate cache due to a missing service manifest.`,\n code: \"MISSING_SERVICE_MANIFEST\",\n data: {\n manifest: \"api\"\n }\n });\n }\n\n const { distributionId } = manifest.api.cloudfront;\n\n const invalidateCache = () => {\n return this.invalidateCache(input.caller, distributionId as string, input.paths);\n };\n\n try {\n await executeWithRetry(invalidateCache, {\n minTimeout: 2000,\n forever: true,\n onFailedAttempt: err => {\n if (this.continueIfCode.includes(err.name)) {\n throw new ReturnContinue();\n }\n\n if (err.message.includes(\"not authorized to perform\")) {\n throw err;\n }\n\n if (isCloseToTimeout()) {\n throw new ReturnContinue();\n }\n }\n });\n } catch (error) {\n if (error instanceof ReturnContinue) {\n return response.continue(input);\n }\n\n return response.error({\n message: error.message,\n code: \"EXECUTE_WITH_RETRY_FAILED\",\n data: input.paths\n });\n }\n\n return response.done();\n }\n\n private async invalidateCache(\n caller: string,\n distributionId: string,\n paths: string[]\n ): Promise<void> {\n const cloudfront = new CloudFront();\n await cloudfront.createInvalidation({\n DistributionId: distributionId,\n InvalidationBatch: {\n CallerReference: `${new Date().getTime()}-${caller}`,\n Paths: {\n Quantity: paths.length,\n Items: paths\n }\n }\n });\n }\n}\n"],"mappings":";;;;;;AAAA,IAAAA,IAAA,GAAAC,OAAA;AACA,IAAAC,iBAAA,GAAAD,OAAA;AAGA,IAAAE,MAAA,GAAAF,OAAA;AAGA,MAAMG,cAAc,SAASC,KAAK,CAAC;AAa5B,MAAMC,6BAA6B,CAAC;EAC/BC,cAAc,GAAG,CAAC,gCAAgC,EAAE,YAAY,CAAC;EAEzE,MAAaC,GAAGA,CAAC;IACbC,KAAK;IACLC,QAAQ;IACRC;EACsD,CAAC,EAAgC;IACvF,MAAMC,QAAQ,GAAG,MAAMC,qBAAgB,CAACC,IAAI,CAAC,CAAC;IAE9C,IAAI,CAACF,QAAQ,EAAE;MACX,OAAOF,QAAQ,CAACK,KAAK,CAAC;QAClBC,OAAO,EAAG,+DAA8D;QACxEC,IAAI,EAAE,0BAA0B;QAChCC,IAAI,EAAE;UACFN,QAAQ,EAAE;QACd;MACJ,CAAC,CAAC;IACN;IAEA,MAAM;MAAEO;IAAe,CAAC,GAAGP,QAAQ,CAACQ,GAAG,CAACC,UAAU;IAElD,MAAMC,eAAe,GAAGA,CAAA,KAAM;MAC1B,OAAO,IAAI,CAACA,eAAe,CAACb,KAAK,CAACc,MAAM,EAAEJ,cAAc,EAAYV,KAAK,CAACe,KAAK,CAAC;IACpF,CAAC;IAED,IAAI;MACA,MAAM,IAAAC,uBAAgB,EAACH,eAAe,EAAE;QACpCI,UAAU,EAAE,IAAI;QAChBC,OAAO,EAAE,IAAI;QACbC,eAAe,EAAEC,GAAG,IAAI;UACpB,IAAI,IAAI,CAACtB,cAAc,CAACuB,QAAQ,CAACD,GAAG,CAACE,IAAI,CAAC,EAAE;YACxC,MAAM,IAAI3B,cAAc,CAAC,CAAC;UAC9B;UAEA,IAAIyB,GAAG,CAACb,OAAO,CAACc,QAAQ,CAAC,2BAA2B,CAAC,EAAE;YACnD,MAAMD,GAAG;UACb;UAEA,IAAIlB,gBAAgB,CAAC,CAAC,EAAE;YACpB,MAAM,IAAIP,cAAc,CAAC,CAAC;UAC9B;QACJ;MACJ,CAAC,CAAC;IACN,CAAC,CAAC,OAAOW,KAAK,EAAE;MACZ,IAAIA,KAAK,YAAYX,cAAc,EAAE;QACjC,OAAOM,QAAQ,CAACsB,QAAQ,CAACvB,KAAK,CAAC;MACnC;MAEA,OAAOC,QAAQ,CAACK,KAAK,CAAC;QAClBC,OAAO,EAAED,KAAK,CAACC,OAAO;QACtBC,IAAI,EAAE,2BAA2B;QACjCC,IAAI,EAAET,KAAK,CAACe;MAChB,CAAC,CAAC;IACN;IAEA,OAAOd,QAAQ,CAACuB,IAAI,CAAC,CAAC;EAC1B;EAEA,MAAcX,eAAeA,CACzBC,MAAc,EACdJ,cAAsB,EACtBK,KAAe,EACF;IACb,MAAMH,UAAU,GAAG,IAAIa,4BAAU,CAAC,CAAC;IACnC,MAAMb,UAAU,CAACc,kBAAkB,CAAC;MAChCC,cAAc,EAAEjB,cAAc;MAC9BkB,iBAAiB,EAAE;QACfC,eAAe,EAAG,GAAE,IAAIC,IAAI,CAAC,CAAC,CAACC,OAAO,CAAC,CAAE,IAAGjB,MAAO,EAAC;QACpDkB,KAAK,EAAE;UACHC,QAAQ,EAAElB,KAAK,CAACmB,MAAM;UACtBC,KAAK,EAAEpB;QACX;MACJ;IACJ,CAAC,CAAC;EACN;AACJ;AAACqB,OAAA,CAAAvC,6BAAA,GAAAA,6BAAA","ignoreList":[]}
1
+ {"version":3,"names":["_api","require","_clientCloudfront","_utils","ReturnContinue","Error","InvalidateCloudfrontCacheTask","continueIfCode","run","input","response","isCloseToTimeout","manifest","ServiceDiscovery","load","error","message","code","data","distributionId","api","cloudfront","invalidateCache","caller","paths","executeWithRetry","minTimeout","forever","onFailedAttempt","err","includes","name","continue","done","CloudFront","createInvalidation","DistributionId","InvalidationBatch","CallerReference","Date","getTime","Paths","Quantity","length","Items","exports"],"sources":["InvalidateCacheTask.ts"],"sourcesContent":["import { ServiceDiscovery } from \"@webiny/api\";\nimport { CloudFront } from \"@webiny/aws-sdk/client-cloudfront\";\nimport { ITaskRunParams } from \"@webiny/tasks/types\";\nimport { FileManagerContext } from \"@webiny/api-file-manager/types\";\nimport { executeWithRetry } from \"@webiny/utils\";\nimport { ITaskResponseResult } from \"@webiny/tasks/response/abstractions\";\n\nclass ReturnContinue extends Error {}\n\nexport interface InvalidateCacheInput {\n /**\n * Caller of the task (e.g., `fm-before-update`, `fm-after-delete`).\n */\n caller: string;\n /**\n * Cache paths to invalidate.\n */\n paths: string[];\n}\n\nexport class InvalidateCloudfrontCacheTask {\n private continueIfCode = [\"TooManyInvalidationsInProgress\", \"Throttling\"];\n\n public async run({\n input,\n response,\n isCloseToTimeout\n }: ITaskRunParams<FileManagerContext, InvalidateCacheInput>): Promise<ITaskResponseResult> {\n const manifest = await ServiceDiscovery.load();\n\n if (!manifest) {\n return response.error({\n message: `Unable to invalidate cache due to a missing service manifest.`,\n code: \"MISSING_SERVICE_MANIFEST\",\n data: {\n manifest: \"api\"\n }\n });\n }\n\n const { distributionId } = manifest.api.cloudfront;\n\n const invalidateCache = () => {\n return this.invalidateCache(input.caller, distributionId as string, input.paths);\n };\n\n try {\n await executeWithRetry(invalidateCache, {\n minTimeout: 2000,\n forever: true,\n onFailedAttempt: err => {\n if (this.continueIfCode.includes(err.name)) {\n throw new ReturnContinue();\n }\n\n if (err.message.includes(\"not authorized to perform\")) {\n throw err;\n }\n\n if (isCloseToTimeout()) {\n throw new ReturnContinue();\n }\n }\n });\n } catch (error) {\n if (error instanceof ReturnContinue) {\n return response.continue(input);\n }\n\n return response.error({\n message: error.message,\n code: \"EXECUTE_WITH_RETRY_FAILED\",\n data: input.paths\n });\n }\n\n return response.done();\n }\n\n private async invalidateCache(\n caller: string,\n distributionId: string,\n paths: string[]\n ): Promise<void> {\n const cloudfront = new CloudFront();\n await cloudfront.createInvalidation({\n DistributionId: distributionId,\n InvalidationBatch: {\n CallerReference: `${new Date().getTime()}-${caller}`,\n Paths: {\n Quantity: paths.length,\n Items: paths\n }\n }\n });\n }\n}\n"],"mappings":";;;;;;AAAA,IAAAA,IAAA,GAAAC,OAAA;AACA,IAAAC,iBAAA,GAAAD,OAAA;AAGA,IAAAE,MAAA,GAAAF,OAAA;AAGA,MAAMG,cAAc,SAASC,KAAK,CAAC;AAa5B,MAAMC,6BAA6B,CAAC;EAC/BC,cAAc,GAAG,CAAC,gCAAgC,EAAE,YAAY,CAAC;EAEzE,MAAaC,GAAGA,CAAC;IACbC,KAAK;IACLC,QAAQ;IACRC;EACsD,CAAC,EAAgC;IACvF,MAAMC,QAAQ,GAAG,MAAMC,qBAAgB,CAACC,IAAI,CAAC,CAAC;IAE9C,IAAI,CAACF,QAAQ,EAAE;MACX,OAAOF,QAAQ,CAACK,KAAK,CAAC;QAClBC,OAAO,EAAE,+DAA+D;QACxEC,IAAI,EAAE,0BAA0B;QAChCC,IAAI,EAAE;UACFN,QAAQ,EAAE;QACd;MACJ,CAAC,CAAC;IACN;IAEA,MAAM;MAAEO;IAAe,CAAC,GAAGP,QAAQ,CAACQ,GAAG,CAACC,UAAU;IAElD,MAAMC,eAAe,GAAGA,CAAA,KAAM;MAC1B,OAAO,IAAI,CAACA,eAAe,CAACb,KAAK,CAACc,MAAM,EAAEJ,cAAc,EAAYV,KAAK,CAACe,KAAK,CAAC;IACpF,CAAC;IAED,IAAI;MACA,MAAM,IAAAC,uBAAgB,EAACH,eAAe,EAAE;QACpCI,UAAU,EAAE,IAAI;QAChBC,OAAO,EAAE,IAAI;QACbC,eAAe,EAAEC,GAAG,IAAI;UACpB,IAAI,IAAI,CAACtB,cAAc,CAACuB,QAAQ,CAACD,GAAG,CAACE,IAAI,CAAC,EAAE;YACxC,MAAM,IAAI3B,cAAc,CAAC,CAAC;UAC9B;UAEA,IAAIyB,GAAG,CAACb,OAAO,CAACc,QAAQ,CAAC,2BAA2B,CAAC,EAAE;YACnD,MAAMD,GAAG;UACb;UAEA,IAAIlB,gBAAgB,CAAC,CAAC,EAAE;YACpB,MAAM,IAAIP,cAAc,CAAC,CAAC;UAC9B;QACJ;MACJ,CAAC,CAAC;IACN,CAAC,CAAC,OAAOW,KAAK,EAAE;MACZ,IAAIA,KAAK,YAAYX,cAAc,EAAE;QACjC,OAAOM,QAAQ,CAACsB,QAAQ,CAACvB,KAAK,CAAC;MACnC;MAEA,OAAOC,QAAQ,CAACK,KAAK,CAAC;QAClBC,OAAO,EAAED,KAAK,CAACC,OAAO;QACtBC,IAAI,EAAE,2BAA2B;QACjCC,IAAI,EAAET,KAAK,CAACe;MAChB,CAAC,CAAC;IACN;IAEA,OAAOd,QAAQ,CAACuB,IAAI,CAAC,CAAC;EAC1B;EAEA,MAAcX,eAAeA,CACzBC,MAAc,EACdJ,cAAsB,EACtBK,KAAe,EACF;IACb,MAAMH,UAAU,GAAG,IAAIa,4BAAU,CAAC,CAAC;IACnC,MAAMb,UAAU,CAACc,kBAAkB,CAAC;MAChCC,cAAc,EAAEjB,cAAc;MAC9BkB,iBAAiB,EAAE;QACfC,eAAe,EAAE,GAAG,IAAIC,IAAI,CAAC,CAAC,CAACC,OAAO,CAAC,CAAC,IAAIjB,MAAM,EAAE;QACpDkB,KAAK,EAAE;UACHC,QAAQ,EAAElB,KAAK,CAACmB,MAAM;UACtBC,KAAK,EAAEpB;QACX;MACJ;IACJ,CAAC,CAAC;EACN;AACJ;AAACqB,OAAA,CAAAvC,6BAAA,GAAAA,6BAAA","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webiny/api-file-manager-s3",
3
- "version": "5.41.4",
3
+ "version": "5.42.0-beta.0",
4
4
  "main": "index.js",
5
5
  "repository": {
6
6
  "type": "git",
@@ -10,20 +10,20 @@
10
10
  "author": "Webiny Ltd",
11
11
  "license": "MIT",
12
12
  "dependencies": {
13
- "@webiny/api": "5.41.4",
14
- "@webiny/api-file-manager": "5.41.4",
15
- "@webiny/api-security": "5.41.4",
16
- "@webiny/aws-sdk": "5.41.4",
17
- "@webiny/error": "5.41.4",
18
- "@webiny/handler": "5.41.4",
19
- "@webiny/handler-graphql": "5.41.4",
20
- "@webiny/plugins": "5.41.4",
21
- "@webiny/tasks": "5.41.4",
22
- "@webiny/utils": "5.41.4",
23
- "@webiny/validation": "5.41.4",
13
+ "@webiny/api": "5.42.0-beta.0",
14
+ "@webiny/api-file-manager": "5.42.0-beta.0",
15
+ "@webiny/api-security": "5.42.0-beta.0",
16
+ "@webiny/aws-sdk": "5.42.0-beta.0",
17
+ "@webiny/error": "5.42.0-beta.0",
18
+ "@webiny/handler": "5.42.0-beta.0",
19
+ "@webiny/handler-graphql": "5.42.0-beta.0",
20
+ "@webiny/plugins": "5.42.0-beta.0",
21
+ "@webiny/tasks": "5.42.0-beta.0",
22
+ "@webiny/utils": "5.42.0-beta.0",
23
+ "@webiny/validation": "5.42.0-beta.0",
24
24
  "form-data": "4.0.0",
25
25
  "mime": "3.0.0",
26
- "node-fetch": "2.7.0",
26
+ "node-fetch": "2.6.7",
27
27
  "object-hash": "3.0.0",
28
28
  "p-map": "4.0.0",
29
29
  "p-reduce": "2.1.0",
@@ -31,12 +31,10 @@
31
31
  "sharp": "0.32.6"
32
32
  },
33
33
  "devDependencies": {
34
- "@babel/cli": "7.24.1",
35
- "@babel/core": "7.24.3",
36
34
  "@types/node-fetch": "2.6.2",
37
- "@webiny/cli": "5.41.4",
38
- "@webiny/project-utils": "5.41.4",
39
- "rimraf": "5.0.5",
35
+ "@webiny/cli": "5.42.0-beta.0",
36
+ "@webiny/project-utils": "5.42.0-beta.0",
37
+ "rimraf": "6.0.1",
40
38
  "typescript": "4.9.5"
41
39
  },
42
40
  "publishConfig": {
@@ -47,5 +45,5 @@
47
45
  "build": "yarn webiny run build",
48
46
  "watch": "yarn webiny run watch"
49
47
  },
50
- "gitHead": "94922b33af59db5afe75127bb07443ce7f1448c4"
48
+ "gitHead": "ebf90f62ed3f28114ffdb012b7e5f80988af53d3"
51
49
  }
@@ -1 +1 @@
1
- {"version":3,"names":["_clientS","require","_api","_utils","MetadataWriter","constructor","bucket","write","files","s3","getS3","writers","map","file","writer","putObject","Bucket","Key","key","Body","JSON","stringify","getMetadata","ContentType","CacheControl","executeWithRetry","Promise","all","S3","region","process","env","AWS_REGION","id","tenant","locale","size","contentType","type","exports","addFileMetadata","ContextPlugin","context","metadataWriter","String","S3_BUCKET","fileManager","onFileAfterCreate","subscribe","onFileAfterBatchCreate"],"sources":["addFileMetadata.ts"],"sourcesContent":["import { S3 } from \"@webiny/aws-sdk/client-s3\";\nimport { ContextPlugin } from \"@webiny/api\";\nimport { FileManagerContext, File } from \"@webiny/api-file-manager/types\";\nimport { executeWithRetry } from \"@webiny/utils\";\n\nexport class MetadataWriter {\n private readonly bucket: string;\n\n constructor(bucket: string) {\n this.bucket = bucket;\n }\n\n async write(files: File[]) {\n const s3 = this.getS3();\n\n /**\n * We need to write each file with retry.\n */\n const writers = files.map(file => {\n const writer = () => {\n return s3.putObject({\n Bucket: this.bucket,\n Key: `${file.key}.metadata`,\n Body: JSON.stringify(this.getMetadata(file)),\n ContentType: \"application/json\",\n CacheControl: \"max-age=31536000\"\n });\n };\n\n return executeWithRetry(writer);\n });\n\n await Promise.all(writers);\n }\n\n private getS3() {\n return new S3({ region: process.env.AWS_REGION });\n }\n\n private getMetadata(file: File) {\n return {\n id: file.id,\n tenant: file.tenant,\n locale: file.locale,\n size: file.size,\n contentType: file.type\n };\n }\n}\n\nexport const addFileMetadata = () => {\n return new ContextPlugin<FileManagerContext>(context => {\n const metadataWriter = new MetadataWriter(String(process.env.S3_BUCKET));\n\n context.fileManager.onFileAfterCreate.subscribe(({ file }) => {\n return metadataWriter.write([file]);\n });\n\n context.fileManager.onFileAfterBatchCreate.subscribe(({ files }) => {\n return metadataWriter.write(files);\n });\n });\n};\n"],"mappings":";;;;;;AAAA,IAAAA,QAAA,GAAAC,OAAA;AACA,IAAAC,IAAA,GAAAD,OAAA;AAEA,IAAAE,MAAA,GAAAF,OAAA;AAEO,MAAMG,cAAc,CAAC;EAGxBC,WAAWA,CAACC,MAAc,EAAE;IACxB,IAAI,CAACA,MAAM,GAAGA,MAAM;EACxB;EAEA,MAAMC,KAAKA,CAACC,KAAa,EAAE;IACvB,MAAMC,EAAE,GAAG,IAAI,CAACC,KAAK,CAAC,CAAC;;IAEvB;AACR;AACA;IACQ,MAAMC,OAAO,GAAGH,KAAK,CAACI,GAAG,CAACC,IAAI,IAAI;MAC9B,MAAMC,MAAM,GAAGA,CAAA,KAAM;QACjB,OAAOL,EAAE,CAACM,SAAS,CAAC;UAChBC,MAAM,EAAE,IAAI,CAACV,MAAM;UACnBW,GAAG,EAAG,GAAEJ,IAAI,CAACK,GAAI,WAAU;UAC3BC,IAAI,EAAEC,IAAI,CAACC,SAAS,CAAC,IAAI,CAACC,WAAW,CAACT,IAAI,CAAC,CAAC;UAC5CU,WAAW,EAAE,kBAAkB;UAC/BC,YAAY,EAAE;QAClB,CAAC,CAAC;MACN,CAAC;MAED,OAAO,IAAAC,uBAAgB,EAACX,MAAM,CAAC;IACnC,CAAC,CAAC;IAEF,MAAMY,OAAO,CAACC,GAAG,CAAChB,OAAO,CAAC;EAC9B;EAEQD,KAAKA,CAAA,EAAG;IACZ,OAAO,IAAIkB,WAAE,CAAC;MAAEC,MAAM,EAAEC,OAAO,CAACC,GAAG,CAACC;IAAW,CAAC,CAAC;EACrD;EAEQV,WAAWA,CAACT,IAAU,EAAE;IAC5B,OAAO;MACHoB,EAAE,EAAEpB,IAAI,CAACoB,EAAE;MACXC,MAAM,EAAErB,IAAI,CAACqB,MAAM;MACnBC,MAAM,EAAEtB,IAAI,CAACsB,MAAM;MACnBC,IAAI,EAAEvB,IAAI,CAACuB,IAAI;MACfC,WAAW,EAAExB,IAAI,CAACyB;IACtB,CAAC;EACL;AACJ;AAACC,OAAA,CAAAnC,cAAA,GAAAA,cAAA;AAEM,MAAMoC,eAAe,GAAGA,CAAA,KAAM;EACjC,OAAO,IAAIC,kBAAa,CAAqBC,OAAO,IAAI;IACpD,MAAMC,cAAc,GAAG,IAAIvC,cAAc,CAACwC,MAAM,CAACd,OAAO,CAACC,GAAG,CAACc,SAAS,CAAC,CAAC;IAExEH,OAAO,CAACI,WAAW,CAACC,iBAAiB,CAACC,SAAS,CAAC,CAAC;MAAEnC;IAAK,CAAC,KAAK;MAC1D,OAAO8B,cAAc,CAACpC,KAAK,CAAC,CAACM,IAAI,CAAC,CAAC;IACvC,CAAC,CAAC;IAEF6B,OAAO,CAACI,WAAW,CAACG,sBAAsB,CAACD,SAAS,CAAC,CAAC;MAAExC;IAAM,CAAC,KAAK;MAChE,OAAOmC,cAAc,CAACpC,KAAK,CAACC,KAAK,CAAC;IACtC,CAAC,CAAC;EACN,CAAC,CAAC;AACN,CAAC;AAAC+B,OAAA,CAAAC,eAAA,GAAAA,eAAA","ignoreList":[]}
1
+ {"version":3,"names":["_clientS","require","_api","_utils","MetadataWriter","constructor","bucket","write","files","s3","getS3","writers","map","file","writer","putObject","Bucket","Key","key","Body","JSON","stringify","getMetadata","ContentType","CacheControl","executeWithRetry","Promise","all","S3","region","process","env","AWS_REGION","id","tenant","locale","size","contentType","type","exports","addFileMetadata","ContextPlugin","context","metadataWriter","String","S3_BUCKET","fileManager","onFileAfterCreate","subscribe","onFileAfterBatchCreate"],"sources":["addFileMetadata.ts"],"sourcesContent":["import { S3 } from \"@webiny/aws-sdk/client-s3\";\nimport { ContextPlugin } from \"@webiny/api\";\nimport { FileManagerContext, File } from \"@webiny/api-file-manager/types\";\nimport { executeWithRetry } from \"@webiny/utils\";\n\nexport class MetadataWriter {\n private readonly bucket: string;\n\n constructor(bucket: string) {\n this.bucket = bucket;\n }\n\n async write(files: File[]) {\n const s3 = this.getS3();\n\n /**\n * We need to write each file with retry.\n */\n const writers = files.map(file => {\n const writer = () => {\n return s3.putObject({\n Bucket: this.bucket,\n Key: `${file.key}.metadata`,\n Body: JSON.stringify(this.getMetadata(file)),\n ContentType: \"application/json\",\n CacheControl: \"max-age=31536000\"\n });\n };\n\n return executeWithRetry(writer);\n });\n\n await Promise.all(writers);\n }\n\n private getS3() {\n return new S3({ region: process.env.AWS_REGION });\n }\n\n private getMetadata(file: File) {\n return {\n id: file.id,\n tenant: file.tenant,\n locale: file.locale,\n size: file.size,\n contentType: file.type\n };\n }\n}\n\nexport const addFileMetadata = () => {\n return new ContextPlugin<FileManagerContext>(context => {\n const metadataWriter = new MetadataWriter(String(process.env.S3_BUCKET));\n\n context.fileManager.onFileAfterCreate.subscribe(({ file }) => {\n return metadataWriter.write([file]);\n });\n\n context.fileManager.onFileAfterBatchCreate.subscribe(({ files }) => {\n return metadataWriter.write(files);\n });\n });\n};\n"],"mappings":";;;;;;AAAA,IAAAA,QAAA,GAAAC,OAAA;AACA,IAAAC,IAAA,GAAAD,OAAA;AAEA,IAAAE,MAAA,GAAAF,OAAA;AAEO,MAAMG,cAAc,CAAC;EAGxBC,WAAWA,CAACC,MAAc,EAAE;IACxB,IAAI,CAACA,MAAM,GAAGA,MAAM;EACxB;EAEA,MAAMC,KAAKA,CAACC,KAAa,EAAE;IACvB,MAAMC,EAAE,GAAG,IAAI,CAACC,KAAK,CAAC,CAAC;;IAEvB;AACR;AACA;IACQ,MAAMC,OAAO,GAAGH,KAAK,CAACI,GAAG,CAACC,IAAI,IAAI;MAC9B,MAAMC,MAAM,GAAGA,CAAA,KAAM;QACjB,OAAOL,EAAE,CAACM,SAAS,CAAC;UAChBC,MAAM,EAAE,IAAI,CAACV,MAAM;UACnBW,GAAG,EAAE,GAAGJ,IAAI,CAACK,GAAG,WAAW;UAC3BC,IAAI,EAAEC,IAAI,CAACC,SAAS,CAAC,IAAI,CAACC,WAAW,CAACT,IAAI,CAAC,CAAC;UAC5CU,WAAW,EAAE,kBAAkB;UAC/BC,YAAY,EAAE;QAClB,CAAC,CAAC;MACN,CAAC;MAED,OAAO,IAAAC,uBAAgB,EAACX,MAAM,CAAC;IACnC,CAAC,CAAC;IAEF,MAAMY,OAAO,CAACC,GAAG,CAAChB,OAAO,CAAC;EAC9B;EAEQD,KAAKA,CAAA,EAAG;IACZ,OAAO,IAAIkB,WAAE,CAAC;MAAEC,MAAM,EAAEC,OAAO,CAACC,GAAG,CAACC;IAAW,CAAC,CAAC;EACrD;EAEQV,WAAWA,CAACT,IAAU,EAAE;IAC5B,OAAO;MACHoB,EAAE,EAAEpB,IAAI,CAACoB,EAAE;MACXC,MAAM,EAAErB,IAAI,CAACqB,MAAM;MACnBC,MAAM,EAAEtB,IAAI,CAACsB,MAAM;MACnBC,IAAI,EAAEvB,IAAI,CAACuB,IAAI;MACfC,WAAW,EAAExB,IAAI,CAACyB;IACtB,CAAC;EACL;AACJ;AAACC,OAAA,CAAAnC,cAAA,GAAAA,cAAA;AAEM,MAAMoC,eAAe,GAAGA,CAAA,KAAM;EACjC,OAAO,IAAIC,kBAAa,CAAqBC,OAAO,IAAI;IACpD,MAAMC,cAAc,GAAG,IAAIvC,cAAc,CAACwC,MAAM,CAACd,OAAO,CAACC,GAAG,CAACc,SAAS,CAAC,CAAC;IAExEH,OAAO,CAACI,WAAW,CAACC,iBAAiB,CAACC,SAAS,CAAC,CAAC;MAAEnC;IAAK,CAAC,KAAK;MAC1D,OAAO8B,cAAc,CAACpC,KAAK,CAAC,CAACM,IAAI,CAAC,CAAC;IACvC,CAAC,CAAC;IAEF6B,OAAO,CAACI,WAAW,CAACG,sBAAsB,CAACD,SAAS,CAAC,CAAC;MAAExC;IAAM,CAAC,KAAK;MAChE,OAAOmC,cAAc,CAACpC,KAAK,CAACC,KAAK,CAAC;IACtC,CAAC,CAAC;EACN,CAAC,CAAC;AACN,CAAC;AAAC+B,OAAA,CAAAC,eAAA,GAAAA,eAAA","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["_clientS","require","_pMap","_interopRequireDefault","_responses","_getPresignedPostPayload","_error","_checkPermissions","_CreateMultiPartUploadUseCase","_CompleteMultiPartUploadUseCase","_createFileNormalizerFromContext","plugin","type","name","schema","typeDefs","resolvers","FmQuery","getPreSignedPostPayload","_","args","context","checkPermissions","rwd","data","settings","fileManager","getSettings","WebinyError","file","normalizer","createFileNormalizerFromContext","presignedPayload","getPresignedPostPayload","normalizeFile","Response","e","ErrorResponse","message","code","getPreSignedPostPayloads","files","presignedPayloads","pMap","FmMutation","createMultiPartUpload","s3Client","S3","region","process","env","AWS_REGION","useCase","CreateMultiPartUploadUseCase","String","S3_BUCKET","multiPartUpload","execute","numberOfParts","completeMultiPartUpload","CompleteMultiPartUploadUseCase","fileKey","uploadId","_default","exports","default"],"sources":["graphqlFileStorageS3.ts"],"sourcesContent":["import { S3 } from \"@webiny/aws-sdk/client-s3\";\nimport pMap from \"p-map\";\nimport { GraphQLSchemaPlugin } from \"@webiny/handler-graphql/types\";\nimport { ErrorResponse, Response } from \"@webiny/handler-graphql/responses\";\nimport { FileManagerContext } from \"@webiny/api-file-manager/types\";\nimport { getPresignedPostPayload } from \"~/utils/getPresignedPostPayload\";\nimport WebinyError from \"@webiny/error\";\nimport { checkPermissions } from \"~/plugins/checkPermissions\";\nimport { PresignedPostPayloadData } from \"~/types\";\nimport { CreateMultiPartUploadUseCase } from \"~/multiPartUpload/CreateMultiPartUploadUseCase\";\nimport { CompleteMultiPartUploadUseCase } from \"~/multiPartUpload/CompleteMultiPartUploadUseCase\";\nimport { createFileNormalizerFromContext } from \"~/utils/createFileNormalizerFromContext\";\n\nconst plugin: GraphQLSchemaPlugin<FileManagerContext> = {\n type: \"graphql-schema\",\n name: \"graphql-schema-api-file-manager-s3\",\n schema: {\n typeDefs: /* GraphQL */ `\n type UploadFileResponseDataFile {\n id: ID!\n name: String!\n type: String!\n size: Long!\n key: String!\n }\n\n input PreSignedPostPayloadInput {\n name: String!\n type: String!\n size: Long!\n key: String\n keyPrefix: String\n }\n\n type GetPreSignedPostPayloadResponseDataFile {\n id: ID!\n name: String!\n type: String!\n size: Long!\n key: String!\n }\n\n type GetPreSignedPostPayloadResponseData {\n # Contains data that is necessary for initiating a file upload.\n data: JSON!\n file: UploadFileResponseDataFile!\n }\n\n type GetPreSignedPostPayloadResponse {\n error: FmError\n data: GetPreSignedPostPayloadResponseData\n }\n\n type MultiPartUploadFilePart {\n partNumber: Int!\n url: String!\n }\n\n type CreateMultiPartUploadResponseData {\n file: GetPreSignedPostPayloadResponseDataFile!\n uploadId: String!\n parts: [MultiPartUploadFilePart!]!\n }\n\n type CompleteMultiPartUploadResponse {\n data: Boolean\n error: FmError\n }\n\n type GetPreSignedPostPayloadsResponse {\n error: FmError\n data: [GetPreSignedPostPayloadResponseData!]!\n }\n\n extend type FmQuery {\n getPreSignedPostPayload(\n data: PreSignedPostPayloadInput!\n ): GetPreSignedPostPayloadResponse\n getPreSignedPostPayloads(\n data: [PreSignedPostPayloadInput]!\n ): GetPreSignedPostPayloadsResponse\n }\n\n type CreateMultiPartUploadResponse {\n data: CreateMultiPartUploadResponseData\n error: FmError\n }\n\n input MultiPartUploadFilePartInput {\n partNumber: Int!\n etag: String!\n }\n\n extend type FmMutation {\n createMultiPartUpload(\n data: PreSignedPostPayloadInput!\n numberOfParts: Number!\n ): CreateMultiPartUploadResponse\n\n completeMultiPartUpload(\n fileKey: String!\n uploadId: String!\n ): CompleteMultiPartUploadResponse\n }\n `,\n resolvers: {\n FmQuery: {\n getPreSignedPostPayload: async (_, args: any, context) => {\n try {\n await checkPermissions(context, { rwd: \"w\" });\n\n const data = args.data as PresignedPostPayloadData;\n\n const settings = await context.fileManager.getSettings();\n if (!settings) {\n throw new WebinyError(\n \"Missing File Manager Settings.\",\n \"FILE_MANAGER_SETTINGS_ERROR\",\n { file: data }\n );\n }\n\n const normalizer = createFileNormalizerFromContext(context);\n const presignedPayload = await getPresignedPostPayload(\n await normalizer.normalizeFile(data),\n settings\n );\n\n return new Response(presignedPayload);\n } catch (e) {\n return new ErrorResponse({\n message: e.message,\n code: e.code,\n data: e.data\n });\n }\n },\n getPreSignedPostPayloads: async (_, args, context) => {\n await checkPermissions(context, { rwd: \"w\" });\n\n const files = args.data as PresignedPostPayloadData[];\n\n try {\n const settings = await context.fileManager.getSettings();\n if (!settings) {\n throw new WebinyError(\n \"Missing File Manager Settings.\",\n \"FILE_MANAGER_SETTINGS_ERROR\",\n { files }\n );\n }\n\n const normalizer = createFileNormalizerFromContext(context);\n\n const presignedPayloads = await pMap(files, async data => {\n return getPresignedPostPayload(\n await normalizer.normalizeFile(data),\n settings\n );\n });\n\n return new Response(presignedPayloads);\n } catch (e) {\n return new ErrorResponse({\n message: e.message,\n code: e.code,\n data: e.data\n });\n }\n }\n },\n FmMutation: {\n createMultiPartUpload: async (_, args, context) => {\n await checkPermissions(context, { rwd: \"w\" });\n\n const s3Client = new S3({\n region: process.env.AWS_REGION\n });\n\n try {\n const useCase = new CreateMultiPartUploadUseCase(\n String(process.env.S3_BUCKET),\n s3Client\n );\n\n const normalizer = createFileNormalizerFromContext(context);\n\n const multiPartUpload = await useCase.execute({\n file: await normalizer.normalizeFile(args.data),\n numberOfParts: args.numberOfParts\n });\n\n return new Response(multiPartUpload);\n } catch (e) {\n return new ErrorResponse({\n message: e.message,\n code: e.code,\n data: e.data\n });\n }\n },\n completeMultiPartUpload: async (_, args, context) => {\n await checkPermissions(context, { rwd: \"w\" });\n\n const s3Client = new S3({\n region: process.env.AWS_REGION\n });\n\n try {\n const useCase = new CompleteMultiPartUploadUseCase(\n String(process.env.S3_BUCKET),\n s3Client\n );\n\n await useCase.execute({\n fileKey: args.fileKey,\n uploadId: args.uploadId\n });\n\n return new Response(true);\n } catch (e) {\n return new ErrorResponse({\n message: e.message,\n code: e.code,\n data: e.data\n });\n }\n }\n }\n }\n }\n};\n\nexport default plugin;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_clientS","require","_pMap","_interopRequireDefault","_responses","_getPresignedPostPayload","_error","_checkPermissions","_CreateMultiPartUploadUseCase","_CompleteMultiPartUploadUseCase","_createFileNormalizerFromContext","plugin","type","name","schema","typeDefs","resolvers","FmQuery","getPreSignedPostPayload","_","args","context","checkPermissions","rwd","data","settings","fileManager","getSettings","WebinyError","file","normalizer","createFileNormalizerFromContext","presignedPayload","getPresignedPostPayload","normalizeFile","Response","e","ErrorResponse","message","code","getPreSignedPostPayloads","files","presignedPayloads","pMap","FmMutation","createMultiPartUpload","s3Client","S3","region","process","env","AWS_REGION","useCase","CreateMultiPartUploadUseCase","String","S3_BUCKET","multiPartUpload","execute","numberOfParts","completeMultiPartUpload","CompleteMultiPartUploadUseCase","fileKey","uploadId","_default","exports","default"],"sources":["graphqlFileStorageS3.ts"],"sourcesContent":["import { S3 } from \"@webiny/aws-sdk/client-s3\";\nimport pMap from \"p-map\";\nimport { GraphQLSchemaPlugin } from \"@webiny/handler-graphql/types\";\nimport { ErrorResponse, Response } from \"@webiny/handler-graphql/responses\";\nimport { FileManagerContext } from \"@webiny/api-file-manager/types\";\nimport { getPresignedPostPayload } from \"~/utils/getPresignedPostPayload\";\nimport WebinyError from \"@webiny/error\";\nimport { checkPermissions } from \"~/plugins/checkPermissions\";\nimport { PresignedPostPayloadData } from \"~/types\";\nimport { CreateMultiPartUploadUseCase } from \"~/multiPartUpload/CreateMultiPartUploadUseCase\";\nimport { CompleteMultiPartUploadUseCase } from \"~/multiPartUpload/CompleteMultiPartUploadUseCase\";\nimport { createFileNormalizerFromContext } from \"~/utils/createFileNormalizerFromContext\";\n\nconst plugin: GraphQLSchemaPlugin<FileManagerContext> = {\n type: \"graphql-schema\",\n name: \"graphql-schema-api-file-manager-s3\",\n schema: {\n typeDefs: /* GraphQL */ `\n type UploadFileResponseDataFile {\n id: ID!\n name: String!\n type: String!\n size: Long!\n key: String!\n }\n\n input PreSignedPostPayloadInput {\n name: String!\n type: String!\n size: Long!\n key: String\n keyPrefix: String\n }\n\n type GetPreSignedPostPayloadResponseDataFile {\n id: ID!\n name: String!\n type: String!\n size: Long!\n key: String!\n }\n\n type GetPreSignedPostPayloadResponseData {\n # Contains data that is necessary for initiating a file upload.\n data: JSON!\n file: UploadFileResponseDataFile!\n }\n\n type GetPreSignedPostPayloadResponse {\n error: FmError\n data: GetPreSignedPostPayloadResponseData\n }\n\n type MultiPartUploadFilePart {\n partNumber: Int!\n url: String!\n }\n\n type CreateMultiPartUploadResponseData {\n file: GetPreSignedPostPayloadResponseDataFile!\n uploadId: String!\n parts: [MultiPartUploadFilePart!]!\n }\n\n type CompleteMultiPartUploadResponse {\n data: Boolean\n error: FmError\n }\n\n type GetPreSignedPostPayloadsResponse {\n error: FmError\n data: [GetPreSignedPostPayloadResponseData!]!\n }\n\n extend type FmQuery {\n getPreSignedPostPayload(\n data: PreSignedPostPayloadInput!\n ): GetPreSignedPostPayloadResponse\n getPreSignedPostPayloads(\n data: [PreSignedPostPayloadInput]!\n ): GetPreSignedPostPayloadsResponse\n }\n\n type CreateMultiPartUploadResponse {\n data: CreateMultiPartUploadResponseData\n error: FmError\n }\n\n input MultiPartUploadFilePartInput {\n partNumber: Int!\n etag: String!\n }\n\n extend type FmMutation {\n createMultiPartUpload(\n data: PreSignedPostPayloadInput!\n numberOfParts: Number!\n ): CreateMultiPartUploadResponse\n\n completeMultiPartUpload(\n fileKey: String!\n uploadId: String!\n ): CompleteMultiPartUploadResponse\n }\n `,\n resolvers: {\n FmQuery: {\n getPreSignedPostPayload: async (_, args: any, context) => {\n try {\n await checkPermissions(context, { rwd: \"w\" });\n\n const data = args.data as PresignedPostPayloadData;\n\n const settings = await context.fileManager.getSettings();\n if (!settings) {\n throw new WebinyError(\n \"Missing File Manager Settings.\",\n \"FILE_MANAGER_SETTINGS_ERROR\",\n { file: data }\n );\n }\n\n const normalizer = createFileNormalizerFromContext(context);\n const presignedPayload = await getPresignedPostPayload(\n await normalizer.normalizeFile(data),\n settings\n );\n\n return new Response(presignedPayload);\n } catch (e) {\n return new ErrorResponse({\n message: e.message,\n code: e.code,\n data: e.data\n });\n }\n },\n getPreSignedPostPayloads: async (_, args, context) => {\n await checkPermissions(context, { rwd: \"w\" });\n\n const files = args.data as PresignedPostPayloadData[];\n\n try {\n const settings = await context.fileManager.getSettings();\n if (!settings) {\n throw new WebinyError(\n \"Missing File Manager Settings.\",\n \"FILE_MANAGER_SETTINGS_ERROR\",\n { files }\n );\n }\n\n const normalizer = createFileNormalizerFromContext(context);\n\n const presignedPayloads = await pMap(files, async data => {\n return getPresignedPostPayload(\n await normalizer.normalizeFile(data),\n settings\n );\n });\n\n return new Response(presignedPayloads);\n } catch (e) {\n return new ErrorResponse({\n message: e.message,\n code: e.code,\n data: e.data\n });\n }\n }\n },\n FmMutation: {\n createMultiPartUpload: async (_, args, context) => {\n await checkPermissions(context, { rwd: \"w\" });\n\n const s3Client = new S3({\n region: process.env.AWS_REGION\n });\n\n try {\n const useCase = new CreateMultiPartUploadUseCase(\n String(process.env.S3_BUCKET),\n s3Client\n );\n\n const normalizer = createFileNormalizerFromContext(context);\n\n const multiPartUpload = await useCase.execute({\n file: await normalizer.normalizeFile(args.data),\n numberOfParts: args.numberOfParts\n });\n\n return new Response(multiPartUpload);\n } catch (e) {\n return new ErrorResponse({\n message: e.message,\n code: e.code,\n data: e.data\n });\n }\n },\n completeMultiPartUpload: async (_, args, context) => {\n await checkPermissions(context, { rwd: \"w\" });\n\n const s3Client = new S3({\n region: process.env.AWS_REGION\n });\n\n try {\n const useCase = new CompleteMultiPartUploadUseCase(\n String(process.env.S3_BUCKET),\n s3Client\n );\n\n await useCase.execute({\n fileKey: args.fileKey,\n uploadId: args.uploadId\n });\n\n return new Response(true);\n } catch (e) {\n return new ErrorResponse({\n message: e.message,\n code: e.code,\n data: e.data\n });\n }\n }\n }\n }\n }\n};\n\nexport default plugin;\n"],"mappings":"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","ignoreList":[]}