@opennextjs/aws 3.5.4 → 3.5.5

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.
@@ -2,7 +2,7 @@ import { AsyncLocalStorage } from "node:async_hooks";
2
2
  import { IncomingMessage } from "../http/index.js";
3
3
  import { runWithOpenNextRequestContext } from "../utils/promise";
4
4
  import { NextConfig } from "../adapters/config/index";
5
- import { debug, error, warn } from "../adapters/logger";
5
+ import { debug, error } from "../adapters/logger";
6
6
  import { patchAsyncStorage } from "./patchAsyncStorage";
7
7
  import { constructNextUrl, convertRes, convertToQuery, createServerResponse, } from "./routing/util";
8
8
  import routingHandler, { INTERNAL_HEADER_INITIAL_URL, INTERNAL_HEADER_RESOLVED_ROUTES, MIDDLEWARE_HEADER_PREFIX, MIDDLEWARE_HEADER_PREFIX_LEN, } from "./routingHandler";
@@ -39,12 +39,7 @@ export async function openNextHandler(internalEvent, options) {
39
39
  ...internalHeaders,
40
40
  };
41
41
  //#override withRouting
42
- try {
43
- routingResult = await routingHandler(internalEvent);
44
- }
45
- catch (e) {
46
- warn("Routing failed.", e);
47
- }
42
+ routingResult = await routingHandler(internalEvent);
48
43
  //#endOverride
49
44
  const headers = "type" in routingResult
50
45
  ? routingResult.headers
