Skip to content

Commit 8d25e84

Browse files
committed
feat(dev-overlay): Add a very minimal API for restarting the dev server
1 parent d937203 commit 8d25e84

File tree

3 files changed

+39
-0
lines changed

3 files changed

+39
-0
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import type { ServerResponse, IncomingMessage } from 'http'
2+
import type { Telemetry } from '../../../../telemetry/storage'
3+
import { RESTART_EXIT_CODE } from '../../../../server/lib/utils'
4+
import { middlewareResponse } from './middleware-response'
5+
6+
const EVENT_DEV_OVERLAY_RESTART_SERVER = 'DEV_OVERLAY_RESTART_SERVER'
7+
8+
export function getRestartDevServerMiddleware(telemetry: Telemetry) {
9+
return async function (
10+
req: IncomingMessage,
11+
res: ServerResponse,
12+
next: () => void
13+
): Promise<void> {
14+
const { pathname } = new URL(`http://n${req.url}`)
15+
if (pathname !== '/__nextjs_restart_dev' || req.method !== 'POST') {
16+
return next()
17+
}
18+
19+
telemetry.record({
20+
eventName: EVENT_DEV_OVERLAY_RESTART_SERVER,
21+
payload: {},
22+
})
23+
24+
// TODO: Use flushDetached
25+
await telemetry.flush()
26+
27+
// do this async to try to give the response a chance to send
28+
// it's not really important if it doesn't though
29+
setTimeout(() => {
30+
process.exit(RESTART_EXIT_CODE)
31+
}, 0)
32+
33+
return middlewareResponse.noContent(res)
34+
}
35+
}

packages/next/src/server/dev/hot-reloader-turbopack.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ import {
9797
import { getDevOverlayFontMiddleware } from '../../client/components/react-dev-overlay/font/get-dev-overlay-font-middleware'
9898
import { devIndicatorServerState } from './dev-indicator-server-state'
9999
import { getDisableDevIndicatorMiddleware } from './dev-indicator-middleware'
100+
import { getRestartDevServerMiddleware } from '../../client/components/react-dev-overlay/server/restart-dev-server-middleware'
100101
// import { getSupportedBrowsers } from '../../build/utils'
101102

102103
const wsServer = new ws.Server({ noServer: true })
@@ -649,6 +650,7 @@ export async function createHotReloaderTurbopack(
649650
getNextErrorFeedbackMiddleware(opts.telemetry),
650651
getDevOverlayFontMiddleware(),
651652
getDisableDevIndicatorMiddleware(),
653+
getRestartDevServerMiddleware(opts.telemetry),
652654
]
653655

654656
const versionInfoPromise = getVersionInfo()

packages/next/src/server/dev/hot-reloader-webpack.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ import { getNextErrorFeedbackMiddleware } from '../../client/components/react-de
8787
import { getDevOverlayFontMiddleware } from '../../client/components/react-dev-overlay/font/get-dev-overlay-font-middleware'
8888
import { getDisableDevIndicatorMiddleware } from './dev-indicator-middleware'
8989
import getWebpackBundler from '../../shared/lib/get-webpack-bundler'
90+
import { getRestartDevServerMiddleware } from '../../client/components/react-dev-overlay/server/restart-dev-server-middleware'
9091

9192
const MILLISECONDS_IN_NANOSECOND = BigInt(1_000_000)
9293

@@ -1569,6 +1570,7 @@ export default class HotReloaderWebpack implements NextJsHotReloaderInterface {
15691570
getNextErrorFeedbackMiddleware(this.telemetry),
15701571
getDevOverlayFontMiddleware(),
15711572
getDisableDevIndicatorMiddleware(),
1573+
getRestartDevServerMiddleware(this.telemetry),
15721574
]
15731575
}
15741576

0 commit comments

Comments
 (0)