@webiny/api-file-manager 0.0.0-mt-2 → 0.0.0-unstable.085ff6572f

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 (182) hide show
  1. package/FileManagerContextSetup.d.ts +13 -0
  2. package/FileManagerContextSetup.js +113 -0
  3. package/FileManagerContextSetup.js.map +1 -0
  4. package/cmsFileStorage/CmsFilesStorage.d.ts +27 -0
  5. package/cmsFileStorage/CmsFilesStorage.js +173 -0
  6. package/cmsFileStorage/CmsFilesStorage.js.map +1 -0
  7. package/cmsFileStorage/ListFilesWhereProcessor.d.ts +7 -0
  8. package/cmsFileStorage/ListFilesWhereProcessor.js +35 -0
  9. package/cmsFileStorage/ListFilesWhereProcessor.js.map +1 -0
  10. package/cmsFileStorage/ListTagsWhereProcessor.d.ts +7 -0
  11. package/cmsFileStorage/ListTagsWhereProcessor.js +35 -0
  12. package/cmsFileStorage/ListTagsWhereProcessor.js.map +1 -0
  13. package/cmsFileStorage/createFileManagerPlugins.d.ts +5 -0
  14. package/cmsFileStorage/createFileManagerPlugins.js +34 -0
  15. package/cmsFileStorage/createFileManagerPlugins.js.map +1 -0
  16. package/cmsFileStorage/createModelField.d.ts +5 -0
  17. package/cmsFileStorage/createModelField.js +37 -0
  18. package/cmsFileStorage/createModelField.js.map +1 -0
  19. package/cmsFileStorage/file.model.d.ts +4 -0
  20. package/cmsFileStorage/file.model.js +118 -0
  21. package/cmsFileStorage/file.model.js.map +1 -0
  22. package/cmsFileStorage/isInstallationPending.d.ts +4 -0
  23. package/cmsFileStorage/isInstallationPending.js +21 -0
  24. package/cmsFileStorage/isInstallationPending.js.map +1 -0
  25. package/contants.d.ts +1 -0
  26. package/contants.js +8 -0
  27. package/contants.js.map +1 -0
  28. package/createFileManager/files.crud.d.ts +3 -0
  29. package/createFileManager/files.crud.js +300 -0
  30. package/createFileManager/files.crud.js.map +1 -0
  31. package/createFileManager/filevalidation.disabled.d.ts +0 -0
  32. package/createFileManager/filevalidation.disabled.js +55 -0
  33. package/createFileManager/filevalidation.disabled.js.map +1 -0
  34. package/createFileManager/index.d.ts +15 -0
  35. package/createFileManager/index.js +20 -0
  36. package/createFileManager/index.js.map +1 -0
  37. package/createFileManager/permissions/FilesPermissions.d.ts +4 -0
  38. package/createFileManager/permissions/FilesPermissions.js +9 -0
  39. package/createFileManager/permissions/FilesPermissions.js.map +1 -0
  40. package/createFileManager/settings.crud.d.ts +3 -0
  41. package/createFileManager/settings.crud.js +91 -0
  42. package/createFileManager/settings.crud.js.map +1 -0
  43. package/createFileManager/system.crud.d.ts +3 -0
  44. package/createFileManager/system.crud.js +86 -0
  45. package/createFileManager/system.crud.js.map +1 -0
  46. package/graphql/baseSchema.d.ts +3 -0
  47. package/graphql/baseSchema.js +117 -0
  48. package/graphql/baseSchema.js.map +1 -0
  49. package/graphql/createFilesTypeDefs.d.ts +7 -0
  50. package/graphql/createFilesTypeDefs.js +162 -0
  51. package/graphql/createFilesTypeDefs.js.map +1 -0
  52. package/graphql/filesSchema.d.ts +4 -0
  53. package/graphql/filesSchema.js +83 -0
  54. package/graphql/filesSchema.js.map +1 -0
  55. package/graphql/index.d.ts +3 -0
  56. package/graphql/index.js +33 -0
  57. package/graphql/index.js.map +1 -0
  58. package/graphql/utils.d.ts +11 -0
  59. package/graphql/utils.js +22 -0
  60. package/graphql/utils.js.map +1 -0
  61. package/handlers/download/byAlias.d.ts +6 -0
  62. package/handlers/download/byAlias.js +89 -0
  63. package/handlers/download/byAlias.js.map +1 -0
  64. package/handlers/download/byExactKey.d.ts +2 -0
  65. package/handlers/download/byExactKey.js +57 -0
  66. package/handlers/download/byExactKey.js.map +1 -0
  67. package/handlers/download/extractFileInformation.d.ts +9 -0
  68. package/handlers/download/extractFileInformation.js +20 -0
  69. package/handlers/download/extractFileInformation.js.map +1 -0
  70. package/handlers/download/getS3Object.d.ts +10 -0
  71. package/handlers/download/getS3Object.js +60 -0
  72. package/handlers/download/getS3Object.js.map +1 -0
  73. package/handlers/download/index.d.ts +2 -3
  74. package/handlers/download/index.js +20 -118
  75. package/handlers/download/index.js.map +1 -0
  76. package/handlers/manage/index.d.ts +5 -3
  77. package/handlers/manage/index.js +43 -58
  78. package/handlers/manage/index.js.map +1 -0
  79. package/handlers/transform/index.d.ts +2 -3
  80. package/handlers/transform/index.js +71 -78
  81. package/handlers/transform/index.js.map +1 -0
  82. package/handlers/transform/legacyUtils.d.ts +17 -0
  83. package/handlers/transform/legacyUtils.js +42 -0
  84. package/handlers/transform/legacyUtils.js.map +1 -0
  85. package/handlers/transform/loaders/imageLoader.d.ts +26 -9
  86. package/handlers/transform/loaders/imageLoader.js +13 -25
  87. package/handlers/transform/loaders/imageLoader.js.map +1 -0
  88. package/handlers/transform/loaders/index.d.ts +4 -9
  89. package/handlers/transform/loaders/index.js +1 -4
  90. package/handlers/transform/loaders/index.js.map +1 -0
  91. package/handlers/transform/loaders/sanitizeImageTransformations.d.ts +7 -3
  92. package/handlers/transform/loaders/sanitizeImageTransformations.js +24 -30
  93. package/handlers/transform/loaders/sanitizeImageTransformations.js.map +1 -0
  94. package/handlers/transform/managers/imageManager.d.ts +12 -6
  95. package/handlers/transform/managers/imageManager.js +46 -27
  96. package/handlers/transform/managers/imageManager.js.map +1 -0
  97. package/handlers/transform/managers/index.d.ts +2 -6
  98. package/handlers/transform/managers/index.js +1 -4
  99. package/handlers/transform/managers/index.js.map +1 -0
  100. package/handlers/transform/optimizeImage.d.ts +2 -1
  101. package/handlers/transform/optimizeImage.js +4 -7
  102. package/handlers/transform/optimizeImage.js.map +1 -0
  103. package/handlers/transform/transformImage.d.ts +5 -4
  104. package/handlers/transform/transformImage.js +4 -9
  105. package/handlers/transform/transformImage.js.map +1 -0
  106. package/handlers/transform/utils.d.ts +2 -2
  107. package/handlers/transform/utils.js +8 -18
  108. package/handlers/transform/utils.js.map +1 -0
  109. package/handlers/types.d.ts +8 -0
  110. package/handlers/types.js +5 -0
  111. package/handlers/types.js.map +1 -0
  112. package/handlers/utils/getEnvironment.js +0 -2
  113. package/handlers/utils/getEnvironment.js.map +1 -0
  114. package/handlers/utils/getObjectParams.d.ts +3 -4
  115. package/handlers/utils/getObjectParams.js +1 -7
  116. package/handlers/utils/getObjectParams.js.map +1 -0
  117. package/handlers/utils/index.d.ts +0 -1
  118. package/handlers/utils/index.js +1 -12
  119. package/handlers/utils/index.js.map +1 -0
  120. package/index.d.ts +7 -0
  121. package/index.js +52 -0
  122. package/index.js.map +1 -0
  123. package/modelModifier/CmsModelModifier.d.ts +24 -0
  124. package/modelModifier/CmsModelModifier.js +59 -0
  125. package/modelModifier/CmsModelModifier.js.map +1 -0
  126. package/package.json +32 -32
  127. package/plugins/FilePhysicalStoragePlugin.d.ts +21 -0
  128. package/plugins/{definitions/FilePhysicalStoragePlugin.js → FilePhysicalStoragePlugin.js} +1 -12
  129. package/plugins/FilePhysicalStoragePlugin.js.map +1 -0
  130. package/plugins/{definitions/FileStorageTransformPlugin.d.ts → FileStorageTransformPlugin.d.ts} +10 -10
  131. package/plugins/{definitions/FileStorageTransformPlugin.js → FileStorageTransformPlugin.js} +2 -13
  132. package/plugins/FileStorageTransformPlugin.js.map +1 -0
  133. package/plugins/index.d.ts +2 -2
  134. package/plugins/index.js +22 -19
  135. package/plugins/index.js.map +1 -0
  136. package/storage/FileStorage.d.ts +32 -0
  137. package/storage/FileStorage.js +86 -0
  138. package/storage/FileStorage.js.map +1 -0
  139. package/types/file.d.ts +37 -0
  140. package/types/file.js +5 -0
  141. package/types/file.js.map +1 -0
  142. package/types/file.lifecycle.d.ts +44 -0
  143. package/types/file.lifecycle.js +5 -0
  144. package/types/file.lifecycle.js.map +1 -0
  145. package/types.d.ts +76 -83
  146. package/types.js +22 -0
  147. package/types.js.map +1 -0
  148. package/handlers/utils/createHandler.d.ts +0 -24
  149. package/handlers/utils/createHandler.js +0 -68
  150. package/plugins/crud/files/validation.d.ts +0 -3
  151. package/plugins/crud/files/validation.js +0 -41
  152. package/plugins/crud/files.crud.d.ts +0 -4
  153. package/plugins/crud/files.crud.js +0 -427
  154. package/plugins/crud/settings.crud.d.ts +0 -5
  155. package/plugins/crud/settings.crud.js +0 -115
  156. package/plugins/crud/system.crud.d.ts +0 -4
  157. package/plugins/crud/system.crud.js +0 -145
  158. package/plugins/crud/utils/checkBasePermissions.d.ts +0 -5
  159. package/plugins/crud/utils/checkBasePermissions.js +0 -33
  160. package/plugins/crud/utils/createFileModel.d.ts +0 -2
  161. package/plugins/crud/utils/createFileModel.js +0 -64
  162. package/plugins/crud/utils/lifecycleEvents.d.ts +0 -6
  163. package/plugins/crud/utils/lifecycleEvents.js +0 -33
  164. package/plugins/definitions/FilePhysicalStoragePlugin.d.ts +0 -22
  165. package/plugins/definitions/FilePlugin.d.ts +0 -133
  166. package/plugins/definitions/FilePlugin.js +0 -64
  167. package/plugins/definitions/FilesStorageOperationsProviderPlugin.d.ts +0 -9
  168. package/plugins/definitions/FilesStorageOperationsProviderPlugin.js +0 -17
  169. package/plugins/definitions/InstallationPlugin.d.ts +0 -19
  170. package/plugins/definitions/InstallationPlugin.js +0 -40
  171. package/plugins/definitions/SettingsStorageOperationsProviderPlugin.d.ts +0 -9
  172. package/plugins/definitions/SettingsStorageOperationsProviderPlugin.js +0 -17
  173. package/plugins/definitions/SystemStorageOperationsProviderPlugin.d.ts +0 -9
  174. package/plugins/definitions/SystemStorageOperationsProviderPlugin.js +0 -17
  175. package/plugins/graphql.d.ts +0 -4
  176. package/plugins/graphql.js +0 -274
  177. package/plugins/storage/FileStorage.d.ts +0 -31
  178. package/plugins/storage/FileStorage.js +0 -95
  179. package/plugins/storage/index.d.ts +0 -4
  180. package/plugins/storage/index.js +0 -22
  181. package/utils.d.ts +0 -4
  182. package/utils.js +0 -16
