From 2b880a34912944ce79b2d5331c9ef557d35a05eb Mon Sep 17 00:00:00 2001 From: Jan Varho Date: Wed, 28 Apr 2021 17:50:15 +0300 Subject: [PATCH 1/2] Create separate module for S3 client --- packages/libs/lambda-at-edge/rollup.config.js | 4 +++- packages/libs/lambda-at-edge/src/build.ts | 11 ++++++++++- packages/libs/lambda-at-edge/src/default-handler.ts | 10 +++------- packages/libs/lambda-at-edge/src/s3-client.ts | 9 +++++++++ packages/libs/lambda-at-edge/tsconfig.build.json | 3 ++- packages/libs/lambda-at-edge/tsconfig.bundle.json | 7 ++++++- 6 files changed, 33 insertions(+), 11 deletions(-) create mode 100644 packages/libs/lambda-at-edge/src/s3-client.ts diff --git a/packages/libs/lambda-at-edge/rollup.config.js b/packages/libs/lambda-at-edge/rollup.config.js index e397b117a9..e641892f49 100644 --- a/packages/libs/lambda-at-edge/rollup.config.js +++ b/packages/libs/lambda-at-edge/rollup.config.js @@ -47,5 +47,7 @@ export default [ { filename: "api-handler", minify: false }, { filename: "api-handler", minify: true }, { filename: "image-handler", minify: false }, - { filename: "image-handler", minify: true } + { filename: "image-handler", minify: true }, + { filename: "s3-client", minify: false }, + { filename: "s3-client", minify: true } ].map(generateConfig); diff --git a/packages/libs/lambda-at-edge/src/build.ts b/packages/libs/lambda-at-edge/src/build.ts index 3b80720c67..d0c8378bb7 100644 --- a/packages/libs/lambda-at-edge/src/build.ts +++ b/packages/libs/lambda-at-edge/src/build.ts @@ -230,7 +230,11 @@ class Builder { * @param shouldMinify */ async processAndCopyHandler( - handlerType: "api-handler" | "default-handler" | "image-handler", + handlerType: + | "api-handler" + | "default-handler" + | "image-handler" + | "s3-client", destination: string, shouldMinify: boolean ) { @@ -298,6 +302,11 @@ class Builder { join(this.outputDir, DEFAULT_LAMBDA_CODE_DIR, "index.js"), !!this.buildOptions.minifyHandlers ), + this.processAndCopyHandler( + "s3-client", + join(this.outputDir, DEFAULT_LAMBDA_CODE_DIR, "s3-client.js"), + !!this.buildOptions.minifyHandlers + ), this.buildOptions?.handler ? fse.copy( join(this.nextConfigDir, this.buildOptions.handler), diff --git a/packages/libs/lambda-at-edge/src/default-handler.ts b/packages/libs/lambda-at-edge/src/default-handler.ts index 0d79be48ce..24436b5649 100644 --- a/packages/libs/lambda-at-edge/src/default-handler.ts +++ b/packages/libs/lambda-at-edge/src/default-handler.ts @@ -620,7 +620,7 @@ const handleOriginResponse = async ({ const bucketName = domainName.replace(`.s3.${region}.amazonaws.com`, ""); // Lazily import only S3Client to reduce init times until actually needed - const { S3Client } = await import("@aws-sdk/client-s3/S3Client"); + const { S3Client } = require("./s3-client.js"); const s3 = new S3Client({ region: request.origin?.s3?.region, @@ -675,9 +675,7 @@ const handleOriginResponse = async ({ ContentType: "text/html", CacheControl: "public, max-age=0, s-maxage=2678400, must-revalidate" }; - const { PutObjectCommand } = await import( - "@aws-sdk/client-s3/commands/PutObjectCommand" - ); + const { PutObjectCommand } = require("./s3-client.js"); await Promise.all([ s3.send(new PutObjectCommand(s3JsonParams)), s3.send(new PutObjectCommand(s3HtmlParams)) @@ -742,9 +740,7 @@ const handleOriginResponse = async ({ body: html }; } else { - const { GetObjectCommand } = await import( - "@aws-sdk/client-s3/commands/GetObjectCommand" - ); + const { GetObjectCommand } = require("./s3-client.js"); // S3 Body is stream per: https://github.com/aws/aws-sdk-js-v3/issues/1096 const getStream = await import("get-stream"); diff --git a/packages/libs/lambda-at-edge/src/s3-client.ts b/packages/libs/lambda-at-edge/src/s3-client.ts new file mode 100644 index 0000000000..8a91cf6b14 --- /dev/null +++ b/packages/libs/lambda-at-edge/src/s3-client.ts @@ -0,0 +1,9 @@ +import { GetObjectCommand } from "@aws-sdk/client-s3/commands/GetObjectCommand"; +import { PutObjectCommand } from "@aws-sdk/client-s3/commands/PutObjectCommand"; +import { S3Client } from "@aws-sdk/client-s3/S3Client"; + +module.exports = { + GetObjectCommand, + PutObjectCommand, + S3Client +}; diff --git a/packages/libs/lambda-at-edge/tsconfig.build.json b/packages/libs/lambda-at-edge/tsconfig.build.json index 1fd14c744c..da77f356cb 100644 --- a/packages/libs/lambda-at-edge/tsconfig.build.json +++ b/packages/libs/lambda-at-edge/tsconfig.build.json @@ -9,6 +9,7 @@ "node_modules", "./src/api-handler.ts", "./src/default-handler.ts", - "./src/image-handler.ts" + "./src/image-handler.ts", + "./src/s3-client.ts" ] } diff --git a/packages/libs/lambda-at-edge/tsconfig.bundle.json b/packages/libs/lambda-at-edge/tsconfig.bundle.json index 31a682a900..579f660d65 100644 --- a/packages/libs/lambda-at-edge/tsconfig.bundle.json +++ b/packages/libs/lambda-at-edge/tsconfig.bundle.json @@ -11,5 +11,10 @@ "allowJs": true, "resolveJsonModule": true }, - "include": ["./src/default-handler.ts", "./src/api-handler.ts", "./src/image-handler.ts"] + "include": [ + "./src/default-handler.ts", + "./src/api-handler.ts", + "./src/image-handler.ts", + "./src/s3-client.ts" + ] } \ No newline at end of file From eefb67054ef010292239f4d21049b86c432575a8 Mon Sep 17 00:00:00 2001 From: Jan Varho Date: Wed, 28 Apr 2021 18:05:41 +0300 Subject: [PATCH 2/2] Fix tests --- packages/libs/lambda-at-edge/rollup.config.js | 3 ++- packages/libs/lambda-at-edge/src/default-handler.ts | 6 +++--- .../libs/lambda-at-edge/tests/build/build-dynamic.test.ts | 3 ++- .../libs/lambda-at-edge/tests/build/build-no-api.test.ts | 3 ++- .../lambda-at-edge/tests/build/build-with-locales.test.ts | 3 ++- packages/libs/lambda-at-edge/tests/build/build.test.ts | 4 +++- 6 files changed, 14 insertions(+), 8 deletions(-) diff --git a/packages/libs/lambda-at-edge/rollup.config.js b/packages/libs/lambda-at-edge/rollup.config.js index e641892f49..200bbd0a95 100644 --- a/packages/libs/lambda-at-edge/rollup.config.js +++ b/packages/libs/lambda-at-edge/rollup.config.js @@ -9,7 +9,8 @@ const LOCAL_EXTERNALS = [ "./manifest.json", "./routes-manifest.json", "./prerender-manifest.json", - "./images-manifest.json" + "./images-manifest.json", + "./s3-client.js" ]; const NPM_EXTERNALS = ["aws-lambda", "aws-sdk/clients/s3"]; diff --git a/packages/libs/lambda-at-edge/src/default-handler.ts b/packages/libs/lambda-at-edge/src/default-handler.ts index 24436b5649..8d9654b7c8 100644 --- a/packages/libs/lambda-at-edge/src/default-handler.ts +++ b/packages/libs/lambda-at-edge/src/default-handler.ts @@ -620,7 +620,7 @@ const handleOriginResponse = async ({ const bucketName = domainName.replace(`.s3.${region}.amazonaws.com`, ""); // Lazily import only S3Client to reduce init times until actually needed - const { S3Client } = require("./s3-client.js"); + const { S3Client } = require("./s3-client"); const s3 = new S3Client({ region: request.origin?.s3?.region, @@ -675,7 +675,7 @@ const handleOriginResponse = async ({ ContentType: "text/html", CacheControl: "public, max-age=0, s-maxage=2678400, must-revalidate" }; - const { PutObjectCommand } = require("./s3-client.js"); + const { PutObjectCommand } = require("./s3-client"); await Promise.all([ s3.send(new PutObjectCommand(s3JsonParams)), s3.send(new PutObjectCommand(s3HtmlParams)) @@ -740,7 +740,7 @@ const handleOriginResponse = async ({ body: html }; } else { - const { GetObjectCommand } = require("./s3-client.js"); + const { GetObjectCommand } = require("./s3-client"); // S3 Body is stream per: https://github.com/aws/aws-sdk-js-v3/issues/1096 const getStream = await import("get-stream"); diff --git a/packages/libs/lambda-at-edge/tests/build/build-dynamic.test.ts b/packages/libs/lambda-at-edge/tests/build/build-dynamic.test.ts index 1ec51d5032..19f7e4d51c 100644 --- a/packages/libs/lambda-at-edge/tests/build/build-dynamic.test.ts +++ b/packages/libs/lambda-at-edge/tests/build/build-dynamic.test.ts @@ -421,7 +421,8 @@ describe("Builder Tests (dynamic)", () => { "manifest.json", "pages", "prerender-manifest.json", - "routes-manifest.json" + "routes-manifest.json", + "s3-client.js" ]); // api pages should not be included in the default lambda diff --git a/packages/libs/lambda-at-edge/tests/build/build-no-api.test.ts b/packages/libs/lambda-at-edge/tests/build/build-no-api.test.ts index 6d0ec84468..44932b0376 100644 --- a/packages/libs/lambda-at-edge/tests/build/build-no-api.test.ts +++ b/packages/libs/lambda-at-edge/tests/build/build-no-api.test.ts @@ -183,7 +183,8 @@ describe("Builder Tests (no API routes)", () => { "manifest.json", "pages", "prerender-manifest.json", - "routes-manifest.json" + "routes-manifest.json", + "s3-client.js" ]); // api pages should not be included in the default lambda diff --git a/packages/libs/lambda-at-edge/tests/build/build-with-locales.test.ts b/packages/libs/lambda-at-edge/tests/build/build-with-locales.test.ts index d6c255c876..ec48c259ff 100644 --- a/packages/libs/lambda-at-edge/tests/build/build-with-locales.test.ts +++ b/packages/libs/lambda-at-edge/tests/build/build-with-locales.test.ts @@ -267,7 +267,8 @@ describe("Builder Tests (with locales)", () => { "manifest.json", "pages", "prerender-manifest.json", - "routes-manifest.json" + "routes-manifest.json", + "s3-client.js" ]); // api pages should not be included in the default lambda diff --git a/packages/libs/lambda-at-edge/tests/build/build.test.ts b/packages/libs/lambda-at-edge/tests/build/build.test.ts index 5b8f2d5e3b..0059be838a 100644 --- a/packages/libs/lambda-at-edge/tests/build/build.test.ts +++ b/packages/libs/lambda-at-edge/tests/build/build.test.ts @@ -222,7 +222,8 @@ describe("Builder Tests", () => { "manifest.json", "pages", "prerender-manifest.json", - "routes-manifest.json" + "routes-manifest.json", + "s3-client.js" ]); // api pages should not be included in the default lambda @@ -490,6 +491,7 @@ describe("Builder Tests", () => { "pages", "prerender-manifest.json", "routes-manifest.json", + "s3-client.js", "testFile.js" ]);