@opennextjs/aws 3.2.1 → 3.2.2
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.
- package/README.md +15 -1
- package/dist/adapters/cache.d.ts +0 -23
- package/dist/adapters/cache.js +10 -12
- package/dist/adapters/config/index.js +1 -1
- package/dist/adapters/config/util.js +2 -2
- package/dist/adapters/dynamo-provider.js +3 -5
- package/dist/adapters/edge-adapter.d.ts +0 -3
- package/dist/adapters/edge-adapter.js +43 -38
- package/dist/adapters/image-optimization-adapter.js +4 -4
- package/dist/adapters/logger.d.ts +0 -3
- package/dist/adapters/logger.js +3 -5
- package/dist/adapters/middleware.js +42 -18
- package/dist/adapters/plugins/image-optimization/image-optimization.d.ts +0 -3
- package/dist/adapters/plugins/image-optimization/image-optimization.replacement.d.ts +0 -3
- package/dist/adapters/revalidate.js +2 -2
- package/dist/adapters/server-adapter.d.ts +0 -3
- package/dist/adapters/server-adapter.js +3 -1
- package/dist/adapters/util.js +2 -2
- package/dist/build/bundleNextServer.d.ts +3 -1
- package/dist/build/bundleNextServer.js +3 -3
- package/dist/build/compileConfig.js +1 -1
- package/dist/build/copyTracedFiles.js +14 -25
- package/dist/build/createAssets.js +35 -26
- package/dist/build/createImageOptimizationBundle.js +1 -1
- package/dist/build/createMiddleware.js +7 -2
- package/dist/build/createRevalidationBundle.js +1 -1
- package/dist/build/createServerBundle.js +23 -29
- package/dist/build/createWarmerBundle.js +1 -1
- package/dist/build/edge/createEdgeBundle.d.ts +7 -3
- package/dist/build/edge/createEdgeBundle.js +12 -5
- package/dist/build/generateOutput.js +7 -13
- package/dist/build/helper.d.ts +22 -4
- package/dist/build/helper.js +26 -12
- package/dist/build/installDeps.js +1 -1
- package/dist/build/patch/patchedAsyncStorage.js +1 -1
- package/dist/build/utils.js +3 -2
- package/dist/build/validateConfig.js +1 -0
- package/dist/core/createGenericHandler.d.ts +2 -4
- package/dist/core/createGenericHandler.js +1 -2
- package/dist/core/createMainHandler.d.ts +0 -17
- package/dist/core/createMainHandler.js +5 -4
- package/dist/core/edgeFunctionHandler.d.ts +1 -51
- package/dist/core/patchAsyncStorage.js +5 -6
- package/dist/core/requestHandler.js +98 -89
- package/dist/core/require-hooks.js +8 -7
- package/dist/core/resolve.d.ts +13 -7
- package/dist/core/resolve.js +29 -35
- package/dist/core/routing/cacheInterceptor.js +12 -13
- package/dist/core/routing/i18n/accept-header.js +3 -2
- package/dist/core/routing/matcher.d.ts +2 -4
- package/dist/core/routing/matcher.js +17 -26
- package/dist/core/routing/middleware.js +17 -16
- package/dist/core/routing/util.d.ts +0 -13
- package/dist/core/routing/util.js +25 -87
- package/dist/core/routingHandler.d.ts +2 -0
- package/dist/core/routingHandler.js +30 -12
- package/dist/core/util.js +5 -3
- package/dist/helpers/withSST.d.ts +1 -1
- package/dist/http/openNextResponse.d.ts +5 -9
- package/dist/http/openNextResponse.js +29 -31
- package/dist/http/request.d.ts +0 -3
- package/dist/http/request.js +4 -2
- package/dist/http/util.d.ts +1 -1
- package/dist/http/util.js +8 -12
- package/dist/minimize-js.js +19 -19
- package/dist/overrides/converters/aws-apigw-v1.d.ts +2 -2
- package/dist/overrides/converters/aws-apigw-v1.js +2 -1
- package/dist/overrides/converters/aws-apigw-v2.d.ts +2 -2
- package/dist/overrides/converters/aws-apigw-v2.js +6 -7
- package/dist/overrides/converters/aws-cloudfront.d.ts +2 -2
- package/dist/overrides/converters/aws-cloudfront.js +11 -30
- package/dist/overrides/converters/dummy.d.ts +1 -1
- package/dist/overrides/converters/edge.d.ts +2 -1
- package/dist/overrides/converters/edge.js +11 -15
- package/dist/overrides/converters/node.d.ts +1 -1
- package/dist/overrides/converters/node.js +1 -1
- package/dist/overrides/converters/sqs-revalidate.d.ts +1 -1
- package/dist/overrides/imageLoader/dummy.d.ts +1 -1
- package/dist/overrides/imageLoader/host.d.ts +1 -1
- package/dist/overrides/imageLoader/s3.d.ts +1 -1
- package/dist/overrides/imageLoader/s3.js +1 -1
- package/dist/overrides/incrementalCache/dummy.d.ts +1 -1
- package/dist/overrides/incrementalCache/s3-lite.d.ts +1 -1
- package/dist/overrides/incrementalCache/s3-lite.js +15 -19
- package/dist/overrides/incrementalCache/s3.d.ts +1 -1
- package/dist/overrides/incrementalCache/s3.js +1 -1
- package/dist/overrides/originResolver/dummy.d.ts +1 -1
- package/dist/overrides/originResolver/pattern-env.d.ts +1 -1
- package/dist/overrides/originResolver/pattern-env.js +10 -11
- package/dist/overrides/proxyExternalRequest/dummy.d.ts +3 -0
- package/dist/overrides/proxyExternalRequest/dummy.js +7 -0
- package/dist/overrides/proxyExternalRequest/fetch.d.ts +3 -0
- package/dist/overrides/proxyExternalRequest/fetch.js +25 -0
- package/dist/overrides/proxyExternalRequest/node.d.ts +3 -0
- package/dist/overrides/proxyExternalRequest/node.js +67 -0
- package/dist/overrides/queue/dummy.d.ts +1 -1
- package/dist/overrides/queue/sqs-lite.d.ts +1 -1
- package/dist/overrides/queue/sqs-lite.js +7 -9
- package/dist/overrides/queue/sqs.d.ts +1 -1
- package/dist/overrides/queue/sqs.js +1 -1
- package/dist/overrides/tagCache/constants.js +2 -2
- package/dist/overrides/tagCache/dummy.d.ts +1 -1
- package/dist/overrides/tagCache/dynamodb-lite.d.ts +1 -1
- package/dist/overrides/tagCache/dynamodb-lite.js +10 -12
- package/dist/overrides/tagCache/dynamodb.d.ts +1 -1
- package/dist/overrides/tagCache/dynamodb.js +2 -2
- package/dist/overrides/warmer/aws-lambda.d.ts +1 -1
- package/dist/overrides/warmer/dummy.d.ts +1 -1
- package/dist/overrides/wrappers/aws-lambda-streaming.d.ts +2 -2
- package/dist/overrides/wrappers/aws-lambda.d.ts +2 -2
- package/dist/overrides/wrappers/cloudflare.d.ts +2 -1
- package/dist/overrides/wrappers/cloudflare.js +20 -2
- package/dist/overrides/wrappers/dummy.d.ts +2 -2
- package/dist/overrides/wrappers/node.d.ts +2 -2
- package/dist/overrides/wrappers/node.js +3 -3
- package/dist/plugins/edge.js +6 -5
- package/dist/plugins/replacement.js +2 -2
- package/dist/plugins/resolve.d.ts +3 -1
- package/dist/plugins/resolve.js +4 -1
- package/dist/types/aws-lambda.d.ts +2 -5
- package/dist/types/cache.d.ts +0 -2
- package/dist/types/global.d.ts +188 -0
- package/dist/types/next-types.d.ts +1 -3
- package/dist/types/open-next.d.ts +15 -41
- package/dist/types/overrides.d.ts +87 -0
- package/dist/utils/promise.d.ts +3 -0
- package/dist/utils/promise.js +44 -0
- package/dist/utils/stream.d.ts +0 -1
- package/package.json +2 -2
- package/dist/overrides/incrementalCache/types.d.ts +0 -34
- package/dist/overrides/queue/types.d.ts +0 -12
- package/dist/overrides/tagCache/types.d.ts +0 -11
- package/dist/overrides/tagCache/types.js +0 -1
- /package/dist/{overrides/incrementalCache/types.js → types/global.js} +0 -0
- /package/dist/{overrides/queue/types.js → types/overrides.js} +0 -0
package/dist/http/request.js
CHANGED
|
@@ -13,8 +13,10 @@ export class IncomingMessage extends http.IncomingMessage {
|
|
|
13
13
|
end: Function.prototype,
|
|
14
14
|
destroy: Function.prototype,
|
|
15
15
|
});
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
// Set the content length when there is a body.
|
|
17
|
+
// See https://httpwg.org/specs/rfc9110.html#field.content-length
|
|
18
|
+
if (body) {
|
|
19
|
+
headers["content-length"] ??= String(Buffer.byteLength(body));
|
|
18
20
|
}
|
|
19
21
|
Object.assign(this, {
|
|
20
22
|
ip: remoteAddress,
|
package/dist/http/util.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type http from "node:http";
|
|
2
2
|
export declare const parseHeaders: (headers?: http.OutgoingHttpHeader[] | http.OutgoingHttpHeaders) => Record<string, string>;
|
|
3
3
|
export declare const convertHeader: (header: http.OutgoingHttpHeader) => string;
|
|
4
|
-
export declare function parseCookies(cookies
|
|
4
|
+
export declare function parseCookies(cookies: string | string[] | null | undefined): string[];
|
package/dist/http/util.js
CHANGED
|
@@ -7,9 +7,7 @@ export const parseHeaders = (headers) => {
|
|
|
7
7
|
if (value === undefined) {
|
|
8
8
|
continue;
|
|
9
9
|
}
|
|
10
|
-
|
|
11
|
-
result[key.toLowerCase()] = convertHeader(value);
|
|
12
|
-
}
|
|
10
|
+
result[key.toLowerCase()] = convertHeader(value);
|
|
13
11
|
}
|
|
14
12
|
return result;
|
|
15
13
|
};
|
|
@@ -17,18 +15,16 @@ export const convertHeader = (header) => {
|
|
|
17
15
|
if (typeof header === "string") {
|
|
18
16
|
return header;
|
|
19
17
|
}
|
|
20
|
-
|
|
18
|
+
if (Array.isArray(header)) {
|
|
21
19
|
return header.join(",");
|
|
22
20
|
}
|
|
23
|
-
|
|
24
|
-
return String(header);
|
|
25
|
-
}
|
|
21
|
+
return String(header);
|
|
26
22
|
};
|
|
27
23
|
export function parseCookies(cookies) {
|
|
28
|
-
if (!cookies)
|
|
29
|
-
return;
|
|
30
|
-
if (typeof cookies === "string") {
|
|
31
|
-
return cookies.split(/(?<!Expires=\w+),/i).map((c) => c.trim());
|
|
24
|
+
if (!cookies) {
|
|
25
|
+
return [];
|
|
32
26
|
}
|
|
33
|
-
return cookies
|
|
27
|
+
return typeof cookies === "string"
|
|
28
|
+
? cookies.split(/(?<!Expires=\w+),/i).map((c) => c.trim())
|
|
29
|
+
: cookies;
|
|
34
30
|
}
|
package/dist/minimize-js.js
CHANGED
|
@@ -6,9 +6,9 @@ import fs from "node:fs/promises";
|
|
|
6
6
|
import path from "node:path";
|
|
7
7
|
import minify from "@node-minify/core";
|
|
8
8
|
import terser from "@node-minify/terser";
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
const failed_files = [];
|
|
10
|
+
let total_files = 0;
|
|
11
|
+
const options = {};
|
|
12
12
|
const promiseSeries = async (tasks, initial) => {
|
|
13
13
|
if (!Array.isArray(tasks)) {
|
|
14
14
|
return Promise.reject(new TypeError("promise.series only accepts an array of functions"));
|
|
@@ -40,12 +40,12 @@ const minifyJSON = async (file) => {
|
|
|
40
40
|
try {
|
|
41
41
|
if (options.compress_json || options.packagejson) {
|
|
42
42
|
total_files++;
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
43
|
+
const is_package_json = file.indexOf("package.json") > -1;
|
|
44
|
+
const data = await fs.readFile(file, "utf8");
|
|
45
|
+
const json = JSON.parse(data);
|
|
46
|
+
let new_json = {};
|
|
47
47
|
if (options.packagejson && is_package_json) {
|
|
48
|
-
|
|
48
|
+
const { name, version, bin, main, binary, engines } = json;
|
|
49
49
|
new_json = { name, version };
|
|
50
50
|
if (bin)
|
|
51
51
|
new_json.bin = bin;
|
|
@@ -66,14 +66,14 @@ const minifyJSON = async (file) => {
|
|
|
66
66
|
//process.stdout.write(".");
|
|
67
67
|
};
|
|
68
68
|
const walk = async (currentDirPath) => {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
69
|
+
const js_files = [];
|
|
70
|
+
const json_files = [];
|
|
71
|
+
const dirs = [];
|
|
72
|
+
const current_dirs = await fs.readdir(currentDirPath);
|
|
73
73
|
for (const name of current_dirs) {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
74
|
+
const filePath = path.join(currentDirPath, name);
|
|
75
|
+
const stat = await fs.stat(filePath);
|
|
76
|
+
const is_bin = /\.bin$/;
|
|
77
77
|
if (stat.isFile()) {
|
|
78
78
|
if (filePath.substr(-5) === ".json")
|
|
79
79
|
json_files.push(filePath);
|
|
@@ -84,8 +84,8 @@ const walk = async (currentDirPath) => {
|
|
|
84
84
|
dirs.push(filePath);
|
|
85
85
|
}
|
|
86
86
|
}
|
|
87
|
-
|
|
88
|
-
|
|
87
|
+
const js_promise = Promise.all(js_files.map((f) => minifyJS(f)));
|
|
88
|
+
const json_promise = Promise.all(json_files.map((f) => minifyJSON(f)));
|
|
89
89
|
await Promise.all([js_promise, json_promise]);
|
|
90
90
|
await promiseSeries(dirs.map((dir) => () => walk(dir)));
|
|
91
91
|
};
|
|
@@ -96,7 +96,7 @@ export async function minifyAll(dir, opts) {
|
|
|
96
96
|
//process.stdout.write(".\n");
|
|
97
97
|
//console.log("Total found files: " + total_files);
|
|
98
98
|
if (failed_files.length) {
|
|
99
|
-
console.log(
|
|
100
|
-
failed_files.forEach((f) => console.log(
|
|
99
|
+
console.log("\n\nFailed to minify files:");
|
|
100
|
+
failed_files.forEach((f) => console.log(`\t${f}`));
|
|
101
101
|
}
|
|
102
102
|
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import type { Converter
|
|
2
|
-
declare const _default: Converter
|
|
1
|
+
import type { Converter } from "../../types/overrides";
|
|
2
|
+
declare const _default: Converter;
|
|
3
3
|
export default _default;
|
|
@@ -52,7 +52,8 @@ async function convertFromAPIGatewayProxyEvent(event) {
|
|
|
52
52
|
query: removeUndefinedFromQuery(event.multiValueQueryStringParameters ?? {}),
|
|
53
53
|
cookies: event.multiValueHeaders?.cookie?.reduce((acc, cur) => {
|
|
54
54
|
const [key, value] = cur.split("=");
|
|
55
|
-
|
|
55
|
+
acc[key] = value;
|
|
56
|
+
return acc;
|
|
56
57
|
}, {}) ?? {},
|
|
57
58
|
};
|
|
58
59
|
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import type { Converter
|
|
2
|
-
declare const _default: Converter
|
|
1
|
+
import type { Converter } from "../../types/overrides";
|
|
2
|
+
declare const _default: Converter;
|
|
3
3
|
export default _default;
|
|
@@ -32,21 +32,19 @@ function normalizeAPIGatewayProxyEventV2Body(event) {
|
|
|
32
32
|
if (Buffer.isBuffer(body)) {
|
|
33
33
|
return body;
|
|
34
34
|
}
|
|
35
|
-
|
|
35
|
+
if (typeof body === "string") {
|
|
36
36
|
return Buffer.from(body, isBase64Encoded ? "base64" : "utf8");
|
|
37
37
|
}
|
|
38
|
-
|
|
38
|
+
if (typeof body === "object") {
|
|
39
39
|
return Buffer.from(JSON.stringify(body));
|
|
40
40
|
}
|
|
41
|
-
|
|
42
|
-
return Buffer.from("", "utf8");
|
|
43
|
-
}
|
|
41
|
+
return Buffer.from("", "utf8");
|
|
44
42
|
}
|
|
45
43
|
function normalizeAPIGatewayProxyEventV2Headers(event) {
|
|
46
44
|
const { headers: rawHeaders, cookies } = event;
|
|
47
45
|
const headers = {};
|
|
48
46
|
if (Array.isArray(cookies)) {
|
|
49
|
-
headers
|
|
47
|
+
headers.cookie = cookies.join("; ");
|
|
50
48
|
}
|
|
51
49
|
for (const [key, value] of Object.entries(rawHeaders || {})) {
|
|
52
50
|
headers[key.toLowerCase()] = value;
|
|
@@ -66,7 +64,8 @@ async function convertFromAPIGatewayProxyEventV2(event) {
|
|
|
66
64
|
query: removeUndefinedFromQuery(convertToQuery(rawQueryString)),
|
|
67
65
|
cookies: event.cookies?.reduce((acc, cur) => {
|
|
68
66
|
const [key, value] = cur.split("=");
|
|
69
|
-
|
|
67
|
+
acc[key] = value;
|
|
68
|
+
return acc;
|
|
70
69
|
}, {}) ?? {},
|
|
71
70
|
};
|
|
72
71
|
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import type { Converter
|
|
2
|
-
declare const _default: Converter
|
|
1
|
+
import type { Converter } from "../../types/overrides";
|
|
2
|
+
declare const _default: Converter;
|
|
3
3
|
export default _default;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { parseCookies } from "../../http/util";
|
|
2
2
|
import { fromReadableStream } from "../../utils/stream";
|
|
3
3
|
import { debug } from "../../adapters/logger";
|
|
4
|
-
import {
|
|
5
|
-
const
|
|
4
|
+
import { convertToQuery, convertToQueryString, } from "../../core/routing/util";
|
|
5
|
+
const cloudfrontBlacklistedHeaders = [
|
|
6
6
|
// Disallowed headers, see: https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/edge-function-restrictions-all.html#function-restrictions-disallowed-headers
|
|
7
7
|
"connection",
|
|
8
8
|
"expect",
|
|
@@ -67,8 +67,9 @@ async function convertFromCloudFrontRequestEvent(event) {
|
|
|
67
67
|
remoteAddress: clientIp,
|
|
68
68
|
query: convertToQuery(querystring),
|
|
69
69
|
cookies: headers.cookie?.reduce((acc, cur) => {
|
|
70
|
-
const { key, value } = cur;
|
|
71
|
-
|
|
70
|
+
const { key = "", value } = cur;
|
|
71
|
+
acc[key] = value;
|
|
72
|
+
return acc;
|
|
72
73
|
}, {}) ?? {},
|
|
73
74
|
};
|
|
74
75
|
}
|
|
@@ -76,18 +77,15 @@ function convertToCloudfrontHeaders(headers, directResponse) {
|
|
|
76
77
|
const cloudfrontHeaders = {};
|
|
77
78
|
Object.entries(headers)
|
|
78
79
|
.map(([key, value]) => [key.toLowerCase(), value])
|
|
79
|
-
.filter(([key]) => !
|
|
80
|
+
.filter(([key]) => !cloudfrontBlacklistedHeaders.some((header) => typeof header === "string" ? header === key : header.test(key)) &&
|
|
80
81
|
// Only remove read-only headers when directly responding in lambda@edge
|
|
81
82
|
(directResponse ? !cloudfrontReadOnlyHeaders.includes(key) : true))
|
|
82
83
|
.forEach(([key, value]) => {
|
|
83
84
|
if (key === "set-cookie") {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
value: cookie,
|
|
89
|
-
}));
|
|
90
|
-
}
|
|
85
|
+
cloudfrontHeaders[key] = parseCookies(`${value}`).map((cookie) => ({
|
|
86
|
+
key,
|
|
87
|
+
value: cookie,
|
|
88
|
+
}));
|
|
91
89
|
return;
|
|
92
90
|
}
|
|
93
91
|
cloudfrontHeaders[key] = [
|
|
@@ -104,25 +102,8 @@ async function convertToCloudFrontRequestResult(result, originalRequest) {
|
|
|
104
102
|
const { method, clientIp, origin } = originalRequest.Records[0].cf.request;
|
|
105
103
|
const responseHeaders = result.internalEvent.headers;
|
|
106
104
|
// Handle external rewrite
|
|
107
|
-
if (result.isExternalRewrite) {
|
|
108
|
-
const serverResponse = createServerResponse(result.internalEvent, {});
|
|
109
|
-
await proxyRequest(result.internalEvent, serverResponse);
|
|
110
|
-
const externalResult = convertRes(serverResponse);
|
|
111
|
-
const body = await fromReadableStream(externalResult.body, externalResult.isBase64Encoded);
|
|
112
|
-
const cloudfrontResult = {
|
|
113
|
-
status: externalResult.statusCode.toString(),
|
|
114
|
-
statusDescription: "OK",
|
|
115
|
-
headers: convertToCloudfrontHeaders(externalResult.headers, true),
|
|
116
|
-
bodyEncoding: externalResult.isBase64Encoded
|
|
117
|
-
? "base64"
|
|
118
|
-
: "text",
|
|
119
|
-
body,
|
|
120
|
-
};
|
|
121
|
-
debug("externalResult", cloudfrontResult);
|
|
122
|
-
return cloudfrontResult;
|
|
123
|
-
}
|
|
124
105
|
let customOrigin = origin?.custom;
|
|
125
|
-
let host = responseHeaders
|
|
106
|
+
let host = responseHeaders.host ?? responseHeaders.Host;
|
|
126
107
|
if (result.origin) {
|
|
127
108
|
customOrigin = {
|
|
128
109
|
...customOrigin,
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { InternalEvent, InternalResult } from "../../types/open-next";
|
|
2
|
+
import type { Converter } from "../../types/overrides";
|
|
2
3
|
import type { MiddlewareOutputEvent } from "../../core/routingHandler";
|
|
3
4
|
declare global {
|
|
4
5
|
var __dangerous_ON_edge_converter_returns_request: boolean | undefined;
|
|
@@ -5,7 +5,7 @@ const converter = {
|
|
|
5
5
|
const searchParams = new URL(event.url).searchParams;
|
|
6
6
|
const query = {};
|
|
7
7
|
for (const [key, value] of searchParams.entries()) {
|
|
8
|
-
if (query
|
|
8
|
+
if (key in query) {
|
|
9
9
|
if (Array.isArray(query[key])) {
|
|
10
10
|
query[key].push(value);
|
|
11
11
|
}
|
|
@@ -26,19 +26,17 @@ const converter = {
|
|
|
26
26
|
const rawPath = new URL(event.url).pathname;
|
|
27
27
|
const method = event.method;
|
|
28
28
|
const shouldHaveBody = method !== "GET" && method !== "HEAD";
|
|
29
|
+
const cookies = Object.fromEntries(parseCookies(event.headers.get("cookie")).map((cookie) => cookie.split("=")));
|
|
29
30
|
return {
|
|
30
31
|
type: "core",
|
|
31
32
|
method,
|
|
32
33
|
rawPath,
|
|
33
34
|
url: event.url,
|
|
34
35
|
body: shouldHaveBody ? Buffer.from(body) : undefined,
|
|
35
|
-
headers
|
|
36
|
+
headers,
|
|
36
37
|
remoteAddress: event.headers.get("x-forwarded-for") ?? "::1",
|
|
37
38
|
query,
|
|
38
|
-
cookies
|
|
39
|
-
const [key, value] = cookie.split("=");
|
|
40
|
-
return [key, value];
|
|
41
|
-
}) ?? []),
|
|
39
|
+
cookies,
|
|
42
40
|
};
|
|
43
41
|
},
|
|
44
42
|
convertTo: async (result) => {
|
|
@@ -75,16 +73,14 @@ const converter = {
|
|
|
75
73
|
cf: cfCache,
|
|
76
74
|
});
|
|
77
75
|
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
headers.set(key, Array.isArray(value) ? value.join(",") : value);
|
|
82
|
-
}
|
|
83
|
-
return new Response(result.body, {
|
|
84
|
-
status: result.statusCode,
|
|
85
|
-
headers: headers,
|
|
86
|
-
});
|
|
76
|
+
const headers = new Headers();
|
|
77
|
+
for (const [key, value] of Object.entries(result.headers)) {
|
|
78
|
+
headers.set(key, Array.isArray(value) ? value.join(",") : value);
|
|
87
79
|
}
|
|
80
|
+
return new Response(result.body, {
|
|
81
|
+
status: result.statusCode,
|
|
82
|
+
headers: headers,
|
|
83
|
+
});
|
|
88
84
|
},
|
|
89
85
|
name: "edge",
|
|
90
86
|
};
|
|
@@ -28,7 +28,7 @@ const converter = {
|
|
|
28
28
|
req.socket.remoteAddress ??
|
|
29
29
|
"::1",
|
|
30
30
|
query,
|
|
31
|
-
cookies: Object.fromEntries(parseCookies(req.headers
|
|
31
|
+
cookies: Object.fromEntries(parseCookies(req.headers.cookie)?.map((cookie) => {
|
|
32
32
|
const [key, value] = cookie.split("=");
|
|
33
33
|
return [key, value];
|
|
34
34
|
}) ?? []),
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Converter } from "../../types/
|
|
1
|
+
import type { Converter } from "../../types/overrides";
|
|
2
2
|
import type { RevalidateEvent } from "../../adapters/revalidate";
|
|
3
3
|
declare const converter: Converter<RevalidateEvent, RevalidateEvent>;
|
|
4
4
|
export default converter;
|
|
@@ -16,7 +16,7 @@ const s3Loader = {
|
|
|
16
16
|
const response = await s3Client.send(new GetObjectCommand({
|
|
17
17
|
Bucket: BUCKET_NAME,
|
|
18
18
|
Key: keyPrefix
|
|
19
|
-
? keyPrefix
|
|
19
|
+
? `${keyPrefix}/${key.replace(/^\//, "")}`
|
|
20
20
|
: key.replace(/^\//, ""),
|
|
21
21
|
}));
|
|
22
22
|
const body = response.Body;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-non-null-assertion */
|
|
2
|
+
import path from "node:path";
|
|
2
3
|
import { AwsClient } from "aws4fetch";
|
|
3
|
-
import path from "path";
|
|
4
4
|
import { IgnorableError, RecoverableError } from "../../utils/error";
|
|
5
5
|
import { customFetchClient } from "../../utils/fetch";
|
|
6
6
|
import { parseNumberFromEnv } from "../../adapters/util";
|
|
@@ -10,16 +10,14 @@ const getAwsClient = () => {
|
|
|
10
10
|
if (awsClient) {
|
|
11
11
|
return awsClient;
|
|
12
12
|
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
return awsClient;
|
|
22
|
-
}
|
|
13
|
+
awsClient = new AwsClient({
|
|
14
|
+
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
|
|
15
|
+
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
|
|
16
|
+
sessionToken: process.env.AWS_SESSION_TOKEN,
|
|
17
|
+
region: CACHE_BUCKET_REGION,
|
|
18
|
+
retries: parseNumberFromEnv(process.env.AWS_SDK_S3_MAX_ATTEMPTS),
|
|
19
|
+
});
|
|
20
|
+
return awsClient;
|
|
23
21
|
};
|
|
24
22
|
const awsFetch = async (key, options) => {
|
|
25
23
|
const { CACHE_BUCKET_REGION, CACHE_BUCKET_NAME } = process.env;
|
|
@@ -39,16 +37,14 @@ const incrementalCache = {
|
|
|
39
37
|
if (result.status === 404) {
|
|
40
38
|
throw new IgnorableError("Not found");
|
|
41
39
|
}
|
|
42
|
-
|
|
40
|
+
if (result.status !== 200) {
|
|
43
41
|
throw new RecoverableError(`Failed to get cache: ${result.status}`);
|
|
44
42
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
};
|
|
51
|
-
}
|
|
43
|
+
const cacheData = await result.json();
|
|
44
|
+
return {
|
|
45
|
+
value: cacheData,
|
|
46
|
+
lastModified: new Date(result.headers.get("last-modified") ?? "").getTime(),
|
|
47
|
+
};
|
|
52
48
|
},
|
|
53
49
|
async set(key, value, isFetch) {
|
|
54
50
|
const response = await awsFetch(buildS3Key(key, isFetch ? "fetch" : "cache"), {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import path from "node:path";
|
|
1
2
|
import { DeleteObjectCommand, GetObjectCommand, PutObjectCommand, S3Client, } from "@aws-sdk/client-s3";
|
|
2
|
-
import path from "path";
|
|
3
3
|
import { awsLogger } from "../../adapters/logger";
|
|
4
4
|
import { parseNumberFromEnv } from "../../adapters/util";
|
|
5
5
|
const { CACHE_BUCKET_REGION, CACHE_BUCKET_KEY_PREFIX, NEXT_BUILD_ID, CACHE_BUCKET_NAME, } = process.env;
|
|
@@ -9,24 +9,23 @@ const envLoader = {
|
|
|
9
9
|
// Convert cloudfront pattern to regex
|
|
10
10
|
return new RegExp(
|
|
11
11
|
// transform glob pattern to regex
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
.replace(/\?/g, ".")).test(_path);
|
|
12
|
+
`/${pattern
|
|
13
|
+
.replace(/\*\*/g, "(.*)")
|
|
14
|
+
.replace(/\*/g, "([^/]*)")
|
|
15
|
+
.replace(/\//g, "\\/")
|
|
16
|
+
.replace(/\?/g, ".")}`).test(_path);
|
|
18
17
|
})) {
|
|
19
18
|
debug("Using origin", key, value.patterns);
|
|
20
19
|
return origin[key];
|
|
21
20
|
}
|
|
22
21
|
}
|
|
23
|
-
if (_path.startsWith("/_next/image") && origin
|
|
22
|
+
if (_path.startsWith("/_next/image") && origin.imageOptimizer) {
|
|
24
23
|
debug("Using origin", "imageOptimizer", _path);
|
|
25
|
-
return origin
|
|
24
|
+
return origin.imageOptimizer;
|
|
26
25
|
}
|
|
27
|
-
if (origin
|
|
28
|
-
debug("Using default origin", origin
|
|
29
|
-
return origin
|
|
26
|
+
if (origin.default) {
|
|
27
|
+
debug("Using default origin", origin.default, _path);
|
|
28
|
+
return origin.default;
|
|
30
29
|
}
|
|
31
30
|
return false;
|
|
32
31
|
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { emptyReadableStream } from "../../utils/stream";
|
|
2
|
+
const fetchProxy = {
|
|
3
|
+
name: "fetch-proxy",
|
|
4
|
+
// @ts-ignore
|
|
5
|
+
proxy: async (internalEvent) => {
|
|
6
|
+
const { url, headers, method, body } = internalEvent;
|
|
7
|
+
const response = await fetch(url, {
|
|
8
|
+
method,
|
|
9
|
+
headers,
|
|
10
|
+
body,
|
|
11
|
+
});
|
|
12
|
+
const responseHeaders = {};
|
|
13
|
+
response.headers.forEach((value, key) => {
|
|
14
|
+
responseHeaders[key] = value;
|
|
15
|
+
});
|
|
16
|
+
return {
|
|
17
|
+
type: "core",
|
|
18
|
+
headers: responseHeaders,
|
|
19
|
+
statusCode: response.status,
|
|
20
|
+
isBase64Encoded: true,
|
|
21
|
+
body: response.body ?? emptyReadableStream(),
|
|
22
|
+
};
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
export default fetchProxy;
|