diff --git a/packages/next/src/client/components/react-dev-overlay/server/restart-dev-server-middleware.ts b/packages/next/src/client/components/react-dev-overlay/server/restart-dev-server-middleware.ts index b4135c65f0ad2..4421eebbafe76 100644 --- a/packages/next/src/client/components/react-dev-overlay/server/restart-dev-server-middleware.ts +++ b/packages/next/src/client/components/react-dev-overlay/server/restart-dev-server-middleware.ts @@ -15,14 +15,23 @@ export function getRestartDevServerMiddleware({ telemetry, turbopackProject, }: RestartDevServerMiddlewareConfig) { - return async function ( + /** + * Some random value between 1 and Number.MAX_SAFE_INTEGER (inclusive). The same value is returned + * on every call to `__nextjs_server_status` until the server is restarted. + * + * Can be used to determine if two server status responses are from the same process or a + * different (restarted) process. + */ + const executionId: number = + Math.floor(Math.random() * Number.MAX_SAFE_INTEGER) + 1 + + async function handleRestartRequest( req: IncomingMessage, res: ServerResponse, - next: () => void - ): Promise { - const { pathname, searchParams } = new URL(`http://n${req.url}`) - if (pathname !== '/__nextjs_restart_dev' || req.method !== 'POST') { - return next() + searchParams: URLSearchParams + ) { + if (req.method !== 'POST') { + return middlewareResponse.methodNotAllowed(res) } const invalidatePersistentCache = searchParams.has( @@ -48,4 +57,31 @@ export function getRestartDevServerMiddleware({ return middlewareResponse.noContent(res) } + + async function handleServerStatus(req: IncomingMessage, res: ServerResponse) { + if (req.method !== 'GET') { + return middlewareResponse.methodNotAllowed(res) + } + + return middlewareResponse.json(res, { + executionId, + }) + } + + return async function ( + req: IncomingMessage, + res: ServerResponse, + next: () => void + ): Promise { + const { pathname, searchParams } = new URL(`http://n${req.url}`) + + switch (pathname) { + case '/__nextjs_restart_dev': + return await handleRestartRequest(req, res, searchParams) + case '/__nextjs_server_status': + return await handleServerStatus(req, res) + default: + return next() + } + } }