/
render-server.ts
117 lines (99 loc) · 2.91 KB
/
render-server.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
import type { RequestHandler } from '../next'
// this must come first as it includes require hooks
import { initializeServerWorker } from './setup-server-worker'
import next from '../next'
import { PropagateToWorkersField } from './router-utils/types'
export const WORKER_SELF_EXIT_CODE = 77
let result:
| undefined
| {
port: number
hostname: string
}
let app: ReturnType<typeof next> | undefined
let sandboxContext: undefined | typeof import('../web/sandbox/context')
let requireCacheHotReloader:
| undefined
| typeof import('../../build/webpack/plugins/nextjs-require-cache-hot-reloader')
if (process.env.NODE_ENV !== 'production') {
sandboxContext = require('../web/sandbox/context')
requireCacheHotReloader = require('../../build/webpack/plugins/nextjs-require-cache-hot-reloader')
}
export function clearModuleContext(target: string) {
return sandboxContext?.clearModuleContext(target)
}
export function deleteAppClientCache() {
return requireCacheHotReloader?.deleteAppClientCache()
}
export function deleteCache(filePaths: string[]) {
for (const filePath of filePaths) {
requireCacheHotReloader?.deleteCache(filePath)
}
}
export async function propagateServerField(
field: PropagateToWorkersField,
value: any
) {
if (!app) {
throw new Error('Invariant cant propagate server field, no app initialized')
}
let appField = (app as any).server
if (appField) {
if (typeof appField[field] === 'function') {
await appField[field].apply(
(app as any).server,
Array.isArray(value) ? value : []
)
} else {
appField[field] = value
}
}
}
export async function initialize(opts: {
dir: string
port: number
dev: boolean
minimalMode?: boolean
hostname?: string
workerType: 'router' | 'render'
isNodeDebugging: boolean
keepAliveTimeout?: number
serverFields?: any
}): Promise<NonNullable<typeof result>> {
// if we already setup the server return as we only need to do
// this on first worker boot
if (result) {
return result
}
const type = process.env.__NEXT_PRIVATE_RENDER_WORKER!
process.title = 'next-render-worker-' + type
let requestHandler: RequestHandler
let upgradeHandler: any
const { port, server, hostname } = await initializeServerWorker(
(...args) => {
return requestHandler(...args)
},
(...args) => {
return upgradeHandler(...args)
},
opts
)
app = next({
...opts,
_routerWorker: opts.workerType === 'router',
_renderWorker: opts.workerType === 'render',
hostname: hostname === '0.0.0.0' ? 'localhost' : hostname,
customServer: false,
httpServer: server,
port: opts.port,
isNodeDebugging: opts.isNodeDebugging,
})
requestHandler = app.getRequestHandler()
upgradeHandler = app.getUpgradeHandler()
await app.prepare(opts.serverFields)
result = {
port,
hostname: hostname === '0.0.0.0' ? '127.0.0.1' : hostname,
}
return result
}