next 15.3.1-canary.2 → 15.3.1-canary.3

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.

Potentially problematic release.


This version of next might be problematic. Click here for more details.

Files changed (46) hide show
  1. package/dist/bin/next +1 -1
  2. package/dist/build/index.js +2 -2
  3. package/dist/build/swc/index.js +1 -1
  4. package/dist/build/webpack-config.js +2 -2
  5. package/dist/client/app-bootstrap.js +1 -1
  6. package/dist/client/index.js +1 -1
  7. package/dist/compiled/next-server/app-page-experimental.runtime.prod.js.map +1 -1
  8. package/dist/compiled/next-server/app-page-turbo-experimental.runtime.prod.js.map +1 -1
  9. package/dist/compiled/next-server/app-page-turbo.runtime.prod.js.map +1 -1
  10. package/dist/compiled/next-server/app-page.runtime.prod.js.map +1 -1
  11. package/dist/compiled/next-server/server.runtime.prod.js +2 -2
  12. package/dist/compiled/next-server/server.runtime.prod.js.map +1 -1
  13. package/dist/esm/build/index.js +2 -2
  14. package/dist/esm/build/swc/index.js +1 -1
  15. package/dist/esm/build/webpack-config.js +2 -2
  16. package/dist/esm/client/app-bootstrap.js +1 -1
  17. package/dist/esm/client/index.js +1 -1
  18. package/dist/esm/server/config-schema.js +1 -0
  19. package/dist/esm/server/config-schema.js.map +1 -1
  20. package/dist/esm/server/config-shared.js +1 -0
  21. package/dist/esm/server/config-shared.js.map +1 -1
  22. package/dist/esm/server/dev/hot-reloader-turbopack.js +1 -1
  23. package/dist/esm/server/dev/hot-reloader-webpack.js +1 -1
  24. package/dist/esm/server/lib/app-info-log.js +1 -1
  25. package/dist/esm/server/lib/start-server.js +1 -18
  26. package/dist/esm/server/lib/start-server.js.map +1 -1
  27. package/dist/esm/server/next-server.js +78 -1
  28. package/dist/esm/server/next-server.js.map +1 -1
  29. package/dist/esm/shared/lib/canary-only.js +1 -1
  30. package/dist/server/config-schema.js +1 -0
  31. package/dist/server/config-schema.js.map +1 -1
  32. package/dist/server/config-shared.d.ts +9 -0
  33. package/dist/server/config-shared.js +1 -0
  34. package/dist/server/config-shared.js.map +1 -1
  35. package/dist/server/dev/hot-reloader-turbopack.js +1 -1
  36. package/dist/server/dev/hot-reloader-webpack.js +1 -1
  37. package/dist/server/lib/app-info-log.js +1 -1
  38. package/dist/server/lib/start-server.js +1 -18
  39. package/dist/server/lib/start-server.js.map +1 -1
  40. package/dist/server/next-server.js +78 -1
  41. package/dist/server/next-server.js.map +1 -1
  42. package/dist/shared/lib/canary-only.js +1 -1
  43. package/dist/telemetry/anonymous-meta.js +1 -1
  44. package/dist/telemetry/events/session-stopped.js +2 -2
  45. package/dist/telemetry/events/version.js +2 -2
  46. package/package.json +15 -15
