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.
- package/dist/bin/next +1 -1
- package/dist/build/index.js +2 -2
- package/dist/build/swc/index.js +1 -1
- package/dist/build/webpack-config.js +2 -2
- package/dist/client/app-bootstrap.js +1 -1
- package/dist/client/index.js +1 -1
- package/dist/compiled/next-server/app-page-experimental.runtime.prod.js.map +1 -1
- package/dist/compiled/next-server/app-page-turbo-experimental.runtime.prod.js.map +1 -1
- package/dist/compiled/next-server/app-page-turbo.runtime.prod.js.map +1 -1
- package/dist/compiled/next-server/app-page.runtime.prod.js.map +1 -1
- package/dist/compiled/next-server/server.runtime.prod.js +2 -2
- package/dist/compiled/next-server/server.runtime.prod.js.map +1 -1
- package/dist/esm/build/index.js +2 -2
- package/dist/esm/build/swc/index.js +1 -1
- package/dist/esm/build/webpack-config.js +2 -2
- package/dist/esm/client/app-bootstrap.js +1 -1
- package/dist/esm/client/index.js +1 -1
- package/dist/esm/server/config-schema.js +1 -0
- package/dist/esm/server/config-schema.js.map +1 -1
- package/dist/esm/server/config-shared.js +1 -0
- package/dist/esm/server/config-shared.js.map +1 -1
- package/dist/esm/server/dev/hot-reloader-turbopack.js +1 -1
- package/dist/esm/server/dev/hot-reloader-webpack.js +1 -1
- package/dist/esm/server/lib/app-info-log.js +1 -1
- package/dist/esm/server/lib/start-server.js +1 -18
- package/dist/esm/server/lib/start-server.js.map +1 -1
- package/dist/esm/server/next-server.js +78 -1
- package/dist/esm/server/next-server.js.map +1 -1
- package/dist/esm/shared/lib/canary-only.js +1 -1
- package/dist/server/config-schema.js +1 -0
- package/dist/server/config-schema.js.map +1 -1
- package/dist/server/config-shared.d.ts +9 -0
- package/dist/server/config-shared.js +1 -0
- package/dist/server/config-shared.js.map +1 -1
- package/dist/server/dev/hot-reloader-turbopack.js +1 -1
- package/dist/server/dev/hot-reloader-webpack.js +1 -1
- package/dist/server/lib/app-info-log.js +1 -1
- package/dist/server/lib/start-server.js +1 -18
- package/dist/server/lib/start-server.js.map +1 -1
- package/dist/server/next-server.js +78 -1
- package/dist/server/next-server.js.map +1 -1
- package/dist/shared/lib/canary-only.js +1 -1
- package/dist/telemetry/anonymous-meta.js +1 -1
- package/dist/telemetry/events/session-stopped.js +2 -2
- package/dist/telemetry/events/version.js +2 -2
- 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.
|
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.
|
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.
|
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();
|