From 18b793ac22a46e0f79dfc5952a78cc31d07de70e Mon Sep 17 00:00:00 2001 From: dylanirion Date: Tue, 5 Dec 2023 16:03:31 +0200 Subject: [PATCH 1/5] changes encoding on cache.body from utf8 to base64 --- packages/open-next/src/adapters/cache.ts | 4 ++-- packages/open-next/src/build.ts | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/open-next/src/adapters/cache.ts b/packages/open-next/src/adapters/cache.ts index 48e52d9a9..fea98b2e2 100644 --- a/packages/open-next/src/adapters/cache.ts +++ b/packages/open-next/src/adapters/cache.ts @@ -226,7 +226,7 @@ export default class S3Cache { lastModified: LastModified?.getTime(), value: { kind: "ROUTE", - body: Buffer.from(cacheData.body ?? Buffer.alloc(0)), + body: Buffer.from(cacheData.body ?? Buffer.alloc(0), "base64"), status: meta?.status, headers: meta?.headers, }, @@ -276,7 +276,7 @@ export default class S3Cache { "cache", JSON.stringify({ type: "route", - body: body.toString("utf8"), + body: body.toString("base64"), meta: { status, headers, diff --git a/packages/open-next/src/build.ts b/packages/open-next/src/build.ts index a184e56d5..08f7ce008 100755 --- a/packages/open-next/src/build.ts +++ b/packages/open-next/src/build.ts @@ -504,7 +504,9 @@ function createCacheAssets(monorepoRoot: string, disableDynamoDBCache = false) { ? JSON.parse(fs.readFileSync(files.json, "utf8")) : undefined, rsc: files.rsc ? fs.readFileSync(files.rsc, "utf8") : undefined, - body: files.body ? fs.readFileSync(files.body, "utf8") : undefined, + body: files.body + ? fs.readFileSync(files.body).toString("base64") + : undefined, }; fs.writeFileSync(cacheFilePath, JSON.stringify(cacheFileContent)); }); From 9c1e78f4d4a2956fedb00c58f71545e283732041 Mon Sep 17 00:00:00 2001 From: dylanirion Date: Tue, 5 Dec 2023 18:37:31 +0200 Subject: [PATCH 2/5] retain utf8 for json content-type --- packages/open-next/src/adapters/cache.ts | 11 +++++++++-- packages/open-next/src/build.ts | 15 +++++++++++---- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/packages/open-next/src/adapters/cache.ts b/packages/open-next/src/adapters/cache.ts index fea98b2e2..c87d8e9a2 100644 --- a/packages/open-next/src/adapters/cache.ts +++ b/packages/open-next/src/adapters/cache.ts @@ -226,7 +226,12 @@ export default class S3Cache { lastModified: LastModified?.getTime(), value: { kind: "ROUTE", - body: Buffer.from(cacheData.body ?? Buffer.alloc(0), "base64"), + body: Buffer.from( + cacheData.body ?? Buffer.alloc(0), + meta?.headers?.["content-type"]?.includes("application/json") + ? "utf8" + : "base64", + ), status: meta?.status, headers: meta?.headers, }, @@ -276,7 +281,9 @@ export default class S3Cache { "cache", JSON.stringify({ type: "route", - body: body.toString("base64"), + body: body.toString( + headers["content-type"] === "application/json" ? "utf8" : "base64", + ), meta: { status, headers, diff --git a/packages/open-next/src/build.ts b/packages/open-next/src/build.ts index 08f7ce008..8eab24a20 100755 --- a/packages/open-next/src/build.ts +++ b/packages/open-next/src/build.ts @@ -494,18 +494,25 @@ function createCacheAssets(monorepoRoot: string, disableDynamoDBCache = false) { // Generate cache file Object.entries(cacheFilesPath).forEach(([cacheFilePath, files]) => { + const cacheFileMeta = files.meta + ? JSON.parse(fs.readFileSync(files.meta, "utf8")) + : undefined; const cacheFileContent = { type: files.body ? "route" : files.json ? "page" : "app", - meta: files.meta - ? JSON.parse(fs.readFileSync(files.meta, "utf8")) - : undefined, + meta: cacheFileMeta, html: files.html ? fs.readFileSync(files.html, "utf8") : undefined, json: files.json ? JSON.parse(fs.readFileSync(files.json, "utf8")) : undefined, rsc: files.rsc ? fs.readFileSync(files.rsc, "utf8") : undefined, body: files.body - ? fs.readFileSync(files.body).toString("base64") + ? fs + .readFileSync(files.body) + .toString( + cacheFileMeta.headers["content-type"] === "application/json" + ? "utf8" + : "base64", + ) : undefined, }; fs.writeFileSync(cacheFilePath, JSON.stringify(cacheFileContent)); From e51eff5cfa0e54e88d728b718f3f8a4d352c6467 Mon Sep 17 00:00:00 2001 From: dylanirion Date: Tue, 5 Dec 2023 20:22:40 +0200 Subject: [PATCH 3/5] opting for less greedy base64 --- packages/open-next/src/adapters/cache.ts | 10 ++++++---- packages/open-next/src/build.ts | 6 +++--- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/packages/open-next/src/adapters/cache.ts b/packages/open-next/src/adapters/cache.ts index c87d8e9a2..5b6ba2bb0 100644 --- a/packages/open-next/src/adapters/cache.ts +++ b/packages/open-next/src/adapters/cache.ts @@ -228,9 +228,9 @@ export default class S3Cache { kind: "ROUTE", body: Buffer.from( cacheData.body ?? Buffer.alloc(0), - meta?.headers?.["content-type"]?.includes("application/json") - ? "utf8" - : "base64", + String(meta?.headers?.["content-type"]).startsWith("image") + ? "base64" + : "utf8", ), status: meta?.status, headers: meta?.headers, @@ -282,7 +282,9 @@ export default class S3Cache { JSON.stringify({ type: "route", body: body.toString( - headers["content-type"] === "application/json" ? "utf8" : "base64", + String(headers["content-type"]).startsWith("image") + ? "base64" + : "utf8", ), meta: { status, diff --git a/packages/open-next/src/build.ts b/packages/open-next/src/build.ts index 8eab24a20..3a39d4607 100755 --- a/packages/open-next/src/build.ts +++ b/packages/open-next/src/build.ts @@ -509,9 +509,9 @@ function createCacheAssets(monorepoRoot: string, disableDynamoDBCache = false) { ? fs .readFileSync(files.body) .toString( - cacheFileMeta.headers["content-type"] === "application/json" - ? "utf8" - : "base64", + cacheFileMeta.headers["content-type"].startsWith("image") + ? "base64" + : "utf8", ) : undefined, }; From 003bb28bc1e55ff806f0c7d0ff0db4546e499f52 Mon Sep 17 00:00:00 2001 From: dylanirion Date: Tue, 5 Dec 2023 21:48:00 +0200 Subject: [PATCH 4/5] use isBinaryContentType --- packages/open-next/src/adapters/cache.ts | 5 +++-- packages/open-next/src/build.ts | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/open-next/src/adapters/cache.ts b/packages/open-next/src/adapters/cache.ts index 5b6ba2bb0..347a06621 100644 --- a/packages/open-next/src/adapters/cache.ts +++ b/packages/open-next/src/adapters/cache.ts @@ -13,6 +13,7 @@ import { } from "@aws-sdk/client-s3"; import path from "path"; +import { isBinaryContentType } from "./binary.js"; import { MAX_DYNAMO_BATCH_WRITE_ITEM_COUNT } from "./constants.js"; import { debug, error, warn } from "./logger.js"; import { chunk } from "./util.js"; @@ -228,7 +229,7 @@ export default class S3Cache { kind: "ROUTE", body: Buffer.from( cacheData.body ?? Buffer.alloc(0), - String(meta?.headers?.["content-type"]).startsWith("image") + isBinaryContentType(String(meta?.headers?.["content-type"])) ? "base64" : "utf8", ), @@ -282,7 +283,7 @@ export default class S3Cache { JSON.stringify({ type: "route", body: body.toString( - String(headers["content-type"]).startsWith("image") + isBinaryContentType(String(headers["content-type"])) ? "base64" : "utf8", ), diff --git a/packages/open-next/src/build.ts b/packages/open-next/src/build.ts index 3a39d4607..079626f2f 100755 --- a/packages/open-next/src/build.ts +++ b/packages/open-next/src/build.ts @@ -10,6 +10,7 @@ import { buildSync, } from "esbuild"; +import { isBinaryContentType } from "./adapters/binary.js"; import logger from "./logger.js"; import { minifyAll } from "./minimize-js.js"; import openNextPlugin from "./plugin.js"; @@ -509,7 +510,7 @@ function createCacheAssets(monorepoRoot: string, disableDynamoDBCache = false) { ? fs .readFileSync(files.body) .toString( - cacheFileMeta.headers["content-type"].startsWith("image") + isBinaryContentType(cacheFileMeta.headers["content-type"]) ? "base64" : "utf8", ) From b4c7efeae289264ba7b46c5a5ee7320834ef4c2d Mon Sep 17 00:00:00 2001 From: Dorseuil Nicolas Date: Fri, 5 Jan 2024 16:17:57 +0100 Subject: [PATCH 5/5] changeset --- .changeset/wicked-comics-trade.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/wicked-comics-trade.md diff --git a/.changeset/wicked-comics-trade.md b/.changeset/wicked-comics-trade.md new file mode 100644 index 000000000..a15538d41 --- /dev/null +++ b/.changeset/wicked-comics-trade.md @@ -0,0 +1,5 @@ +--- +"open-next": patch +--- + +Changes encoding on cache.body for binary data