{"version":3,"sources":["../../../../src/server/lib/start-server.ts"],"sourcesContent":["// Start CPU profile if it wasn't already started.\nimport './cpu-profile'\nimport { getNetworkHost } from '../../lib/get-network-host'\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 { exec } from 'child_process'\nimport Watchpack from 'next/dist/compiled/watchpack'\nimport * as Log from '../../build/output/log'\nimport setupDebug from 'next/dist/compiled/debug'\nimport { RESTART_EXIT_CODE } from './utils'\nimport { formatHostname } from './format-hostname'\nimport { initialize } from './router-server'\nimport {\n  CONFIG_FILES,\n  PHASE_DEVELOPMENT_SERVER,\n} from '../../shared/lib/constants'\nimport { getEnvInfo, logExperimentalInfo, logStartInfo } from './app-info-log'\nimport { validateTurboNextConfig } from '../../lib/turbopack-warning'\nimport {\n  type Span,\n  trace,\n  flushAllTraces,\n  exportTraceState,\n  initializeTraceState,\n} from '../../trace'\nimport { isIPv6 } from './is-ipv6'\nimport { AsyncCallbackSet } from './async-callback-set'\nimport type { NextServer } from '../next'\nimport { durationToString } from '../../build/duration-to-string'\n\nconst debug = setupDebug('next:start-server')\nlet startServerSpan: Span | undefined\n\n/**\n * Get the process ID (PID) of the process using the specified port\n */\nasync function getProcessIdUsingPort(port: number): Promise<string | null> {\n  const timeoutMs = 250\n  const processLookupController = new AbortController()\n\n  const pidPromise = new Promise<string | null>((resolve) => {\n    const handleError = (error: Error) => {\n      debug('Failed to get process ID for port', port, error)\n      resolve(null)\n    }\n\n    try {\n      // Use lsof on Unix-like systems (macOS, Linux)\n      if (process.platform !== 'win32') {\n        exec(\n          `lsof -ti:${port} -sTCP:LISTEN`,\n          { signal: processLookupController.signal },\n          (error, stdout) => {\n            if (error) {\n              handleError(error)\n              return\n            }\n            // `-sTCP` will ensure there's only one port, clean up output\n            const pid = stdout.trim()\n            resolve(pid || null)\n          }\n        )\n      } else {\n        // Use netstat on Windows\n        exec(\n          `netstat -ano | findstr /C:\":${port} \" | findstr LISTENING`,\n          { signal: processLookupController.signal },\n          (error, stdout) => {\n            if (error) {\n              handleError(error)\n              return\n            }\n            // Clean up output and extract PID\n            const cleanOutput = stdout.replace(/\\s+/g, ' ').trim()\n            if (cleanOutput) {\n              const lines = cleanOutput.split('\\n')\n              const firstLine = lines[0].trim()\n              if (firstLine) {\n                const parts = firstLine.split(' ')\n                const pid = parts[parts.length - 1]\n                resolve(pid || null)\n              } else {\n                resolve(null)\n              }\n            } else {\n              resolve(null)\n            }\n          }\n        )\n      }\n    } catch (cause) {\n      handleError(\n        new Error('Unexpected error during process lookup', { cause })\n      )\n    }\n  })\n\n  const timeoutId = setTimeout(() => {\n    processLookupController.abort(\n      `PID detection timed out after ${timeoutMs}ms for port ${port}.`\n    )\n  }, timeoutMs)\n\n  pidPromise.finally(() => clearTimeout(timeoutId))\n\n  return pidPromise\n}\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  serverFastRefresh?: boolean\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  serverFastRefresh,\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  serverFastRefresh?: 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    serverFastRefresh,\n    startServerSpan,\n    quiet,\n  })\n}\n\nexport type StartServerResult = {\n  distDir: string\n}\n\nexport async function startServer(\n  serverOptions: StartServerOptions\n): Promise<StartServerResult> {\n  const {\n    dir,\n    isDev,\n    hostname,\n    minimalMode,\n    allowRetry,\n    keepAliveTimeout,\n    selfSignedCertificate,\n    serverFastRefresh,\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  const distDir = await new Promise<string>((resolve) => {\n    server.on('listening', async () => {\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        const pid = await getProcessIdUsingPort(originalPort)\n        if (pid) {\n          Log.warn(\n            `Port ${originalPort} is in use by process ${pid}, using available port ${port} instead.`\n          )\n        } else {\n          Log.warn(\n            `Port ${originalPort} is in use by an unknown process, using available port ${port} instead.`\n          )\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      // 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      // Set experimental HTTPS flag for metadata resolution\n      if (selfSignedCertificate) {\n        process.env.__NEXT_EXPERIMENTAL_HTTPS = '1'\n      }\n\n      // Get env info first (fast, doesn't require config)\n      const envInfo = isDev ? getEnvInfo(dir) : undefined\n\n      // Log basic startup info immediately (before loading config)\n      logStartInfo({\n        networkUrl,\n        appUrl,\n        envInfo,\n        logBundler: isDev,\n      })\n\n      // Calculate and log \"Ready in X\" before loading config\n      // so it reflects actual framework startup time.\n      // NEXT_PRIVATE_START_TIME is set by bin/next.ts or cli/next-start.ts.\n      const startTime = parseInt(process.env.NEXT_PRIVATE_START_TIME || '0', 10)\n      const endTime = Date.now()\n      const startServerProcessDurationMs = startTime ? endTime - startTime : 0\n\n      const formattedStartDuration = durationToString(\n        startServerProcessDurationMs / 1000\n      )\n\n      Log.event(`Ready in ${formattedStartDuration}`)\n\n      try {\n        let cleanupStarted = false\n        let closeUpgraded: (() => void) | null = null\n        const cleanup = (signal: 'SIGINT' | 'SIGTERM') => {\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            // Flush any remaining traces to the trace file on shutdown\n            await flushAllTraces()\n\n            // Flush telemetry if this is a dev server\n            if (isDev) {\n              try {\n                const { traceGlobals } =\n                  require('../../trace/shared') as typeof import('../../trace/shared')\n                const telemetry = traceGlobals.get('telemetry') as\n                  | InstanceType<\n                      typeof import('../../telemetry/storage').Telemetry\n                    >\n                  | undefined\n                if (telemetry) {\n                  // Use flushDetached to avoid blocking process exit\n                  // Each process writes to a unique file (_events_${pid}.json)\n                  // to avoid race conditions with the parent process\n                  telemetry.flushDetached('dev', dir)\n                }\n              } catch (_) {\n                // Ignore telemetry errors during cleanup\n              }\n            }\n\n            debug('start-server process cleanup finished')\n\n            // Exit with signal-based exit code (128 + signal number) so that\n            // Node.js treats this as a signal termination, not a normal exit.\n            // This avoids waiting for the debugger to disconnect.\n            switch (signal) {\n              case 'SIGINT':\n                process.exit(130)\n                break\n              case 'SIGTERM':\n                process.exit(143)\n                break\n              default:\n                // Make sure all handled signals have explicit exit codes.\n                // This is just a fallback to guard against unsound types.\n                signal satisfies never\n                process.exit(128)\n            }\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        // Now load config via getRequestHandlers (single loadConfig call)\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          serverFastRefresh,\n        })\n        requestHandler = initResult.requestHandler\n        upgradeHandler = initResult.upgradeHandler\n        nextServer = initResult.server\n        closeUpgraded = initResult.closeUpgraded\n\n        // Log experimental features after config is loaded\n        if (isDev) {\n          logExperimentalInfo({\n            experimentalFeatures: initResult.experimentalFeatures,\n            cacheComponents: initResult.cacheComponents,\n          })\n        }\n\n        handlersReady()\n\n        if (process.env.TURBOPACK && isDev) {\n          await validateTurboNextConfig({\n            dir: serverOptions.dir,\n            configPhase: PHASE_DEVELOPMENT_SERVER,\n          })\n        }\n\n        resolve(initResult.distDir)\n      } catch (err) {\n        // fatal error if we can't setup\n        handlersError()\n        console.error(err)\n        process.exit(1)\n      }\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  return { distDir }\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      let enabledFeaturesFromParent = {}\n      if (process.env.NEXT_PRIVATE_ENABLED_FEATURES) {\n        const parsed = JSON.parse(process.env.NEXT_PRIVATE_ENABLED_FEATURES)\n        enabledFeaturesFromParent = Object.fromEntries(\n          Object.entries(parsed).map(([key, value]) => [\n            `feature.${key}`,\n            value,\n          ])\n        )\n      }\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        ...enabledFeaturesFromParent,\n      })\n\n      initializeTraceState({\n        ...exportTraceState(),\n        defaultParentSpanId: startServerSpan.getId(),\n      })\n\n      const result = 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({\n        nextServerReady: true,\n        port: process.env.PORT,\n        distDir: result.distDir,\n      })\n    }\n  })\n  process.send({ nextWorkerReady: true })\n}\n"],"names":["getNetworkHost","fs","v8","path","http","https","os","exec","Watchpack","Log","setupDebug","RESTART_EXIT_CODE","formatHostname","initialize","CONFIG_FILES","PHASE_DEVELOPMENT_SERVER","getEnvInfo","logExperimentalInfo","logStartInfo","validateTurboNextConfig","trace","flushAllTraces","exportTraceState","initializeTraceState","isIPv6","AsyncCallbackSet","durationToString","debug","startServerSpan","getProcessIdUsingPort","port","timeoutMs","processLookupController","AbortController","pidPromise","Promise","resolve","handleError","error","process","platform","signal","stdout","pid","trim","cleanOutput","replace","lines","split","firstLine","parts","length","cause","Error","timeoutId","setTimeout","abort","finally","clearTimeout","getRequestHandlers","dir","isDev","onDevServerCleanup","server","hostname","minimalMode","keepAliveTimeout","experimentalHttpsServer","serverFastRefresh","quiet","dev","startServer","serverOptions","allowRetry","selfSignedCertificate","title","env","__NEXT_VERSION","handlersReady","handlersError","handlersPromise","reject","requestHandler","req","res","upgradeHandler","socket","head","nextServer","requestListener","undefined","err","statusCode","end","url","console","getHeapStatistics","used_heap_size","heap_size_limit","warn","String","stop","exit","createServer","key","readFileSync","cert","on","destroy","portRetryCount","originalPort","code","listen","cleanupListeners","distDir","addr","address","actualHostname","formattedHostname","networkHostname","protocol","networkUrl","appUrl","PORT","__NEXT_PRIVATE_ORIGIN","__NEXT_EXPERIMENTAL_HTTPS","envInfo","logBundler","startTime","parseInt","NEXT_PRIVATE_START_TIME","endTime","Date","now","startServerProcessDurationMs","formattedStartDuration","event","cleanupStarted","closeUpgraded","cleanup","close","closeAllConnections","all","catch","runAll","traceGlobals","require","telemetry","get","flushDetached","_","NEXT_MANUAL_SIG_HANDLE","initResult","add","bind","experimentalFeatures","cacheComponents","TURBOPACK","configPhase","watchConfigFiles","dirToWatch","onChange","wp","watch","files","map","file","join","filename","__NEXT_DISABLE_MEMORY_WATCHER","info","basename","NEXT_PRIVATE_WORKER","send","addListener","msg","nextWorkerOptions","enabledFeaturesFromParent","NEXT_PRIVATE_ENABLED_FEATURES","parsed","JSON","parse","Object","fromEntries","entries","value","cpus","freemem","totalmem","defaultParentSpanId","getId","result","traceAsyncFn","memoryUsage","setAttribute","rss","heapTotal","heapUsed","nextServerReady","nextWorkerReady"],"mappings":"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","ignoreList":[0]}