@@ -181,7 +181,7 @@ export default class HotReloaderWebpack {
181
181
  this.previewProps = previewProps;
182
182
  this.rewrites = rewrites;
183
183
  this.hotReloaderSpan = trace('hot-reloader', undefined, {
184
- version: "15.3.1-canary.2"
184
+ version: "15.3.1-canary.3"
185
185
  });
186
186
  // Ensure the hotReloaderSpan is flushed immediately as it's the parentSpan for all processing
187
187
  // of the current `next dev` invocation.
@@ -12,7 +12,7 @@ export function logStartInfo({ networkUrl, appUrl, envInfo, experimentalFeatures
12
12
  } else {
13
13
  bundlerSuffix = '';
14
14
  }
15
- Log.bootstrap(`${bold(purple(`${Log.prefixes.ready} Next.js ${"15.3.1-canary.2"}`))}${bundlerSuffix}`);
15
+ Log.bootstrap(`${bold(purple(`${Log.prefixes.ready} Next.js ${"15.3.1-canary.3"}`))}${bundlerSuffix}`);
16
16
  if (appUrl) {
17
17
  Log.bootstrap(`- Local: ${appUrl}`);
18
18
  }
@@ -20,7 +20,6 @@ import { CONFIG_FILES } from '../../shared/lib/constants';
20
20
  import { getStartServerInfo, logStartInfo } from './app-info-log';
21
21
  import { validateTurboNextConfig } from '../../lib/turbopack-warning';
22
22
  import { trace, flushAllTraces } from '../../trace';
23
- import { isPostpone } from './router-utils/is-postpone';
24
23
  import { isIPv6 } from './is-ipv6';
25
24
  import { AsyncCallbackSet } from './async-callback-set';
26
25
  const debug = setupDebug('next:start-server');
@@ -43,7 +42,7 @@ export async function getRequestHandlers({ dir, port, isDev, onDevServerCleanup,
43
42
  export async function startServer(serverOptions) {
44
43
  const { dir, isDev, hostname, minimalMode, allowRetry, keepAliveTimeout, selfSignedCertificate } = serverOptions;
45
44
  let { port } = serverOptions;
46
- process.title = `next-server (v${"15.3.1-canary.2"})`;
45
+ process.title = `next-server (v${"15.3.1-canary.3"})`;
47
46
  let handlersReady = ()=>{};
48
47
  let handlersError = ()=>{};
49
48
  let handlersPromise = new Promise((resolve, reject)=>{
@@ -211,28 +210,12 @@ export async function startServer(serverOptions) {
211
210
  process.exit(0);
212
211
  })();
213
212
  };
214
- const exception = (err)=>{
215
- if (isPostpone(err)) {
216
- // React postpones that are unhandled might end up logged here but they're
217
- // not really errors. They're just part of rendering.
218
- return;
219
- }
220
- // This is the render worker, we keep the process alive
221
- console.error(err);
222
- };
223
213
  // Make sure commands gracefully respect termination signals (e.g. from Docker)
224
214
  // Allow the graceful termination to be manually configurable
225
215
  if (!process.env.NEXT_MANUAL_SIG_HANDLE) {
226
216
  process.on('SIGINT', cleanup);
227
217
  process.on('SIGTERM', cleanup);
228
218
  }
229
- process.on('rejectionHandled', ()=>{
230
- // It is ok to await a Promise late in Next.js as it allows for better
231
- // prefetching patterns to avoid waterfalls. We ignore loggining these.
232
- // We should've already errored in anyway unhandledRejection.
233
- });
234
- process.on('uncaughtException', exception);
235
- process.on('unhandledRejection', exception);
236
219
  const initResult = await getRequestHandlers({
237
220
  dir,
238
221
  port,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/server/lib/start-server.ts"],"sourcesContent":["import { getNetworkHost } from '../../lib/get-network-host'\n\nif (performance.getEntriesByName('next-start').length === 0) {\n performance.mark('next-start')\n}\nimport '../next'\nimport '../require-hook'\n\nimport type { IncomingMessage, ServerResponse } from 'http'\nimport type { SelfSignedCertificate } from '../../lib/mkcert'\nimport type { WorkerRequestHandler, WorkerUpgradeHandler } from './types'\n\nimport fs from 'fs'\nimport v8 from 'v8'\nimport path from 'path'\nimport http from 'http'\nimport https from 'https'\nimport os from 'os'\nimport Watchpack from 'next/dist/compiled/watchpack'\nimport * as Log from '../../build/output/log'\nimport setupDebug from 'next/dist/compiled/debug'\nimport {\n RESTART_EXIT_CODE,\n getFormattedDebugAddress,\n getNodeDebugType,\n} from './utils'\nimport { formatHostname } from './format-hostname'\nimport { initialize } from './router-server'\nimport { CONFIG_FILES } from '../../shared/lib/constants'\nimport { getStartServerInfo, logStartInfo } from './app-info-log'\nimport { validateTurboNextConfig } from '../../lib/turbopack-warning'\nimport { type Span, trace, flushAllTraces } from '../../trace'\nimport { isPostpone } from './router-utils/is-postpone'\nimport { isIPv6 } from './is-ipv6'\nimport { AsyncCallbackSet } from './async-callback-set'\nimport type { NextServer } from '../next'\nimport type { ConfiguredExperimentalFeature } from '../config'\n\nconst debug = setupDebug('next:start-server')\nlet startServerSpan: Span | undefined\n\nexport interface StartServerOptions {\n dir: string\n port: number\n isDev: boolean\n hostname?: string\n allowRetry?: boolean\n customServer?: boolean\n minimalMode?: boolean\n keepAliveTimeout?: number\n // this is dev-server only\n selfSignedCertificate?: SelfSignedCertificate\n}\n\nexport async function getRequestHandlers({\n dir,\n port,\n isDev,\n onDevServerCleanup,\n server,\n hostname,\n minimalMode,\n keepAliveTimeout,\n experimentalHttpsServer,\n quiet,\n}: {\n dir: string\n port: number\n isDev: boolean\n onDevServerCleanup: ((listener: () => Promise<void>) => void) | undefined\n server?: import('http').Server\n hostname?: string\n minimalMode?: boolean\n keepAliveTimeout?: number\n experimentalHttpsServer?: boolean\n quiet?: boolean\n}): ReturnType<typeof initialize> {\n return initialize({\n dir,\n port,\n hostname,\n onDevServerCleanup,\n dev: isDev,\n minimalMode,\n server,\n keepAliveTimeout,\n experimentalHttpsServer,\n startServerSpan,\n quiet,\n })\n}\n\nexport async function startServer(\n serverOptions: StartServerOptions\n): Promise<void> {\n const {\n dir,\n isDev,\n hostname,\n minimalMode,\n allowRetry,\n keepAliveTimeout,\n selfSignedCertificate,\n } = serverOptions\n let { port } = serverOptions\n\n process.title = `next-server (v${process.env.__NEXT_VERSION})`\n let handlersReady = () => {}\n let handlersError = () => {}\n\n let handlersPromise: Promise<void> | undefined = new Promise<void>(\n (resolve, reject) => {\n handlersReady = resolve\n handlersError = reject\n }\n )\n let requestHandler: WorkerRequestHandler = async (\n req: IncomingMessage,\n res: ServerResponse\n ): Promise<void> => {\n if (handlersPromise) {\n await handlersPromise\n return requestHandler(req, res)\n }\n throw new Error('Invariant request handler was not setup')\n }\n let upgradeHandler: WorkerUpgradeHandler = async (\n req,\n socket,\n head\n ): Promise<void> => {\n if (handlersPromise) {\n await handlersPromise\n return upgradeHandler(req, socket, head)\n }\n throw new Error('Invariant upgrade handler was not setup')\n }\n\n let nextServer: NextServer | undefined\n\n // setup server listener as fast as possible\n if (selfSignedCertificate && !isDev) {\n throw new Error(\n 'Using a self signed certificate is only supported with `next dev`.'\n )\n }\n\n async function requestListener(req: IncomingMessage, res: ServerResponse) {\n try {\n if (handlersPromise) {\n await handlersPromise\n handlersPromise = undefined\n }\n await requestHandler(req, res)\n } catch (err) {\n res.statusCode = 500\n res.end('Internal Server Error')\n Log.error(`Failed to handle request for ${req.url}`)\n console.error(err)\n } finally {\n if (isDev) {\n if (\n v8.getHeapStatistics().used_heap_size >\n 0.8 * v8.getHeapStatistics().heap_size_limit\n ) {\n Log.warn(\n `Server is approaching the used memory threshold, restarting...`\n )\n trace('server-restart-close-to-memory-threshold', undefined, {\n 'memory.heapSizeLimit': String(\n v8.getHeapStatistics().heap_size_limit\n ),\n 'memory.heapUsed': String(v8.getHeapStatistics().used_heap_size),\n }).stop()\n await flushAllTraces()\n process.exit(RESTART_EXIT_CODE)\n }\n }\n }\n }\n\n const server = selfSignedCertificate\n ? https.createServer(\n {\n key: fs.readFileSync(selfSignedCertificate.key),\n cert: fs.readFileSync(selfSignedCertificate.cert),\n },\n requestListener\n )\n : http.createServer(requestListener)\n\n if (keepAliveTimeout) {\n server.keepAliveTimeout = keepAliveTimeout\n }\n server.on('upgrade', async (req, socket, head) => {\n try {\n await upgradeHandler(req, socket, head)\n } catch (err) {\n socket.destroy()\n Log.error(`Failed to handle request for ${req.url}`)\n console.error(err)\n }\n })\n\n let portRetryCount = 0\n const originalPort = port\n\n server.on('error', (err: NodeJS.ErrnoException) => {\n if (\n allowRetry &&\n port &&\n isDev &&\n err.code === 'EADDRINUSE' &&\n portRetryCount < 10\n ) {\n port += 1\n portRetryCount += 1\n server.listen(port, hostname)\n } else {\n Log.error(`Failed to start server`)\n console.error(err)\n process.exit(1)\n }\n })\n\n let cleanupListeners = isDev ? new AsyncCallbackSet() : undefined\n\n await new Promise<void>((resolve) => {\n server.on('listening', async () => {\n const nodeDebugType = getNodeDebugType()\n\n const addr = server.address()\n const actualHostname = formatHostname(\n typeof addr === 'object'\n ? addr?.address || hostname || 'localhost'\n : addr\n )\n const formattedHostname =\n !hostname || actualHostname === '0.0.0.0'\n ? 'localhost'\n : actualHostname === '[::]'\n ? '[::1]'\n : formatHostname(hostname)\n\n port = typeof addr === 'object' ? addr?.port || port : port\n\n if (portRetryCount) {\n Log.warn(\n `Port ${originalPort} is in use, using available port ${port} instead.`\n )\n }\n\n const networkHostname =\n hostname ?? getNetworkHost(isIPv6(actualHostname) ? 'IPv6' : 'IPv4')\n\n const protocol = selfSignedCertificate ? 'https' : 'http'\n\n const networkUrl = networkHostname\n ? `${protocol}://${formatHostname(networkHostname)}:${port}`\n : null\n\n const appUrl = `${protocol}://${formattedHostname}:${port}`\n\n if (nodeDebugType) {\n const formattedDebugAddress = getFormattedDebugAddress()\n Log.info(\n `the --${nodeDebugType} option was detected, the Next.js router server should be inspected at ${formattedDebugAddress}.`\n )\n }\n\n // Store the selected port to:\n // - expose it to render workers\n // - re-use it for automatic dev server restarts with a randomly selected port\n process.env.PORT = port + ''\n\n process.env.__NEXT_PRIVATE_ORIGIN = appUrl\n\n // Only load env and config in dev to for logging purposes\n let envInfo: string[] | undefined\n let experimentalFeatures: ConfiguredExperimentalFeature[] | undefined\n if (isDev) {\n const startServerInfo = await getStartServerInfo(dir, isDev)\n envInfo = startServerInfo.envInfo\n experimentalFeatures = startServerInfo.experimentalFeatures\n }\n logStartInfo({\n networkUrl,\n appUrl,\n envInfo,\n experimentalFeatures,\n maxExperimentalFeatures: 3,\n })\n\n Log.event(`Starting...`)\n\n try {\n let cleanupStarted = false\n let closeUpgraded: (() => void) | null = null\n const cleanup = () => {\n if (cleanupStarted) {\n // We can get duplicate signals, e.g. when `ctrl+c` is used in an\n // interactive shell (i.e. bash, zsh), the shell will recursively\n // send SIGINT to children. The parent `next-dev` process will also\n // send us SIGINT.\n return\n }\n cleanupStarted = true\n ;(async () => {\n debug('start-server process cleanup')\n\n // first, stop accepting new connections and finish pending requests,\n // because they might affect `nextServer.close()` (e.g. by scheduling an `after`)\n await new Promise<void>((res) => {\n server.close((err) => {\n if (err) console.error(err)\n res()\n })\n if (isDev) {\n server.closeAllConnections()\n closeUpgraded?.()\n }\n })\n\n // now that no new requests can come in, clean up the rest\n await Promise.all([\n nextServer?.close().catch(console.error),\n cleanupListeners?.runAll().catch(console.error),\n ])\n\n debug('start-server process cleanup finished')\n process.exit(0)\n })()\n }\n const exception = (err: Error) => {\n if (isPostpone(err)) {\n // React postpones that are unhandled might end up logged here but they're\n // not really errors. They're just part of rendering.\n return\n }\n\n // This is the render worker, we keep the process alive\n console.error(err)\n }\n // Make sure commands gracefully respect termination signals (e.g. from Docker)\n // Allow the graceful termination to be manually configurable\n if (!process.env.NEXT_MANUAL_SIG_HANDLE) {\n process.on('SIGINT', cleanup)\n process.on('SIGTERM', cleanup)\n }\n process.on('rejectionHandled', () => {\n // It is ok to await a Promise late in Next.js as it allows for better\n // prefetching patterns to avoid waterfalls. We ignore loggining these.\n // We should've already errored in anyway unhandledRejection.\n })\n process.on('uncaughtException', exception)\n process.on('unhandledRejection', exception)\n\n const initResult = await getRequestHandlers({\n dir,\n port,\n isDev,\n onDevServerCleanup: cleanupListeners\n ? cleanupListeners.add.bind(cleanupListeners)\n : undefined,\n server,\n hostname,\n minimalMode,\n keepAliveTimeout,\n experimentalHttpsServer: !!selfSignedCertificate,\n })\n requestHandler = initResult.requestHandler\n upgradeHandler = initResult.upgradeHandler\n nextServer = initResult.server\n closeUpgraded = initResult.closeUpgraded\n\n const startServerProcessDuration =\n performance.mark('next-start-end') &&\n performance.measure(\n 'next-start-duration',\n 'next-start',\n 'next-start-end'\n ).duration\n\n handlersReady()\n const formatDurationText =\n startServerProcessDuration > 2000\n ? `${Math.round(startServerProcessDuration / 100) / 10}s`\n : `${Math.round(startServerProcessDuration)}ms`\n\n Log.event(`Ready in ${formatDurationText}`)\n\n if (process.env.TURBOPACK) {\n await validateTurboNextConfig({\n dir: serverOptions.dir,\n isDev: true,\n })\n }\n } catch (err) {\n // fatal error if we can't setup\n handlersError()\n console.error(err)\n process.exit(1)\n }\n\n resolve()\n })\n server.listen(port, hostname)\n })\n\n if (isDev) {\n function watchConfigFiles(\n dirToWatch: string,\n onChange: (filename: string) => void\n ) {\n const wp = new Watchpack()\n wp.watch({\n files: CONFIG_FILES.map((file) => path.join(dirToWatch, file)),\n })\n wp.on('change', onChange)\n }\n watchConfigFiles(dir, async (filename) => {\n if (process.env.__NEXT_DISABLE_MEMORY_WATCHER) {\n Log.info(\n `Detected change, manual restart required due to '__NEXT_DISABLE_MEMORY_WATCHER' usage`\n )\n return\n }\n\n Log.warn(\n `Found a change in ${path.basename(\n filename\n )}. Restarting the server to apply the changes...`\n )\n process.exit(RESTART_EXIT_CODE)\n })\n }\n}\n\nif (process.env.NEXT_PRIVATE_WORKER && process.send) {\n process.addListener('message', async (msg: any) => {\n if (\n msg &&\n typeof msg === 'object' &&\n msg.nextWorkerOptions &&\n process.send\n ) {\n startServerSpan = trace('start-dev-server', undefined, {\n cpus: String(os.cpus().length),\n platform: os.platform(),\n 'memory.freeMem': String(os.freemem()),\n 'memory.totalMem': String(os.totalmem()),\n 'memory.heapSizeLimit': String(v8.getHeapStatistics().heap_size_limit),\n })\n await startServerSpan.traceAsyncFn(() =>\n startServer(msg.nextWorkerOptions)\n )\n const memoryUsage = process.memoryUsage()\n startServerSpan.setAttribute('memory.rss', String(memoryUsage.rss))\n startServerSpan.setAttribute(\n 'memory.heapTotal',\n String(memoryUsage.heapTotal)\n )\n startServerSpan.setAttribute(\n 'memory.heapUsed',\n String(memoryUsage.heapUsed)\n )\n process.send({ nextServerReady: true, port: process.env.PORT })\n }\n })\n process.send({ nextWorkerReady: true })\n}\n"],"names":["getNetworkHost","performance","getEntriesByName","length","mark","fs","v8","path","http","https","os","Watchpack","Log","setupDebug","RESTART_EXIT_CODE","getFormattedDebugAddress","getNodeDebugType","formatHostname","initialize","CONFIG_FILES","getStartServerInfo","logStartInfo","validateTurboNextConfig","trace","flushAllTraces","isPostpone","isIPv6","AsyncCallbackSet","debug","startServerSpan","getRequestHandlers","dir","port","isDev","onDevServerCleanup","server","hostname","minimalMode","keepAliveTimeout","experimentalHttpsServer","quiet","dev","startServer","serverOptions","allowRetry","selfSignedCertificate","process","title","env","__NEXT_VERSION","handlersReady","handlersError","handlersPromise","Promise","resolve","reject","requestHandler","req","res","Error","upgradeHandler","socket","head","nextServer","requestListener","undefined","err","statusCode","end","error","url","console","getHeapStatistics","used_heap_size","heap_size_limit","warn","String","stop","exit","createServer","key","readFileSync","cert","on","destroy","portRetryCount","originalPort","code","listen","cleanupListeners","nodeDebugType","addr","address","actualHostname","formattedHostname","networkHostname","protocol","networkUrl","appUrl","formattedDebugAddress","info","PORT","__NEXT_PRIVATE_ORIGIN","envInfo","experimentalFeatures","startServerInfo","maxExperimentalFeatures","event","cleanupStarted","closeUpgraded","cleanup","close","closeAllConnections","all","catch","runAll","exception","NEXT_MANUAL_SIG_HANDLE","initResult","add","bind","startServerProcessDuration","measure","duration","formatDurationText","Math","round","TURBOPACK","watchConfigFiles","dirToWatch","onChange","wp","watch","files","map","file","join","filename","__NEXT_DISABLE_MEMORY_WATCHER","basename","NEXT_PRIVATE_WORKER","send","addListener","msg","nextWorkerOptions","cpus","platform","freemem","totalmem","traceAsyncFn","memoryUsage","setAttribute","rss","heapTotal","heapUsed","nextServerReady","nextWorkerReady"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/server/lib/start-server.ts"],"sourcesContent":["import { getNetworkHost } from '../../lib/get-network-host'\n\nif (performance.getEntriesByName('next-start').length === 0) {\n performance.mark('next-start')\n}\nimport '../next'\nimport '../require-hook'\n\nimport type { IncomingMessage, ServerResponse } from 'http'\nimport type { SelfSignedCertificate } from '../../lib/mkcert'\nimport type { WorkerRequestHandler, WorkerUpgradeHandler } from './types'\n\nimport fs from 'fs'\nimport v8 from 'v8'\nimport path from 'path'\nimport http from 'http'\nimport https from 'https'\nimport os from 'os'\nimport Watchpack from 'next/dist/compiled/watchpack'\nimport * as Log from '../../build/output/log'\nimport setupDebug from 'next/dist/compiled/debug'\nimport {\n RESTART_EXIT_CODE,\n getFormattedDebugAddress,\n getNodeDebugType,\n} from './utils'\nimport { formatHostname } from './format-hostname'\nimport { initialize } from './router-server'\nimport { CONFIG_FILES } from '../../shared/lib/constants'\nimport { getStartServerInfo, logStartInfo } from './app-info-log'\nimport { validateTurboNextConfig } from '../../lib/turbopack-warning'\nimport { type Span, trace, flushAllTraces } from '../../trace'\nimport { isIPv6 } from './is-ipv6'\nimport { AsyncCallbackSet } from './async-callback-set'\nimport type { NextServer } from '../next'\nimport type { ConfiguredExperimentalFeature } from '../config'\n\nconst debug = setupDebug('next:start-server')\nlet startServerSpan: Span | undefined\n\nexport interface StartServerOptions {\n dir: string\n port: number\n isDev: boolean\n hostname?: string\n allowRetry?: boolean\n customServer?: boolean\n minimalMode?: boolean\n keepAliveTimeout?: number\n // this is dev-server only\n selfSignedCertificate?: SelfSignedCertificate\n}\n\nexport async function getRequestHandlers({\n dir,\n port,\n isDev,\n onDevServerCleanup,\n server,\n hostname,\n minimalMode,\n keepAliveTimeout,\n experimentalHttpsServer,\n quiet,\n}: {\n dir: string\n port: number\n isDev: boolean\n onDevServerCleanup: ((listener: () => Promise<void>) => void) | undefined\n server?: import('http').Server\n hostname?: string\n minimalMode?: boolean\n keepAliveTimeout?: number\n experimentalHttpsServer?: boolean\n quiet?: boolean\n}): ReturnType<typeof initialize> {\n return initialize({\n dir,\n port,\n hostname,\n onDevServerCleanup,\n dev: isDev,\n minimalMode,\n server,\n keepAliveTimeout,\n experimentalHttpsServer,\n startServerSpan,\n quiet,\n })\n}\n\nexport async function startServer(\n serverOptions: StartServerOptions\n): Promise<void> {\n const {\n dir,\n isDev,\n hostname,\n minimalMode,\n allowRetry,\n keepAliveTimeout,\n selfSignedCertificate,\n } = serverOptions\n let { port } = serverOptions\n\n process.title = `next-server (v${process.env.__NEXT_VERSION})`\n let handlersReady = () => {}\n let handlersError = () => {}\n\n let handlersPromise: Promise<void> | undefined = new Promise<void>(\n (resolve, reject) => {\n handlersReady = resolve\n handlersError = reject\n }\n )\n let requestHandler: WorkerRequestHandler = async (\n req: IncomingMessage,\n res: ServerResponse\n ): Promise<void> => {\n if (handlersPromise) {\n await handlersPromise\n return requestHandler(req, res)\n }\n throw new Error('Invariant request handler was not setup')\n }\n let upgradeHandler: WorkerUpgradeHandler = async (\n req,\n socket,\n head\n ): Promise<void> => {\n if (handlersPromise) {\n await handlersPromise\n return upgradeHandler(req, socket, head)\n }\n throw new Error('Invariant upgrade handler was not setup')\n }\n\n let nextServer: NextServer | undefined\n\n // setup server listener as fast as possible\n if (selfSignedCertificate && !isDev) {\n throw new Error(\n 'Using a self signed certificate is only supported with `next dev`.'\n )\n }\n\n async function requestListener(req: IncomingMessage, res: ServerResponse) {\n try {\n if (handlersPromise) {\n await handlersPromise\n handlersPromise = undefined\n }\n await requestHandler(req, res)\n } catch (err) {\n res.statusCode = 500\n res.end('Internal Server Error')\n Log.error(`Failed to handle request for ${req.url}`)\n console.error(err)\n } finally {\n if (isDev) {\n if (\n v8.getHeapStatistics().used_heap_size >\n 0.8 * v8.getHeapStatistics().heap_size_limit\n ) {\n Log.warn(\n `Server is approaching the used memory threshold, restarting...`\n )\n trace('server-restart-close-to-memory-threshold', undefined, {\n 'memory.heapSizeLimit': String(\n v8.getHeapStatistics().heap_size_limit\n ),\n 'memory.heapUsed': String(v8.getHeapStatistics().used_heap_size),\n }).stop()\n await flushAllTraces()\n process.exit(RESTART_EXIT_CODE)\n }\n }\n }\n }\n\n const server = selfSignedCertificate\n ? https.createServer(\n {\n key: fs.readFileSync(selfSignedCertificate.key),\n cert: fs.readFileSync(selfSignedCertificate.cert),\n },\n requestListener\n )\n : http.createServer(requestListener)\n\n if (keepAliveTimeout) {\n server.keepAliveTimeout = keepAliveTimeout\n }\n server.on('upgrade', async (req, socket, head) => {\n try {\n await upgradeHandler(req, socket, head)\n } catch (err) {\n socket.destroy()\n Log.error(`Failed to handle request for ${req.url}`)\n console.error(err)\n }\n })\n\n let portRetryCount = 0\n const originalPort = port\n\n server.on('error', (err: NodeJS.ErrnoException) => {\n if (\n allowRetry &&\n port &&\n isDev &&\n err.code === 'EADDRINUSE' &&\n portRetryCount < 10\n ) {\n port += 1\n portRetryCount += 1\n server.listen(port, hostname)\n } else {\n Log.error(`Failed to start server`)\n console.error(err)\n process.exit(1)\n }\n })\n\n let cleanupListeners = isDev ? new AsyncCallbackSet() : undefined\n\n await new Promise<void>((resolve) => {\n server.on('listening', async () => {\n const nodeDebugType = getNodeDebugType()\n\n const addr = server.address()\n const actualHostname = formatHostname(\n typeof addr === 'object'\n ? addr?.address || hostname || 'localhost'\n : addr\n )\n const formattedHostname =\n !hostname || actualHostname === '0.0.0.0'\n ? 'localhost'\n : actualHostname === '[::]'\n ? '[::1]'\n : formatHostname(hostname)\n\n port = typeof addr === 'object' ? addr?.port || port : port\n\n if (portRetryCount) {\n Log.warn(\n `Port ${originalPort} is in use, using available port ${port} instead.`\n )\n }\n\n const networkHostname =\n hostname ?? getNetworkHost(isIPv6(actualHostname) ? 'IPv6' : 'IPv4')\n\n const protocol = selfSignedCertificate ? 'https' : 'http'\n\n const networkUrl = networkHostname\n ? `${protocol}://${formatHostname(networkHostname)}:${port}`\n : null\n\n const appUrl = `${protocol}://${formattedHostname}:${port}`\n\n if (nodeDebugType) {\n const formattedDebugAddress = getFormattedDebugAddress()\n Log.info(\n `the --${nodeDebugType} option was detected, the Next.js router server should be inspected at ${formattedDebugAddress}.`\n )\n }\n\n // Store the selected port to:\n // - expose it to render workers\n // - re-use it for automatic dev server restarts with a randomly selected port\n process.env.PORT = port + ''\n\n process.env.__NEXT_PRIVATE_ORIGIN = appUrl\n\n // Only load env and config in dev to for logging purposes\n let envInfo: string[] | undefined\n let experimentalFeatures: ConfiguredExperimentalFeature[] | undefined\n if (isDev) {\n const startServerInfo = await getStartServerInfo(dir, isDev)\n envInfo = startServerInfo.envInfo\n experimentalFeatures = startServerInfo.experimentalFeatures\n }\n logStartInfo({\n networkUrl,\n appUrl,\n envInfo,\n experimentalFeatures,\n maxExperimentalFeatures: 3,\n })\n\n Log.event(`Starting...`)\n\n try {\n let cleanupStarted = false\n let closeUpgraded: (() => void) | null = null\n const cleanup = () => {\n if (cleanupStarted) {\n // We can get duplicate signals, e.g. when `ctrl+c` is used in an\n // interactive shell (i.e. bash, zsh), the shell will recursively\n // send SIGINT to children. The parent `next-dev` process will also\n // send us SIGINT.\n return\n }\n cleanupStarted = true\n ;(async () => {\n debug('start-server process cleanup')\n\n // first, stop accepting new connections and finish pending requests,\n // because they might affect `nextServer.close()` (e.g. by scheduling an `after`)\n await new Promise<void>((res) => {\n server.close((err) => {\n if (err) console.error(err)\n res()\n })\n if (isDev) {\n server.closeAllConnections()\n closeUpgraded?.()\n }\n })\n\n // now that no new requests can come in, clean up the rest\n await Promise.all([\n nextServer?.close().catch(console.error),\n cleanupListeners?.runAll().catch(console.error),\n ])\n\n debug('start-server process cleanup finished')\n process.exit(0)\n })()\n }\n\n // Make sure commands gracefully respect termination signals (e.g. from Docker)\n // Allow the graceful termination to be manually configurable\n if (!process.env.NEXT_MANUAL_SIG_HANDLE) {\n process.on('SIGINT', cleanup)\n process.on('SIGTERM', cleanup)\n }\n\n const initResult = await getRequestHandlers({\n dir,\n port,\n isDev,\n onDevServerCleanup: cleanupListeners\n ? cleanupListeners.add.bind(cleanupListeners)\n : undefined,\n server,\n hostname,\n minimalMode,\n keepAliveTimeout,\n experimentalHttpsServer: !!selfSignedCertificate,\n })\n requestHandler = initResult.requestHandler\n upgradeHandler = initResult.upgradeHandler\n nextServer = initResult.server\n closeUpgraded = initResult.closeUpgraded\n\n const startServerProcessDuration =\n performance.mark('next-start-end') &&\n performance.measure(\n 'next-start-duration',\n 'next-start',\n 'next-start-end'\n ).duration\n\n handlersReady()\n const formatDurationText =\n startServerProcessDuration > 2000\n ? `${Math.round(startServerProcessDuration / 100) / 10}s`\n : `${Math.round(startServerProcessDuration)}ms`\n\n Log.event(`Ready in ${formatDurationText}`)\n\n if (process.env.TURBOPACK) {\n await validateTurboNextConfig({\n dir: serverOptions.dir,\n isDev: true,\n })\n }\n } catch (err) {\n // fatal error if we can't setup\n handlersError()\n console.error(err)\n process.exit(1)\n }\n\n resolve()\n })\n server.listen(port, hostname)\n })\n\n if (isDev) {\n function watchConfigFiles(\n dirToWatch: string,\n onChange: (filename: string) => void\n ) {\n const wp = new Watchpack()\n wp.watch({\n files: CONFIG_FILES.map((file) => path.join(dirToWatch, file)),\n })\n wp.on('change', onChange)\n }\n watchConfigFiles(dir, async (filename) => {\n if (process.env.__NEXT_DISABLE_MEMORY_WATCHER) {\n Log.info(\n `Detected change, manual restart required due to '__NEXT_DISABLE_MEMORY_WATCHER' usage`\n )\n return\n }\n\n Log.warn(\n `Found a change in ${path.basename(\n filename\n )}. Restarting the server to apply the changes...`\n )\n process.exit(RESTART_EXIT_CODE)\n })\n }\n}\n\nif (process.env.NEXT_PRIVATE_WORKER && process.send) {\n process.addListener('message', async (msg: any) => {\n if (\n msg &&\n typeof msg === 'object' &&\n msg.nextWorkerOptions &&\n process.send\n ) {\n startServerSpan = trace('start-dev-server', undefined, {\n cpus: String(os.cpus().length),\n platform: os.platform(),\n 'memory.freeMem': String(os.freemem()),\n 'memory.totalMem': String(os.totalmem()),\n 'memory.heapSizeLimit': String(v8.getHeapStatistics().heap_size_limit),\n })\n await startServerSpan.traceAsyncFn(() =>\n startServer(msg.nextWorkerOptions)\n )\n const memoryUsage = process.memoryUsage()\n startServerSpan.setAttribute('memory.rss', String(memoryUsage.rss))\n startServerSpan.setAttribute(\n 'memory.heapTotal',\n String(memoryUsage.heapTotal)\n )\n startServerSpan.setAttribute(\n 'memory.heapUsed',\n String(memoryUsage.heapUsed)\n )\n process.send({ nextServerReady: true, port: process.env.PORT })\n }\n })\n process.send({ nextWorkerReady: true })\n}\n"],"names":["getNetworkHost","performance","getEntriesByName","length","mark","fs","v8","path","http","https","os","Watchpack","Log","setupDebug","RESTART_EXIT_CODE","getFormattedDebugAddress","getNodeDebugType","formatHostname","initialize","CONFIG_FILES","getStartServerInfo","logStartInfo","validateTurboNextConfig","trace","flushAllTraces","isIPv6","AsyncCallbackSet","debug","startServerSpan","getRequestHandlers","dir","port","isDev","onDevServerCleanup","server","hostname","minimalMode","keepAliveTimeout","experimentalHttpsServer","quiet","dev","startServer","serverOptions","allowRetry","selfSignedCertificate","process","title","env","__NEXT_VERSION","handlersReady","handlersError","handlersPromise","Promise","resolve","reject","requestHandler","req","res","Error","upgradeHandler","socket","head","nextServer","requestListener","undefined","err","statusCode","end","error","url","console","getHeapStatistics","used_heap_size","heap_size_limit","warn","String","stop","exit","createServer","key","readFileSync","cert","on","destroy","portRetryCount","originalPort","code","listen","cleanupListeners","nodeDebugType","addr","address","actualHostname","formattedHostname","networkHostname","protocol","networkUrl","appUrl","formattedDebugAddress","info","PORT","__NEXT_PRIVATE_ORIGIN","envInfo","experimentalFeatures","startServerInfo","maxExperimentalFeatures","event","cleanupStarted","closeUpgraded","cleanup","close","closeAllConnections","all","catch","runAll","NEXT_MANUAL_SIG_HANDLE","initResult","add","bind","startServerProcessDuration","measure","duration","formatDurationText","Math","round","TURBOPACK","watchConfigFiles","dirToWatch","onChange","wp","watch","files","map","file","join","filename","__NEXT_DISABLE_MEMORY_WATCHER","basename","NEXT_PRIVATE_WORKER","send","addListener","msg","nextWorkerOptions","cpus","platform","freemem","totalmem","traceAsyncFn","memoryUsage","setAttribute","rss","heapTotal","heapUsed","nextServerReady","nextWorkerReady"],"mappings":"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"}
@@ -53,6 +53,7 @@ import { AwaiterOnce } from './after/awaiter';
53
53
  import { AsyncCallbackSet } from './lib/async-callback-set';
54
54
  import { initializeCacheHandlers, setCacheHandler } from './use-cache/handlers';
55
55
  import { populateStaticEnv } from '../lib/static-env';
56
+ import { isPostpone } from './lib/router-utils/is-postpone';
56
57
  export * from './base-server';
57
58
  // For module that can be both CJS or ESM
58
59
  const dynamicImportEsmDefault = process.env.NEXT_MINIMAL ? (id)=>import(/* webpackIgnore: true */ id).then((mod)=>mod.default || mod) : (id)=>import(id).then((mod)=>mod.default || mod);
@@ -75,9 +76,83 @@ function getMiddlewareMatcher(info) {
75
76
  MiddlewareMatcherCache.set(info, matcher);
76
77
  return matcher;
77
78
  }
79
+ function installProcessErrorHandlers(shouldRemoveUnhandledRejectionListeners) {
80
+ // The conventional wisdom of Node.js and other runtimes is to treat
81
+ // unhandled errors as fatal and exit the process.
82
+ //
83
+ // But Next.js is not a generic JS runtime — it's a specialized runtime for
84
+ // React Server Components.
85
+ //
86
+ // Many unhandled rejections are due to the late-awaiting pattern for
87
+ // prefetching data. In Next.js it's OK to call an async function without
88
+ // immediately awaiting it, to start the request as soon as possible
89
+ // without blocking unncessarily on the result. These can end up
90
+ // triggering an "unhandledRejection" if it later turns out that the
91
+ // data is not needed to render the page. Example:
92
+ //
93
+ // const promise = fetchData()
94
+ // const shouldShow = await checkCondition()
95
+ // if (shouldShow) {
96
+ // return <Component promise={promise} />
97
+ // }
98
+ //
99
+ // In this example, `fetchData` is called immediately to start the request
100
+ // as soon as possible, but if `shouldShow` is false, then it will be
101
+ // discarded without unwrapping its result. If it errors, it will trigger
102
+ // an "unhandledRejection" event.
103
+ //
104
+ // Ideally, we would suppress these rejections completely without warning,
105
+ // because we don't consider them real errors. (TODO: Currently we do warn.)
106
+ //
107
+ // But regardless of whether we do or don't warn, we definitely shouldn't
108
+ // crash the entire process.
109
+ //
110
+ // Even a "legit" unhandled error unrelated to prefetching shouldn't
111
+ // prevent the rest of the page from rendering.
112
+ //
113
+ // So, we're going to intentionally override the default error handling
114
+ // behavior of the outer JS runtime to be more forgiving
115
+ // Remove any existing "unhandledRejection" handlers. This is gated behind
116
+ // an experimental flag until we've considered the impact in various
117
+ // deployment environments. It's possible this may always need to
118
+ // be configurable.
119
+ if (shouldRemoveUnhandledRejectionListeners) {
120
+ process.removeAllListeners('unhandledRejection');
121
+ }
122
+ // Install a new handler to prevent the process from crashing.
123
+ process.on('unhandledRejection', (reason)=>{
124
+ if (isPostpone(reason)) {
125
+ // React postpones that are unhandled might end up logged here but they're
126
+ // not really errors. They're just part of rendering.
127
+ return;
128
+ }
129
+ // Immediately log the error.
130
+ // TODO: Ideally, if we knew that this error was triggered by application
131
+ // code, we would suppress it entirely without logging. We can't reliably
132
+ // detect all of these, but when dynamicIO is enabled, we could suppress
133
+ // at least some of them by waiting to log the error until after all in-
134
+ // progress renders have completed. Then, only log errors for which there
135
+ // was not a corresponding "rejectionHandled" event.
136
+ console.error(reason);
137
+ });
138
+ process.on('rejectionHandled', ()=>{
139
+ // TODO: See note in the unhandledRejection handler above. In the future,
140
+ // we may use the "rejectionHandled" event to de-queue an error from
141
+ // being logged.
142
+ });
143
+ // Unhandled exceptions are errors triggered by non-async functions, so this
144
+ // is unrelated to the late-awaiting pattern. However, for similar reasons,
145
+ // we still shouldn't crash the process. Just log it.
146
+ process.on('uncaughtException', (reason)=>{
147
+ if (isPostpone(reason)) {
148
+ return;
149
+ }
150
+ console.error(reason);
151
+ });
152
+ }
78
153
  export default class NextNodeServer extends BaseServer {
79
154
  constructor(options){
80
- var _options_conf_experimental_sri, _options_conf_experimental;
155
+ var _options_conf_experimental_sri, _options_conf_experimental, _options_conf_experimental1;
81
156
  // Initialize super class
82
157
  super(options), this.registeredInstrumentation = false, this.cleanupListeners = new AsyncCallbackSet(), this.handleNextImageRequest = async (req, res, parsedUrl)=>{
83
158
  if (!parsedUrl.pathname || !parsedUrl.pathname.startsWith('/_next/image')) {
@@ -408,6 +483,8 @@ export default class NextNodeServer extends BaseServer {
408
483
  if (this.renderOpts.isExperimentalCompile) {
409
484
  populateStaticEnv(this.nextConfig);
410
485
  }
486
+ const shouldRemoveUnhandledRejectionListeners = Boolean((_options_conf_experimental1 = options.conf.experimental) == null ? void 0 : _options_conf_experimental1.removeUnhandledRejectionListeners);
487
+ installProcessErrorHandlers(shouldRemoveUnhandledRejectionListeners);
411
488
  }
412
489
  async unstable_preloadEntries() {
413
490
  const appPathsManifest = this.getAppPathsManifest();