@@ -0,0 +1,3 @@
1
+ import { ContextPlugin } from "@webiny/api";
2
+ import { FileManagerContext } from "../types";
3
+ export declare const createGraphQLSchemaPlugin: () => (import("@webiny/handler-graphql").GraphQLSchemaPlugin<FileManagerContext> | ContextPlugin<FileManagerContext>)[];
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createGraphQLSchemaPlugin = void 0;
7
+ var _baseSchema = require("./baseSchema");
8
+ var _api = require("@webiny/api");
9
+ var _createFieldTypePluginRecords = require("@webiny/api-headless-cms/graphql/schema/createFieldTypePluginRecords");
10
+ var _filesSchema = require("./filesSchema");
11
+ var _isInstallationPending = require("../cmsFileStorage/isInstallationPending");
12
+ const createGraphQLSchemaPlugin = () => {
13
+ return [(0, _baseSchema.createBaseSchema)(),
14
+ // Files schema is generated dynamically, based on a CMS model, so we need to
15
+ // register it from a ContextPlugin, to perform additional bootstrap.
16
+ new _api.ContextPlugin(async context => {
17
+ if ((0, _isInstallationPending.isInstallationPending)(context)) {
18
+ return;
19
+ }
20
+ await context.security.withoutAuthorization(async () => {
21
+ const fileModel = await context.cms.getModel("fmFile");
22
+ const models = await context.cms.listModels();
23
+ const fieldPlugins = (0, _createFieldTypePluginRecords.createFieldTypePluginRecords)(context.plugins);
24
+ const graphQlPlugin = (0, _filesSchema.createFilesSchema)({
25
+ model: fileModel,
26
+ models,
27
+ plugins: fieldPlugins
28
+ });
29
+ context.plugins.register(graphQlPlugin);
30
+ });
31
+ })];
32
+ };
33
+ exports.createGraphQLSchemaPlugin = createGraphQLSchemaPlugin;
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createGraphQLSchemaPlugin","createBaseSchema","ContextPlugin","context","isInstallationPending","security","withoutAuthorization","fileModel","cms","getModel","models","listModels","fieldPlugins","createFieldTypePluginRecords","plugins","graphQlPlugin","createFilesSchema","model","register"],"sources":["index.ts"],"sourcesContent":["import { createBaseSchema } from \"~/graphql/baseSchema\";\nimport { ContextPlugin } from \"@webiny/api\";\nimport { FileManagerContext } from \"~/types\";\nimport { CmsModel } from \"@webiny/api-headless-cms/types\";\nimport { createFieldTypePluginRecords } from \"@webiny/api-headless-cms/graphql/schema/createFieldTypePluginRecords\";\nimport { createFilesSchema } from \"~/graphql/filesSchema\";\nimport { isInstallationPending } from \"~/cmsFileStorage/isInstallationPending\";\n\nexport const createGraphQLSchemaPlugin = () => {\n return [\n createBaseSchema(),\n // Files schema is generated dynamically, based on a CMS model, so we need to\n // register it from a ContextPlugin, to perform additional bootstrap.\n new ContextPlugin<FileManagerContext>(async context => {\n if (isInstallationPending(context)) {\n return;\n }\n\n await context.security.withoutAuthorization(async () => {\n const fileModel = (await context.cms.getModel(\"fmFile\")) as CmsModel;\n const models = await context.cms.listModels();\n const fieldPlugins = createFieldTypePluginRecords(context.plugins);\n\n const graphQlPlugin = createFilesSchema({\n model: fileModel,\n models,\n plugins: fieldPlugins\n });\n\n context.plugins.register(graphQlPlugin);\n });\n })\n ];\n};\n"],"mappings":";;;;;;AAAA;AACA;AAGA;AACA;AACA;AAEO,MAAMA,yBAAyB,GAAG,MAAM;EAC3C,OAAO,CACH,IAAAC,4BAAgB,GAAE;EAClB;EACA;EACA,IAAIC,kBAAa,CAAqB,MAAMC,OAAO,IAAI;IACnD,IAAI,IAAAC,4CAAqB,EAACD,OAAO,CAAC,EAAE;MAChC;IACJ;IAEA,MAAMA,OAAO,CAACE,QAAQ,CAACC,oBAAoB,CAAC,YAAY;MACpD,MAAMC,SAAS,GAAI,MAAMJ,OAAO,CAACK,GAAG,CAACC,QAAQ,CAAC,QAAQ,CAAc;MACpE,MAAMC,MAAM,GAAG,MAAMP,OAAO,CAACK,GAAG,CAACG,UAAU,EAAE;MAC7C,MAAMC,YAAY,GAAG,IAAAC,0DAA4B,EAACV,OAAO,CAACW,OAAO,CAAC;MAElE,MAAMC,aAAa,GAAG,IAAAC,8BAAiB,EAAC;QACpCC,KAAK,EAAEV,SAAS;QAChBG,MAAM;QACNI,OAAO,EAAEF;MACb,CAAC,CAAC;MAEFT,OAAO,CAACW,OAAO,CAACI,QAAQ,CAACH,aAAa,CAAC;IAC3C,CAAC,CAAC;EACN,CAAC,CAAC,CACL;AACL,CAAC;AAAC"}
@@ -0,0 +1,11 @@
1
+ import { Response, ErrorResponse } from "@webiny/handler-graphql";
2
+ export declare const emptyResolver: () => {};
3
+ /**
4
+ * Use any because it really can be any.
5
+ * TODO @ts-refactor maybe use generics at some point?
6
+ */
7
+ interface ResolveCallable {
8
+ (): Promise<any>;
9
+ }
10
+ export declare const resolve: (fn: ResolveCallable) => Promise<ErrorResponse | Response<any>>;
11
+ export {};
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.resolve = exports.emptyResolver = void 0;
7
+ var _handlerGraphql = require("@webiny/handler-graphql");
8
+ const emptyResolver = () => ({});
9
+
10
+ /**
11
+ * Use any because it really can be any.
12
+ * TODO @ts-refactor maybe use generics at some point?
13
+ */
14
+ exports.emptyResolver = emptyResolver;
15
+ const resolve = async fn => {
16
+ try {
17
+ return new _handlerGraphql.Response(await fn());
18
+ } catch (e) {
19
+ return new _handlerGraphql.ErrorResponse(e);
20
+ }
21
+ };
22
+ exports.resolve = resolve;
@@ -0,0 +1 @@
1
+ {"version":3,"names":["emptyResolver","resolve","fn","Response","e","ErrorResponse"],"sources":["utils.ts"],"sourcesContent":["import { Response, ErrorResponse } from \"@webiny/handler-graphql\";\n\nexport const emptyResolver = () => ({});\n\n/**\n * Use any because it really can be any.\n * TODO @ts-refactor maybe use generics at some point?\n */\ninterface ResolveCallable {\n (): Promise<any>;\n}\n\nexport const resolve = async (fn: ResolveCallable) => {\n try {\n return new Response(await fn());\n } catch (e) {\n return new ErrorResponse(e);\n }\n};\n"],"mappings":";;;;;;AAAA;AAEO,MAAMA,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC;;AAEvC;AACA;AACA;AACA;AAHA;AAQO,MAAMC,OAAO,GAAG,MAAOC,EAAmB,IAAK;EAClD,IAAI;IACA,OAAO,IAAIC,wBAAQ,CAAC,MAAMD,EAAE,EAAE,CAAC;EACnC,CAAC,CAAC,OAAOE,CAAC,EAAE;IACR,OAAO,IAAIC,6BAAa,CAACD,CAAC,CAAC;EAC/B;AACJ,CAAC;AAAC"}
@@ -0,0 +1,6 @@
1
+ import { DocumentClient } from "aws-sdk/clients/dynamodb";
2
+ import { RoutePlugin } from "@webiny/handler-aws/gateway";
3
+ export interface DownloadByFileAliasConfig {
4
+ documentClient: DocumentClient;
5
+ }
6
+ export declare const createDownloadFileByAliasPlugins: ({ documentClient }: DownloadByFileAliasConfig) => RoutePlugin<import("@webiny/handler/types").Context>[];
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.createDownloadFileByAliasPlugins = void 0;
8
+ var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
9
+ var _s = _interopRequireDefault(require("aws-sdk/clients/s3"));
10
+ var _utils = require("../utils");
11
+ var _gateway = require("@webiny/handler-aws/gateway");
12
+ var _extractFileInformation = require("./extractFileInformation");
13
+ var _getS3Object = require("./getS3Object");
14
+ const DEFAULT_CACHE_MAX_AGE = 30758400; // 1 year
15
+ const PRESIGNED_URL_EXPIRATION = 900; // 15 minutes
16
+
17
+ const createDownloadFileByAliasPlugins = ({
18
+ documentClient
19
+ }) => {
20
+ async function getFileByAlias(tenant, alias) {
21
+ const {
22
+ Items,
23
+ Count
24
+ } = await documentClient.query({
25
+ TableName: String(process.env.DB_TABLE),
26
+ IndexName: "GSI1",
27
+ Limit: 1,
28
+ KeyConditionExpression: "GSI1_PK = :GSI1_PK AND GSI1_SK = :GSI1_SK",
29
+ ExpressionAttributeValues: {
30
+ ":GSI1_PK": `T#${tenant}#FM#FILE_ALIASES`,
31
+ ":GSI1_SK": `/${alias}`
32
+ }
33
+ }).promise();
34
+ if (!Items || Count === 0) {
35
+ return null;
36
+ }
37
+ return Items[0].data.key ?? null;
38
+ }
39
+ return [new _gateway.RoutePlugin(({
40
+ onGet,
41
+ context
42
+ }) => {
43
+ onGet("/*", async (request, reply) => {
44
+ const {
45
+ region
46
+ } = (0, _utils.getEnvironment)();
47
+ const fileInfo = (0, _extractFileInformation.extractFileInformation)(request);
48
+
49
+ // TODO: `root` tenant is hardcoded for now, to satisfy the basic use case.
50
+ // We need to find a way to send tenant via `x-tenant` header, when images are being requested from
51
+ // the frontend (website, admin, etc.) by alias.
52
+ const realFilename = await getFileByAlias("root", fileInfo.filename);
53
+ if (!realFilename) {
54
+ return reply.code(404).type("text/html").send("Not Found");
55
+ }
56
+ const s3 = new _s.default({
57
+ region
58
+ });
59
+ const {
60
+ params,
61
+ object
62
+ } = await (0, _getS3Object.getS3Object)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, fileInfo), {}, {
63
+ filename: realFilename
64
+ }), s3, context);
65
+
66
+ // If there's an "object", it means we can return its body directly.
67
+ if (object) {
68
+ return reply.headers({
69
+ "Content-Type": object.ContentType,
70
+ "Cache-Control": `public, max-age=${DEFAULT_CACHE_MAX_AGE}`,
71
+ "x-webiny-base64-encoded": true
72
+ }).send(object.Body || "");
73
+ }
74
+ const presignedUrl = s3.getSignedUrl("getObject", {
75
+ Bucket: params.Bucket,
76
+ Key: params.Key,
77
+ Expires: PRESIGNED_URL_EXPIRATION
78
+ });
79
+
80
+ // Lambda can return max 6MB of content, so if our object's size is larger, we are sending
81
+ // a 301 Redirect, redirecting the user to the public URL of the object in S3.
82
+ return reply.code(301).headers({
83
+ Location: presignedUrl,
84
+ "Cache-Control": "public, max-age=" + PRESIGNED_URL_EXPIRATION
85
+ }).send("");
86
+ });
87
+ })];
88
+ };
89
+ exports.createDownloadFileByAliasPlugins = createDownloadFileByAliasPlugins;
@@ -0,0 +1 @@
1
+ {"version":3,"names":["DEFAULT_CACHE_MAX_AGE","PRESIGNED_URL_EXPIRATION","createDownloadFileByAliasPlugins","documentClient","getFileByAlias","tenant","alias","Items","Count","query","TableName","String","process","env","DB_TABLE","IndexName","Limit","KeyConditionExpression","ExpressionAttributeValues","promise","data","key","RoutePlugin","onGet","context","request","reply","region","getEnvironment","fileInfo","extractFileInformation","realFilename","filename","code","type","send","s3","S3","params","object","getS3Object","headers","ContentType","Body","presignedUrl","getSignedUrl","Bucket","Key","Expires","Location"],"sources":["byAlias.ts"],"sourcesContent":["import S3 from \"aws-sdk/clients/s3\";\nimport { DocumentClient } from \"aws-sdk/clients/dynamodb\";\nimport { getEnvironment } from \"../utils\";\nimport { RoutePlugin } from \"@webiny/handler-aws/gateway\";\nimport { extractFileInformation } from \"./extractFileInformation\";\nimport { getS3Object } from \"./getS3Object\";\n\nconst DEFAULT_CACHE_MAX_AGE = 30758400; // 1 year\nconst PRESIGNED_URL_EXPIRATION = 900; // 15 minutes\n\nexport interface DownloadByFileAliasConfig {\n documentClient: DocumentClient;\n}\n\nexport const createDownloadFileByAliasPlugins = ({ documentClient }: DownloadByFileAliasConfig) => {\n async function getFileByAlias(tenant: string, alias: string): Promise<string | null> {\n const { Items, Count } = await documentClient\n .query({\n TableName: String(process.env.DB_TABLE),\n IndexName: \"GSI1\",\n Limit: 1,\n KeyConditionExpression: \"GSI1_PK = :GSI1_PK AND GSI1_SK = :GSI1_SK\",\n ExpressionAttributeValues: {\n \":GSI1_PK\": `T#${tenant}#FM#FILE_ALIASES`,\n \":GSI1_SK\": `/${alias}`\n }\n })\n .promise();\n\n if (!Items || Count === 0) {\n return null;\n }\n\n return Items[0].data.key ?? null;\n }\n\n return [\n new RoutePlugin(({ onGet, context }) => {\n onGet(\"/*\", async (request, reply) => {\n const { region } = getEnvironment();\n const fileInfo = extractFileInformation(request);\n\n // TODO: `root` tenant is hardcoded for now, to satisfy the basic use case.\n // We need to find a way to send tenant via `x-tenant` header, when images are being requested from\n // the frontend (website, admin, etc.) by alias.\n const realFilename = await getFileByAlias(\"root\", fileInfo.filename);\n\n if (!realFilename) {\n return reply.code(404).type(\"text/html\").send(\"Not Found\");\n }\n\n const s3 = new S3({ region });\n const { params, object } = await getS3Object(\n { ...fileInfo, filename: realFilename },\n s3,\n context\n );\n\n // If there's an \"object\", it means we can return its body directly.\n if (object) {\n return reply\n .headers({\n \"Content-Type\": object.ContentType,\n \"Cache-Control\": `public, max-age=${DEFAULT_CACHE_MAX_AGE}`,\n \"x-webiny-base64-encoded\": true\n })\n .send(object.Body || \"\");\n }\n\n const presignedUrl = s3.getSignedUrl(\"getObject\", {\n Bucket: params.Bucket,\n Key: params.Key,\n Expires: PRESIGNED_URL_EXPIRATION\n });\n\n // Lambda can return max 6MB of content, so if our object's size is larger, we are sending\n // a 301 Redirect, redirecting the user to the public URL of the object in S3.\n return reply\n .code(301)\n .headers({\n Location: presignedUrl,\n \"Cache-Control\": \"public, max-age=\" + PRESIGNED_URL_EXPIRATION\n })\n .send(\"\");\n });\n })\n ];\n};\n"],"mappings":";;;;;;;;AAAA;AAEA;AACA;AACA;AACA;AAEA,MAAMA,qBAAqB,GAAG,QAAQ,CAAC,CAAC;AACxC,MAAMC,wBAAwB,GAAG,GAAG,CAAC,CAAC;;AAM/B,MAAMC,gCAAgC,GAAG,CAAC;EAAEC;AAA0C,CAAC,KAAK;EAC/F,eAAeC,cAAc,CAACC,MAAc,EAAEC,KAAa,EAA0B;IACjF,MAAM;MAAEC,KAAK;MAAEC;IAAM,CAAC,GAAG,MAAML,cAAc,CACxCM,KAAK,CAAC;MACHC,SAAS,EAAEC,MAAM,CAACC,OAAO,CAACC,GAAG,CAACC,QAAQ,CAAC;MACvCC,SAAS,EAAE,MAAM;MACjBC,KAAK,EAAE,CAAC;MACRC,sBAAsB,EAAE,2CAA2C;MACnEC,yBAAyB,EAAE;QACvB,UAAU,EAAG,KAAIb,MAAO,kBAAiB;QACzC,UAAU,EAAG,IAAGC,KAAM;MAC1B;IACJ,CAAC,CAAC,CACDa,OAAO,EAAE;IAEd,IAAI,CAACZ,KAAK,IAAIC,KAAK,KAAK,CAAC,EAAE;MACvB,OAAO,IAAI;IACf;IAEA,OAAOD,KAAK,CAAC,CAAC,CAAC,CAACa,IAAI,CAACC,GAAG,IAAI,IAAI;EACpC;EAEA,OAAO,CACH,IAAIC,oBAAW,CAAC,CAAC;IAAEC,KAAK;IAAEC;EAAQ,CAAC,KAAK;IACpCD,KAAK,CAAC,IAAI,EAAE,OAAOE,OAAO,EAAEC,KAAK,KAAK;MAClC,MAAM;QAAEC;MAAO,CAAC,GAAG,IAAAC,qBAAc,GAAE;MACnC,MAAMC,QAAQ,GAAG,IAAAC,8CAAsB,EAACL,OAAO,CAAC;;MAEhD;MACA;MACA;MACA,MAAMM,YAAY,GAAG,MAAM3B,cAAc,CAAC,MAAM,EAAEyB,QAAQ,CAACG,QAAQ,CAAC;MAEpE,IAAI,CAACD,YAAY,EAAE;QACf,OAAOL,KAAK,CAACO,IAAI,CAAC,GAAG,CAAC,CAACC,IAAI,CAAC,WAAW,CAAC,CAACC,IAAI,CAAC,WAAW,CAAC;MAC9D;MAEA,MAAMC,EAAE,GAAG,IAAIC,UAAE,CAAC;QAAEV;MAAO,CAAC,CAAC;MAC7B,MAAM;QAAEW,MAAM;QAAEC;MAAO,CAAC,GAAG,MAAM,IAAAC,wBAAW,8DACnCX,QAAQ;QAAEG,QAAQ,EAAED;MAAY,IACrCK,EAAE,EACFZ,OAAO,CACV;;MAED;MACA,IAAIe,MAAM,EAAE;QACR,OAAOb,KAAK,CACPe,OAAO,CAAC;UACL,cAAc,EAAEF,MAAM,CAACG,WAAW;UAClC,eAAe,EAAG,mBAAkB1C,qBAAsB,EAAC;UAC3D,yBAAyB,EAAE;QAC/B,CAAC,CAAC,CACDmC,IAAI,CAACI,MAAM,CAACI,IAAI,IAAI,EAAE,CAAC;MAChC;MAEA,MAAMC,YAAY,GAAGR,EAAE,CAACS,YAAY,CAAC,WAAW,EAAE;QAC9CC,MAAM,EAAER,MAAM,CAACQ,MAAM;QACrBC,GAAG,EAAET,MAAM,CAACS,GAAG;QACfC,OAAO,EAAE/C;MACb,CAAC,CAAC;;MAEF;MACA;MACA,OAAOyB,KAAK,CACPO,IAAI,CAAC,GAAG,CAAC,CACTQ,OAAO,CAAC;QACLQ,QAAQ,EAAEL,YAAY;QACtB,eAAe,EAAE,kBAAkB,GAAG3C;MAC1C,CAAC,CAAC,CACDkC,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC,CAAC;EACN,CAAC,CAAC,CACL;AACL,CAAC;AAAC"}
@@ -0,0 +1,2 @@
1
+ import { RoutePlugin } from "@webiny/handler-aws/gateway";
2
+ export declare const createDownloadFileByExactKeyPlugins: () => RoutePlugin<import("@webiny/handler/types").Context>[];
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.createDownloadFileByExactKeyPlugins = void 0;
8
+ var _s = _interopRequireDefault(require("aws-sdk/clients/s3"));
9
+ var _utils = require("../utils");
10
+ var _gateway = require("@webiny/handler-aws/gateway");
11
+ var _getS3Object = require("./getS3Object");
12
+ var _extractFileInformation = require("./extractFileInformation");
13
+ const DEFAULT_CACHE_MAX_AGE = 30758400; // 1 year
14
+ const PRESIGNED_URL_EXPIRATION = 900; // 15 minutes
15
+
16
+ const createDownloadFileByExactKeyPlugins = () => {
17
+ return [new _gateway.RoutePlugin(({
18
+ onGet,
19
+ context
20
+ }) => {
21
+ onGet("/files/*", async (request, reply) => {
22
+ const {
23
+ region
24
+ } = (0, _utils.getEnvironment)();
25
+ const fileInfo = (0, _extractFileInformation.extractFileInformation)(request);
26
+ const s3 = new _s.default({
27
+ region
28
+ });
29
+ const {
30
+ params,
31
+ object
32
+ } = await (0, _getS3Object.getS3Object)(fileInfo, s3, context);
33
+
34
+ // If there's an "object", it means we can return its body directly.
35
+ if (object) {
36
+ return reply.headers({
37
+ "Content-Type": object.ContentType,
38
+ "Cache-Control": `public, max-age=${DEFAULT_CACHE_MAX_AGE}`,
39
+ "x-webiny-base64-encoded": true
40
+ }).send(object.Body || "");
41
+ }
42
+ const presignedUrl = s3.getSignedUrl("getObject", {
43
+ Bucket: params.Bucket,
44
+ Key: params.Key,
45
+ Expires: PRESIGNED_URL_EXPIRATION
46
+ });
47
+
48
+ // Lambda can return max 6MB of content, so if our object's size is larger, we are sending
49
+ // a 301 Redirect, redirecting the user to the public URL of the object in S3.
50
+ return reply.code(301).headers({
51
+ Location: presignedUrl,
52
+ "Cache-Control": "public, max-age=" + PRESIGNED_URL_EXPIRATION
53
+ }).send("");
54
+ });
55
+ })];
56
+ };
57
+ exports.createDownloadFileByExactKeyPlugins = createDownloadFileByExactKeyPlugins;
@@ -0,0 +1 @@
1
+ {"version":3,"names":["DEFAULT_CACHE_MAX_AGE","PRESIGNED_URL_EXPIRATION","createDownloadFileByExactKeyPlugins","RoutePlugin","onGet","context","request","reply","region","getEnvironment","fileInfo","extractFileInformation","s3","S3","params","object","getS3Object","headers","ContentType","send","Body","presignedUrl","getSignedUrl","Bucket","Key","Expires","code","Location"],"sources":["byExactKey.ts"],"sourcesContent":["import S3 from \"aws-sdk/clients/s3\";\nimport { getEnvironment } from \"../utils\";\nimport { RoutePlugin } from \"@webiny/handler-aws/gateway\";\nimport { getS3Object } from \"~/handlers/download/getS3Object\";\nimport { extractFileInformation } from \"~/handlers/download/extractFileInformation\";\n\nconst DEFAULT_CACHE_MAX_AGE = 30758400; // 1 year\nconst PRESIGNED_URL_EXPIRATION = 900; // 15 minutes\n\nexport const createDownloadFileByExactKeyPlugins = () => {\n return [\n new RoutePlugin(({ onGet, context }) => {\n onGet(\"/files/*\", async (request, reply) => {\n const { region } = getEnvironment();\n const fileInfo = extractFileInformation(request);\n const s3 = new S3({ region });\n\n const { params, object } = await getS3Object(fileInfo, s3, context);\n\n // If there's an \"object\", it means we can return its body directly.\n if (object) {\n return reply\n .headers({\n \"Content-Type\": object.ContentType,\n \"Cache-Control\": `public, max-age=${DEFAULT_CACHE_MAX_AGE}`,\n \"x-webiny-base64-encoded\": true\n })\n .send(object.Body || \"\");\n }\n\n const presignedUrl = s3.getSignedUrl(\"getObject\", {\n Bucket: params.Bucket,\n Key: params.Key,\n Expires: PRESIGNED_URL_EXPIRATION\n });\n\n // Lambda can return max 6MB of content, so if our object's size is larger, we are sending\n // a 301 Redirect, redirecting the user to the public URL of the object in S3.\n return reply\n .code(301)\n .headers({\n Location: presignedUrl,\n \"Cache-Control\": \"public, max-age=\" + PRESIGNED_URL_EXPIRATION\n })\n .send(\"\");\n });\n })\n ];\n};\n"],"mappings":";;;;;;;AAAA;AACA;AACA;AACA;AACA;AAEA,MAAMA,qBAAqB,GAAG,QAAQ,CAAC,CAAC;AACxC,MAAMC,wBAAwB,GAAG,GAAG,CAAC,CAAC;;AAE/B,MAAMC,mCAAmC,GAAG,MAAM;EACrD,OAAO,CACH,IAAIC,oBAAW,CAAC,CAAC;IAAEC,KAAK;IAAEC;EAAQ,CAAC,KAAK;IACpCD,KAAK,CAAC,UAAU,EAAE,OAAOE,OAAO,EAAEC,KAAK,KAAK;MACxC,MAAM;QAAEC;MAAO,CAAC,GAAG,IAAAC,qBAAc,GAAE;MACnC,MAAMC,QAAQ,GAAG,IAAAC,8CAAsB,EAACL,OAAO,CAAC;MAChD,MAAMM,EAAE,GAAG,IAAIC,UAAE,CAAC;QAAEL;MAAO,CAAC,CAAC;MAE7B,MAAM;QAAEM,MAAM;QAAEC;MAAO,CAAC,GAAG,MAAM,IAAAC,wBAAW,EAACN,QAAQ,EAAEE,EAAE,EAAEP,OAAO,CAAC;;MAEnE;MACA,IAAIU,MAAM,EAAE;QACR,OAAOR,KAAK,CACPU,OAAO,CAAC;UACL,cAAc,EAAEF,MAAM,CAACG,WAAW;UAClC,eAAe,EAAG,mBAAkBlB,qBAAsB,EAAC;UAC3D,yBAAyB,EAAE;QAC/B,CAAC,CAAC,CACDmB,IAAI,CAACJ,MAAM,CAACK,IAAI,IAAI,EAAE,CAAC;MAChC;MAEA,MAAMC,YAAY,GAAGT,EAAE,CAACU,YAAY,CAAC,WAAW,EAAE;QAC9CC,MAAM,EAAET,MAAM,CAACS,MAAM;QACrBC,GAAG,EAAEV,MAAM,CAACU,GAAG;QACfC,OAAO,EAAExB;MACb,CAAC,CAAC;;MAEF;MACA;MACA,OAAOM,KAAK,CACPmB,IAAI,CAAC,GAAG,CAAC,CACTT,OAAO,CAAC;QACLU,QAAQ,EAAEN,YAAY;QACtB,eAAe,EAAE,kBAAkB,GAAGpB;MAC1C,CAAC,CAAC,CACDkB,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC,CAAC;EACN,CAAC,CAAC,CACL;AACL,CAAC;AAAC"}
@@ -0,0 +1,9 @@
1
+ import { Request } from "@webiny/handler/types";
2
+ /**
3
+ * Based on given request path, extracts file key and additional options sent via query params.
4
+ */
5
+ export declare const extractFileInformation: (request: Request) => {
6
+ filename: string;
7
+ options: any;
8
+ extension: string;
9
+ };
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.extractFileInformation = void 0;
8
+ var _path = _interopRequireDefault(require("path"));
9
+ /**
10
+ * Based on given request path, extracts file key and additional options sent via query params.
11
+ */
12
+ const extractFileInformation = request => {
13
+ const path = request.params["*"];
14
+ return {
15
+ filename: decodeURI(path),
16
+ options: request.query,
17
+ extension: _path.default.extname(path)
18
+ };
19
+ };
20
+ exports.extractFileInformation = extractFileInformation;
@@ -0,0 +1 @@
1
+ {"version":3,"names":["extractFileInformation","request","path","params","filename","decodeURI","options","query","extension","pathLib","extname"],"sources":["extractFileInformation.ts"],"sourcesContent":["import pathLib from \"path\";\nimport { Request } from \"@webiny/handler/types\";\n\n/**\n * Based on given request path, extracts file key and additional options sent via query params.\n */\nexport const extractFileInformation = (request: Request) => {\n const path = (request.params as any)[\"*\"];\n return {\n filename: decodeURI(path),\n options: request.query as any,\n extension: pathLib.extname(path)\n };\n};\n"],"mappings":";;;;;;;AAAA;AAGA;AACA;AACA;AACO,MAAMA,sBAAsB,GAAIC,OAAgB,IAAK;EACxD,MAAMC,IAAI,GAAID,OAAO,CAACE,MAAM,CAAS,GAAG,CAAC;EACzC,OAAO;IACHC,QAAQ,EAAEC,SAAS,CAACH,IAAI,CAAC;IACzBI,OAAO,EAAEL,OAAO,CAACM,KAAY;IAC7BC,SAAS,EAAEC,aAAO,CAACC,OAAO,CAACR,IAAI;EACnC,CAAC;AACL,CAAC;AAAC"}
@@ -0,0 +1,10 @@
1
+ import S3 from "aws-sdk/clients/s3";
2
+ import { Context } from "@webiny/handler/types";
3
+ import { ObjectParamsResponse } from "../utils/getObjectParams";
4
+ import { extractFileInformation } from "./extractFileInformation";
5
+ interface S3Object {
6
+ object?: S3.Types.GetObjectOutput;
7
+ params: ObjectParamsResponse;
8
+ }
9
+ export declare const getS3Object: (fileInfo: ReturnType<typeof extractFileInformation>, s3: S3, context: Context) => Promise<S3Object>;
10
+ export {};
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.getS3Object = void 0;
8
+ var _utils = require("../utils");
9
+ var _loaders = _interopRequireDefault(require("../transform/loaders"));
10
+ const MAX_RETURN_CONTENT_LENGTH = 5000000; // ~4.77MB
11
+
12
+ const getS3Object = async (fileInfo, s3, context) => {
13
+ const {
14
+ filename,
15
+ options,
16
+ extension
17
+ } = fileInfo;
18
+ const params = (0, _utils.getObjectParams)(filename);
19
+ const objectHead = await s3.headObject(params).promise();
20
+ const contentLength = objectHead.ContentLength ? objectHead.ContentLength : 0;
21
+ const applyLoaders = options.original === undefined;
22
+ if (applyLoaders) {
23
+ for (const loader of _loaders.default) {
24
+ const canProcess = loader.canProcess({
25
+ context,
26
+ s3,
27
+ options,
28
+ file: {
29
+ name: filename,
30
+ extension,
31
+ contentLength
32
+ }
33
+ });
34
+ if (!canProcess) {
35
+ continue;
36
+ }
37
+ return loader.process({
38
+ context,
39
+ s3,
40
+ options,
41
+ file: {
42
+ name: filename,
43
+ extension,
44
+ contentLength
45
+ }
46
+ });
47
+ }
48
+ }
49
+
50
+ // If no processors handled the file request, just return the S3 object taking its size into consideration.
51
+ let object;
52
+ if (contentLength < MAX_RETURN_CONTENT_LENGTH) {
53
+ object = await s3.getObject(params).promise();
54
+ }
55
+ return {
56
+ object,
57
+ params
58
+ };
59
+ };
60
+ exports.getS3Object = getS3Object;
@@ -0,0 +1 @@
1
+ {"version":3,"names":["MAX_RETURN_CONTENT_LENGTH","getS3Object","fileInfo","s3","context","filename","options","extension","params","getObjectParams","objectHead","headObject","promise","contentLength","ContentLength","applyLoaders","original","undefined","loader","loaders","canProcess","file","name","process","object","getObject"],"sources":["getS3Object.ts"],"sourcesContent":["import S3 from \"aws-sdk/clients/s3\";\nimport { Context } from \"@webiny/handler/types\";\nimport { getObjectParams } from \"~/handlers/utils\";\nimport loaders from \"~/handlers/transform/loaders\";\nimport { ObjectParamsResponse } from \"~/handlers/utils/getObjectParams\";\nimport { extractFileInformation } from \"./extractFileInformation\";\n\ninterface S3Object {\n object?: S3.Types.GetObjectOutput;\n params: ObjectParamsResponse;\n}\n\nconst MAX_RETURN_CONTENT_LENGTH = 5000000; // ~4.77MB\n\nexport const getS3Object = async (\n fileInfo: ReturnType<typeof extractFileInformation>,\n s3: S3,\n context: Context\n): Promise<S3Object> => {\n const { filename, options, extension } = fileInfo;\n const params = getObjectParams(filename);\n\n const objectHead = await s3.headObject(params).promise();\n const contentLength = objectHead.ContentLength ? objectHead.ContentLength : 0;\n\n const applyLoaders = options.original === undefined;\n\n if (applyLoaders) {\n for (const loader of loaders) {\n const canProcess = loader.canProcess({\n context,\n s3,\n options,\n file: {\n name: filename,\n extension,\n contentLength\n }\n });\n\n if (!canProcess) {\n continue;\n }\n return loader.process({\n context,\n s3,\n options,\n file: {\n name: filename,\n extension,\n contentLength\n }\n });\n }\n }\n\n // If no processors handled the file request, just return the S3 object taking its size into consideration.\n let object;\n if (contentLength < MAX_RETURN_CONTENT_LENGTH) {\n object = await s3.getObject(params).promise();\n }\n\n return { object, params };\n};\n"],"mappings":";;;;;;;AAEA;AACA;AASA,MAAMA,yBAAyB,GAAG,OAAO,CAAC,CAAC;;AAEpC,MAAMC,WAAW,GAAG,OACvBC,QAAmD,EACnDC,EAAM,EACNC,OAAgB,KACI;EACpB,MAAM;IAAEC,QAAQ;IAAEC,OAAO;IAAEC;EAAU,CAAC,GAAGL,QAAQ;EACjD,MAAMM,MAAM,GAAG,IAAAC,sBAAe,EAACJ,QAAQ,CAAC;EAExC,MAAMK,UAAU,GAAG,MAAMP,EAAE,CAACQ,UAAU,CAACH,MAAM,CAAC,CAACI,OAAO,EAAE;EACxD,MAAMC,aAAa,GAAGH,UAAU,CAACI,aAAa,GAAGJ,UAAU,CAACI,aAAa,GAAG,CAAC;EAE7E,MAAMC,YAAY,GAAGT,OAAO,CAACU,QAAQ,KAAKC,SAAS;EAEnD,IAAIF,YAAY,EAAE;IACd,KAAK,MAAMG,MAAM,IAAIC,gBAAO,EAAE;MAC1B,MAAMC,UAAU,GAAGF,MAAM,CAACE,UAAU,CAAC;QACjChB,OAAO;QACPD,EAAE;QACFG,OAAO;QACPe,IAAI,EAAE;UACFC,IAAI,EAAEjB,QAAQ;UACdE,SAAS;UACTM;QACJ;MACJ,CAAC,CAAC;MAEF,IAAI,CAACO,UAAU,EAAE;QACb;MACJ;MACA,OAAOF,MAAM,CAACK,OAAO,CAAC;QAClBnB,OAAO;QACPD,EAAE;QACFG,OAAO;QACPe,IAAI,EAAE;UACFC,IAAI,EAAEjB,QAAQ;UACdE,SAAS;UACTM;QACJ;MACJ,CAAC,CAAC;IACN;EACJ;;EAEA;EACA,IAAIW,MAAM;EACV,IAAIX,aAAa,GAAGb,yBAAyB,EAAE;IAC3CwB,MAAM,GAAG,MAAMrB,EAAE,CAACsB,SAAS,CAACjB,MAAM,CAAC,CAACI,OAAO,EAAE;EACjD;EAEA,OAAO;IAAEY,MAAM;IAAEhB;EAAO,CAAC;AAC7B,CAAC;AAAC"}
@@ -1,3 +1,2 @@
1
- import { HandlerPlugin } from "@webiny/handler/types";
2
- declare const _default: () => HandlerPlugin;
3
- export default _default;
1
+ export * from "./byExactKey";
2
+ export * from "./byAlias";
@@ -1,125 +1,27 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
3
  Object.defineProperty(exports, "__esModule", {
6
4
  value: true
7
5
  });
