|
6 | 6 | // @ts-ignore |
7 | 7 | import NextServer from "next/dist/server/next-server.js"; |
8 | 8 |
|
9 | | -import { debug } from "../adapters/logger.js"; |
| 9 | +import { debug, error } from "../adapters/logger.js"; |
10 | 10 | import { |
11 | 11 | applyOverride as applyNextjsRequireHooksOverride, |
12 | 12 | overrideHooks as overrideNextjsRequireHooks, |
@@ -59,6 +59,51 @@ const nextServer = new NextServer.default({ |
59 | 59 | dir: __dirname, |
60 | 60 | }); |
61 | 61 |
|
| 62 | +let alreadyLoaded = false; |
| 63 | + |
| 64 | +globalThis.__next_route_preloader = async (stage) => { |
| 65 | + if (alreadyLoaded) { |
| 66 | + return; |
| 67 | + } |
| 68 | + const thisFunction = globalThis.fnName |
| 69 | + ? globalThis.openNextConfig.functions![globalThis.fnName] |
| 70 | + : globalThis.openNextConfig.default; |
| 71 | + const routePreloadingBehavior = |
| 72 | + thisFunction?.routePreloadingBehavior ?? "none"; |
| 73 | + if (routePreloadingBehavior === "none") { |
| 74 | + alreadyLoaded = true; |
| 75 | + return; |
| 76 | + } |
| 77 | + if (!("unstable_preloadEntries" in nextServer)) { |
| 78 | + debug( |
| 79 | + "The current version of Next.js does not support route preloading. Skipping route preloading.", |
| 80 | + ); |
| 81 | + alreadyLoaded = true; |
| 82 | + return; |
| 83 | + } |
| 84 | + if (stage === "waitUntil" && routePreloadingBehavior === "withWaitUntil") { |
| 85 | + // We need to access the waitUntil |
| 86 | + const waitUntil = globalThis.__openNextAls.getStore()?.waitUntil; |
| 87 | + if (!waitUntil) { |
| 88 | + error( |
| 89 | + "You've tried to use the 'withWaitUntil' route preloading behavior, but the 'waitUntil' function is not available.", |
| 90 | + ); |
| 91 | + } |
| 92 | + debug("Preloading entries with waitUntil"); |
| 93 | + waitUntil?.(nextServer.unstable_preloadEntries()); |
| 94 | + alreadyLoaded = true; |
| 95 | + } else if ( |
| 96 | + (stage === "start" && routePreloadingBehavior === "onStart") || |
| 97 | + (stage === "warmerEvent" && routePreloadingBehavior === "onWarmerEvent") || |
| 98 | + stage === "onDemand" |
| 99 | + ) { |
| 100 | + const startTimestamp = Date.now(); |
| 101 | + debug("Preloading entries"); |
| 102 | + await nextServer.unstable_preloadEntries(); |
| 103 | + debug("Preloading entries took", Date.now() - startTimestamp, "ms"); |
| 104 | + alreadyLoaded = true; |
| 105 | + } |
| 106 | +}; |
62 | 107 | // `getRequestHandlerWithMetadata` is not available in older versions of Next.js |
63 | 108 | // It is required to for next 15.2 to pass metadata for page router data route |
64 | 109 | export const requestHandler = (metadata: Record<string, any>) => |
|
0 commit comments