@@ -117,13 +117,11 @@ export async function handleMiddleware(internalEvent, middlewareLoader = default
117
117
  // If the middleware returned a Rewrite, set the `url` to the pathname of the rewrite
118
118
  // NOTE: the header was added to `req` from above
119
119
  const rewriteUrl = responseHeaders.get("x-middleware-rewrite");
120
- let rewritten = false;
121
120
  let isExternalRewrite = false;
122
121
  let middlewareQueryString = internalEvent.query;
123
122
  let newUrl = internalEvent.url;
124
123
  if (rewriteUrl) {
125
124
  newUrl = rewriteUrl;
126
- rewritten = true;
127
125
  // If not a string, it should probably throw
128
126
  if (isExternal(newUrl, internalEvent.headers.host)) {
129
127
  isExternalRewrite = true;
@@ -202,7 +202,9 @@ export function fixCacheHeaderForHtmlPages(internalEvent, headers) {
202
202
  const localizedPath = localizePath(internalEvent);
203
203
  // WORKAROUND: `NextServer` does not set cache headers for HTML pages
204
204
  // https://opennext.js.org/aws/v2/advanced/workaround#workaround-nextserver-does-not-set-cache-headers-for-html-pages
205
- if (HtmlPages.includes(localizedPath)) {
205
+ // Requests containing an `x-middleware-prefetch` header must not be cached
206
+ if (HtmlPages.includes(localizedPath) &&
207
+ !internalEvent.headers["x-middleware-prefetch"]) {
206
208
  headers[CommonHeaders.CACHE_CONTROL] =
207
209
  "public, max-age=0, s-maxage=31536000, must-revalidate";
208
210
  }
@@ -1,5 +1,5 @@
1
1
  import { BuildId, ConfigHeaders, NextConfig, PrerenderManifest, RoutesManifest, } from "../adapters/config/index";
2
- import { debug } from "../adapters/logger";
2
+ import { debug, error } from "../adapters/logger";
3
3
  import { cacheInterceptor } from "./routing/cacheInterceptor";
4
4
  import { detectLocale } from "./routing/i18n";
5
5
  import { fixDataPage, getNextConfigHeaders, handleFallbackFalse, handleRedirects, handleRewrites, } from "./routing/matcher";
@@ -32,121 +32,149 @@ function applyMiddlewareHeaders(eventHeaders, middlewareHeaders, setPrefix = tru
32
32
  });
33
33
  }
34
34
  export default async function routingHandler(event) {
35
- // Add Next geo headers
36
- for (const [openNextGeoName, nextGeoName] of Object.entries(geoHeaderToNextHeader)) {
37
- const value = event.headers[openNextGeoName];
38
- if (value) {
39
- event.headers[nextGeoName] = value;
35
+ try {
36
+ // Add Next geo headers
37
+ for (const [openNextGeoName, nextGeoName] of Object.entries(geoHeaderToNextHeader)) {
38
+ const value = event.headers[openNextGeoName];
39
+ if (value) {
40
+ event.headers[nextGeoName] = value;
41
+ }
40
42
  }
41
- }
42
- // First we remove internal headers
43
- // We don't want to allow users to set these headers
44
- for (const key of Object.keys(event.headers)) {
45
- if (key.startsWith(INTERNAL_HEADER_PREFIX) ||
46
- key.startsWith(MIDDLEWARE_HEADER_PREFIX)) {
47
- delete event.headers[key];
43
+ // First we remove internal headers
44
+ // We don't want to allow users to set these headers
45
+ for (const key of Object.keys(event.headers)) {
46
+ if (key.startsWith(INTERNAL_HEADER_PREFIX) ||
47
+ key.startsWith(MIDDLEWARE_HEADER_PREFIX)) {
48
+ delete event.headers[key];
49
+ }
48
50
  }
49
- }
50
- const nextHeaders = getNextConfigHeaders(event, ConfigHeaders);
51
- let internalEvent = fixDataPage(event, BuildId);
52
- if ("statusCode" in internalEvent) {
53
- return internalEvent;
54
- }
55
- const redirect = handleRedirects(internalEvent, RoutesManifest.redirects);
56
- if (redirect) {
57
- debug("redirect", redirect);
58
- return redirect;
59
- }
60
- const eventOrResult = await handleMiddleware(internalEvent);
61
- const isResult = "statusCode" in eventOrResult;
62
- if (isResult) {
63
- return eventOrResult;
64
- }
65
- const middlewareResponseHeaders = eventOrResult.responseHeaders;
66
- let isExternalRewrite = eventOrResult.isExternalRewrite ?? false;
67
- // internalEvent is `InternalEvent | MiddlewareEvent`
68
- internalEvent = eventOrResult;
69
- if (!isExternalRewrite) {
70
- // First rewrite to be applied
71
- const beforeRewrites = handleRewrites(internalEvent, RoutesManifest.rewrites.beforeFiles);
72
- internalEvent = beforeRewrites.internalEvent;
73
- isExternalRewrite = beforeRewrites.isExternalRewrite;
74
- }
75
- const foundStaticRoute = staticRouteMatcher(internalEvent.rawPath);
76
- const isStaticRoute = !isExternalRewrite && foundStaticRoute.length > 0;
77
- if (!(isStaticRoute || isExternalRewrite)) {
78
- // Second rewrite to be applied
79
- const afterRewrites = handleRewrites(internalEvent, RoutesManifest.rewrites.afterFiles);
80
- internalEvent = afterRewrites.internalEvent;
81
- isExternalRewrite = afterRewrites.isExternalRewrite;
82
- }
83
- // We want to run this just before the dynamic route check
84
- const { event: fallbackEvent, isISR } = handleFallbackFalse(internalEvent, PrerenderManifest);
85
- internalEvent = fallbackEvent;
86
- const foundDynamicRoute = dynamicRouteMatcher(internalEvent.rawPath);
87
- const isDynamicRoute = !isExternalRewrite && foundDynamicRoute.length > 0;
88
- if (!(isDynamicRoute || isStaticRoute || isExternalRewrite)) {
89
- // Fallback rewrite to be applied
90
- const fallbackRewrites = handleRewrites(internalEvent, RoutesManifest.rewrites.fallback);
91
- internalEvent = fallbackRewrites.internalEvent;
92
- isExternalRewrite = fallbackRewrites.isExternalRewrite;
93
- }
94
- // Api routes are not present in the routes manifest except if they're not behind /api
95
- // /api even if it's a page route doesn't get generated in the manifest
96
- // Ideally we would need to properly check api routes here
97
- const isApiRoute = internalEvent.rawPath === apiPrefix ||
98
- internalEvent.rawPath.startsWith(`${apiPrefix}/`);
99
- const isNextImageRoute = internalEvent.rawPath.startsWith("/_next/image");
100
- const isRouteFoundBeforeAllRewrites = isStaticRoute || isDynamicRoute || isExternalRewrite;
101
- // If we still haven't found a route, we show the 404 page
102
- // We need to ensure that rewrites are applied before showing the 404 page
103
- if (!(isRouteFoundBeforeAllRewrites ||
104
- isApiRoute ||
105
- isNextImageRoute ||
106
- // We need to check again once all rewrites have been applied
107
- staticRouteMatcher(internalEvent.rawPath).length > 0 ||
108
- dynamicRouteMatcher(internalEvent.rawPath).length > 0)) {
109
- internalEvent = {
110
- ...internalEvent,
111
- rawPath: "/404",
112
- url: constructNextUrl(internalEvent.url, "/404"),
113
- headers: {
114
- ...internalEvent.headers,
115
- "x-middleware-response-cache-control": "private, no-cache, no-store, max-age=0, must-revalidate",
116
- },
117
- };
118
- }
119
- if (globalThis.openNextConfig.dangerous?.enableCacheInterception &&
120
- !("statusCode" in internalEvent)) {
121
- debug("Cache interception enabled");
122
- internalEvent = await cacheInterceptor(internalEvent);
51
+ const nextHeaders = getNextConfigHeaders(event, ConfigHeaders);
52
+ let internalEvent = fixDataPage(event, BuildId);
123
53
  if ("statusCode" in internalEvent) {
124
- applyMiddlewareHeaders(internalEvent.headers, {
125
- ...middlewareResponseHeaders,
126
- ...nextHeaders,
127
- }, false);
128
54
  return internalEvent;
129
55
  }
56
+ const redirect = handleRedirects(internalEvent, RoutesManifest.redirects);
57
+ if (redirect) {
58
+ debug("redirect", redirect);
59
+ return redirect;
60
+ }
61
+ const eventOrResult = await handleMiddleware(internalEvent);
62
+ const isResult = "statusCode" in eventOrResult;
63
+ if (isResult) {
64
+ return eventOrResult;
65
+ }
66
+ const middlewareResponseHeaders = eventOrResult.responseHeaders;
67
+ let isExternalRewrite = eventOrResult.isExternalRewrite ?? false;
68
+ // internalEvent is `InternalEvent | MiddlewareEvent`
69
+ internalEvent = eventOrResult;
70
+ if (!isExternalRewrite) {
71
+ // First rewrite to be applied
72
+ const beforeRewrites = handleRewrites(internalEvent, RoutesManifest.rewrites.beforeFiles);
73
+ internalEvent = beforeRewrites.internalEvent;
74
+ isExternalRewrite = beforeRewrites.isExternalRewrite;
75
+ }
76
+ const foundStaticRoute = staticRouteMatcher(internalEvent.rawPath);
77
+ const isStaticRoute = !isExternalRewrite && foundStaticRoute.length > 0;
78
+ if (!(isStaticRoute || isExternalRewrite)) {
79
+ // Second rewrite to be applied
80
+ const afterRewrites = handleRewrites(internalEvent, RoutesManifest.rewrites.afterFiles);
81
+ internalEvent = afterRewrites.internalEvent;
82
+ isExternalRewrite = afterRewrites.isExternalRewrite;
83
+ }
84
+ // We want to run this just before the dynamic route check
85
+ const { event: fallbackEvent, isISR } = handleFallbackFalse(internalEvent, PrerenderManifest);
86
+ internalEvent = fallbackEvent;
87
+ const foundDynamicRoute = dynamicRouteMatcher(internalEvent.rawPath);
88
+ const isDynamicRoute = !isExternalRewrite && foundDynamicRoute.length > 0;
89
+ if (!(isDynamicRoute || isStaticRoute || isExternalRewrite)) {
90
+ // Fallback rewrite to be applied
91
+ const fallbackRewrites = handleRewrites(internalEvent, RoutesManifest.rewrites.fallback);
92
+ internalEvent = fallbackRewrites.internalEvent;
93
+ isExternalRewrite = fallbackRewrites.isExternalRewrite;
94
+ }
95
+ // Api routes are not present in the routes manifest except if they're not behind /api
96
+ // /api even if it's a page route doesn't get generated in the manifest
97
+ // Ideally we would need to properly check api routes here
98
+ const isApiRoute = internalEvent.rawPath === apiPrefix ||
99
+ internalEvent.rawPath.startsWith(`${apiPrefix}/`);
100
+ const isNextImageRoute = internalEvent.rawPath.startsWith("/_next/image");
101
+ const isRouteFoundBeforeAllRewrites = isStaticRoute || isDynamicRoute || isExternalRewrite;
102
+ // If we still haven't found a route, we show the 404 page
103
+ // We need to ensure that rewrites are applied before showing the 404 page
104
+ if (!(isRouteFoundBeforeAllRewrites ||
105
+ isApiRoute ||
106
+ isNextImageRoute ||
107
+ // We need to check again once all rewrites have been applied
108
+ staticRouteMatcher(internalEvent.rawPath).length > 0 ||
109
+ dynamicRouteMatcher(internalEvent.rawPath).length > 0)) {
110
+ internalEvent = {
111
+ ...internalEvent,
112
+ rawPath: "/404",
113
+ url: constructNextUrl(internalEvent.url, "/404"),
114
+ headers: {
115
+ ...internalEvent.headers,
116
+ "x-middleware-response-cache-control": "private, no-cache, no-store, max-age=0, must-revalidate",
117
+ },
118
+ };
119
+ }
120
+ if (globalThis.openNextConfig.dangerous?.enableCacheInterception &&
121
+ !("statusCode" in internalEvent)) {
122
+ debug("Cache interception enabled");
123
+ internalEvent = await cacheInterceptor(internalEvent);
124
+ if ("statusCode" in internalEvent) {
125
+ applyMiddlewareHeaders(internalEvent.headers, {
126
+ ...middlewareResponseHeaders,
127
+ ...nextHeaders,
128
+ }, false);
129
+ return internalEvent;
130
+ }
131
+ }
132
+ // We apply the headers from the middleware response last
133
+ applyMiddlewareHeaders(internalEvent.headers, {
134
+ ...middlewareResponseHeaders,
135
+ ...nextHeaders,
136
+ });
137
+ const resolvedRoutes = [
138
+ ...foundStaticRoute,
139
+ ...foundDynamicRoute,
140
+ ];
141
+ debug("resolvedRoutes", resolvedRoutes);
142
+ return {
143
+ internalEvent,
144
+ isExternalRewrite,
145
+ origin: false,
146
+ isISR,
147
+ resolvedRoutes,
148
+ initialURL: event.url,
149
+ locale: NextConfig.i18n
150
+ ? detectLocale(internalEvent, NextConfig.i18n)
151
+ : undefined,
152
+ };
153
+ }
154
+ catch (e) {
155
+ error("Error in routingHandler", e);
156
+ // In case of an error, we want to return the 500 page from Next.js
157
+ return {
158
+ internalEvent: {
159
+ type: "core",
160
+ method: "GET",
161
+ rawPath: "/500",
162
+ url: constructNextUrl(event.url, "/500"),
163
+ headers: {
164
+ ...event.headers,
165
+ },
166
+ query: event.query,
167
+ cookies: event.cookies,
168
+ remoteAddress: event.remoteAddress,
169
+ },
170
+ isExternalRewrite: false,
171
+ origin: false,
172
+ isISR: false,
173
+ resolvedRoutes: [],
174
+ initialURL: event.url,
175
+ locale: NextConfig.i18n
176
+ ? detectLocale(event, NextConfig.i18n)
177
+ : undefined,
178
+ };
130
179
  }
131
- // We apply the headers from the middleware response last
132
- applyMiddlewareHeaders(internalEvent.headers, {
133
- ...middlewareResponseHeaders,
134
- ...nextHeaders,
135
- });
136
- const resolvedRoutes = [
137
- ...foundStaticRoute,
138
- ...foundDynamicRoute,
139
- ];
140
- debug("resolvedRoutes", resolvedRoutes);
141
- return {
142
- internalEvent,
143
- isExternalRewrite,
144
- origin: false,
145
- isISR,
146
- resolvedRoutes,
147
- initialURL: event.url,
148
- locale: NextConfig.i18n
149
- ? detectLocale(internalEvent, NextConfig.i18n)
150
- : undefined,
151
- };
152
180
  }
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "access": "public"
4
4
  },
5
5
  "name": "@opennextjs/aws",
6
- "version": "3.5.4",
6
+ "version": "3.5.5",
7
7
  "bin": {
8
8
  "open-next": "./dist/index.js"
9
9
  },