8
- exports.default = void 0;
9
-
10
- var _s = _interopRequireDefault(require("aws-sdk/clients/s3"));
11
-
12
- var _sanitizeFilename = _interopRequireDefault(require("sanitize-filename"));
13
-
14
- var _path = _interopRequireDefault(require("path"));
15
-
16
- var _utils = require("../utils");
17
-
18
- var _loaders = _interopRequireDefault(require("../transform/loaders"));
19
-
20
- const MAX_RETURN_CONTENT_LENGTH = 5000000; // ~4.77MB
21
-
22
- const DEFAULT_CACHE_MAX_AGE = 30758400; // 1 year
23
-
24
- /**
25
- * Based on given path, extracts file key and additional options sent via query params.
26
- * @param event
27
- */
28
-
29
- const extractFilenameOptions = event => {
30
- const path = (0, _sanitizeFilename.default)(event.pathParameters.path);
31
- return {
32
- filename: decodeURI(path),
33
- options: event.queryStringParameters,
34
- extension: _path.default.extname(path)
35
- };
36
- };
37
-
38
- const getS3Object = async (event, s3, context) => {
39
- const {
40
- options,
41
- filename,
42
- extension
43
- } = extractFilenameOptions(event);
44
-
45
- for (let i = 0; i < _loaders.default.length; i++) {
46
- const loader = _loaders.default[i];
47
- const canProcess = loader.canProcess({
48
- context,
49
- s3,
50
- options,
51
- file: {
52
- name: filename,
53
- extension
54
- }
55
- });
56
-
57
- if (canProcess) {
58
- return loader.process({
59
- context,
60
- s3,
61
- options,
62
- file: {
63
- name: filename,
64
- extension
65
- }
66
- });
6
+ var _byExactKey = require("./byExactKey");
7
+ Object.keys(_byExactKey).forEach(function (key) {
8
+ if (key === "default" || key === "__esModule") return;
9
+ if (key in exports && exports[key] === _byExactKey[key]) return;
10
+ Object.defineProperty(exports, key, {
11
+ enumerable: true,
12
+ get: function () {
13
+ return _byExactKey[key];
67
14
  }
68
- } // If no processors handled the file request, just return the S3 object by default.
69
-
70
-
71
- const params = (0, _utils.getObjectParams)(filename);
72
- return {
73
- object: await s3.getObject(params).promise(),
74
- params: params
75
- };
76
- };
77
-
78
- var _default = () => ({
79
- type: "handler",
80
- name: "handler-download-file",
81
-
82
- async handle(context) {
83
- const event = context.invocationArgs;
84
- const handler = (0, _utils.createHandler)(async event => {
85
- const {
86
- region
87
- } = (0, _utils.getEnvironment)();
88
- const s3 = new _s.default({
89
- region
90
- });
91
- const {
92
- params,
93
- object
94
- } = await getS3Object(event, s3, context);
95
-
96
- if (object.ContentLength < MAX_RETURN_CONTENT_LENGTH) {
97
- return {
98
- data: object.Body,
99
- headers: {
100
- "Content-Type": object.ContentType,
101
- "Cache-Control": "public, max-age=" + DEFAULT_CACHE_MAX_AGE
102
- }
103
- };
104
- } // Lambda can return max 6MB of content, so if our object's size is larger, we are sending
105
- // a 301 Redirect, redirecting the user to the public URL of the object in S3.
106
-
107
-
108
- await s3.putObjectAcl({
109
- Bucket: params.Bucket,
110
- ACL: "public-read",
111
- Key: params.Key
112
- }).promise();
113
- return {
114
- statusCode: 301,
115
- headers: {
116
- Location: `https://${params.Bucket}.s3.amazonaws.com/${params.Key}`
117
- }
118
- };
119
- });
120
- return await handler(event);
121
- }
122
-
15
+ });
123
16
  });
124
-
125
- exports.default = _default;
17
+ var _byAlias = require("./byAlias");
18
+ Object.keys(_byAlias).forEach(function (key) {
19
+ if (key === "default" || key === "__esModule") return;
20
+ if (key in exports && exports[key] === _byAlias[key]) return;
21
+ Object.defineProperty(exports, key, {
22
+ enumerable: true,
23
+ get: function () {
24
+ return _byAlias[key];
25
+ }
26
+ });
27
+ });
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["index.ts"],"sourcesContent":["export * from \"./byExactKey\";\nexport * from \"./byAlias\";\n"],"mappings":";;;;;AAAA;AAAA;EAAA;EAAA;EAAA;IAAA;IAAA;MAAA;IAAA;EAAA;AAAA;AACA;AAAA;EAAA;EAAA;EAAA;IAAA;IAAA;MAAA;IAAA;EAAA;AAAA"}
@@ -1,3 +1,5 @@
1
- import { HandlerPlugin } from "@webiny/handler/types";
2
- declare const _default: () => HandlerPlugin;
3
- export default _default;
1
+ import { S3EventHandler } from "@webiny/handler-aws";
2
+ /**
3
+ * This handler must be run through @webiny/handler-aws/s3
4
+ */
5
+ export declare const createManageFilePlugins: () => S3EventHandler<void>[];