Skip to content

Commit 26b08e5

Browse files
committed
fix: handle session cleanup
1 parent 74916dd commit 26b08e5

3 files changed

Lines changed: 124 additions & 85 deletions

File tree

packages/nuxi/src/commands/build.ts

Lines changed: 61 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -46,76 +46,81 @@ export default defineCommand({
4646
await startCpuProfile()
4747
}
4848

49-
intro(colors.cyan('Building Nuxt for production...'))
49+
try {
50+
intro(colors.cyan('Building Nuxt for production...'))
5051

51-
const kit = await loadKit(cwd)
52+
const kit = await loadKit(cwd)
5253

53-
await showVersions(cwd, kit, ctx.args.dotenv)
54+
await showVersions(cwd, kit, ctx.args.dotenv)
5455

55-
const nuxt = await kit.loadNuxt({
56-
cwd,
57-
dotenv: {
56+
const nuxt = await kit.loadNuxt({
5857
cwd,
59-
fileName: ctx.args.dotenv,
60-
},
61-
envName: ctx.args.envName, // c12 will fall back to NODE_ENV
62-
overrides: {
63-
logLevel: ctx.args.logLevel as 'silent' | 'info' | 'verbose',
64-
// TODO: remove in 3.8
65-
_generate: ctx.args.prerender,
66-
nitro: {
67-
static: ctx.args.prerender,
68-
preset: ctx.args.preset || process.env.NITRO_PRESET || process.env.SERVER_PRESET,
58+
dotenv: {
59+
cwd,
60+
fileName: ctx.args.dotenv,
6961
},
70-
...(ctx.args.extends && { extends: ctx.args.extends }),
71-
...((perfValue || ctx.data?.overrides?.debug) && {
72-
debug: {
73-
...ctx.data?.overrides?.debug,
74-
...(perfValue && { perf: perfValue }),
62+
envName: ctx.args.envName, // c12 will fall back to NODE_ENV
63+
overrides: {
64+
logLevel: ctx.args.logLevel as 'silent' | 'info' | 'verbose',
65+
// TODO: remove in 3.8
66+
_generate: ctx.args.prerender,
67+
nitro: {
68+
static: ctx.args.prerender,
69+
preset: ctx.args.preset || process.env.NITRO_PRESET || process.env.SERVER_PRESET,
7570
},
76-
}),
77-
...ctx.data?.overrides,
78-
},
79-
})
80-
81-
let nitro: ReturnType<typeof kit.useNitro> | undefined
82-
// In Bridge, if Nitro is not enabled, useNitro will throw an error
83-
try {
84-
// Use ? for backward compatibility for Nuxt <= RC.10
85-
nitro = kit.useNitro?.()
86-
if (nitro) {
87-
logger.info(`Nitro preset: ${colors.cyan(nitro.options.preset)}`)
71+
...(ctx.args.extends && { extends: ctx.args.extends }),
72+
...ctx.data?.overrides,
73+
...((perfValue || ctx.data?.overrides?.debug) && {
74+
debug: {
75+
...ctx.data?.overrides?.debug,
76+
...(perfValue && { perf: perfValue }),
77+
},
78+
}),
79+
},
80+
})
81+
82+
let nitro: ReturnType<typeof kit.useNitro> | undefined
83+
// In Bridge, if Nitro is not enabled, useNitro will throw an error
84+
try {
85+
// Use ? for backward compatibility for Nuxt <= RC.10
86+
nitro = kit.useNitro?.()
87+
if (nitro) {
88+
logger.info(`Nitro preset: ${colors.cyan(nitro.options.preset)}`)
89+
}
90+
}
91+
catch {
92+
//
8893
}
89-
}
90-
catch {
91-
//
92-
}
93-
94-
await clearBuildDir(nuxt.options.buildDir)
9594

96-
await kit.writeTypes(nuxt)
95+
await clearBuildDir(nuxt.options.buildDir)
9796

98-
nuxt.hook('build:error', (err) => {
99-
logger.error(`Nuxt build error: ${err}`)
100-
process.exit(1)
101-
})
97+
await kit.writeTypes(nuxt)
10298

103-
await kit.buildNuxt(nuxt)
99+
nuxt.hook('build:error', (err) => {
100+
logger.error(`Nuxt build error: ${err}`)
101+
process.exit(1)
102+
})
104103

105-
stopCpuProfile(cwd)
104+
await kit.buildNuxt(nuxt)
106105

107-
if (ctx.args.prerender) {
108-
if (!nuxt.options.ssr) {
109-
logger.warn(`HTML content not prerendered because ${colors.cyan('ssr: false')} was set.`)
110-
logger.info(`You can read more in ${colors.cyan('https://nuxt.com/docs/getting-started/deployment#static-hosting')}.`)
106+
if (ctx.args.prerender) {
107+
if (!nuxt.options.ssr) {
108+
logger.warn(`HTML content not prerendered because ${colors.cyan('ssr: false')} was set.`)
109+
logger.info(`You can read more in ${colors.cyan('https://nuxt.com/docs/getting-started/deployment#static-hosting')}.`)
110+
}
111+
// TODO: revisit later if/when nuxt build --prerender will output hybrid
112+
const dir = nitro?.options.output.publicDir
113+
const publicDir = dir ? relative(process.cwd(), dir) : '.output/public'
114+
outro(`✨ You can now deploy ${colors.cyan(publicDir)} to any static hosting!`)
115+
}
116+
else {
117+
outro('✨ Build complete!')
111118
}
112-
// TODO: revisit later if/when nuxt build --prerender will output hybrid
113-
const dir = nitro?.options.output.publicDir
114-
const publicDir = dir ? relative(process.cwd(), dir) : '.output/public'
115-
outro(`✨ You can now deploy ${colors.cyan(publicDir)} to any static hosting!`)
116119
}
117-
else {
118-
outro('✨ Build complete!')
120+
finally {
121+
if (profileArg) {
122+
await stopCpuProfile(cwd)
123+
}
119124
}
120125
},
121126
})

packages/nuxi/src/utils/profile.ts

Lines changed: 42 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -17,40 +17,59 @@ export async function startCpuProfile(): Promise<void> {
1717
const inspector = await import('node:inspector')
1818
session = new inspector.Session()
1919
session.connect()
20-
await new Promise<void>((res, rej) => {
21-
session!.post('Profiler.enable', () => {
22-
session!.post('Profiler.start', (err) => {
20+
try {
21+
await new Promise<void>((res, rej) => {
22+
session!.post('Profiler.enable', (err) => {
2323
if (err) {
24-
rej(err)
24+
return rej(err)
2525
}
26-
else {
26+
session!.post('Profiler.start', (err) => {
27+
if (err) {
28+
return rej(err)
29+
}
2730
res()
28-
}
31+
})
2932
})
3033
})
31-
})
34+
}
35+
catch (err) {
36+
session.disconnect()
37+
session = undefined
38+
throw err
39+
}
3240
}
3341

34-
export function stopCpuProfile(outDir: string): string | undefined {
42+
export async function stopCpuProfile(outDir: string): Promise<string | undefined> {
3543
if (!session) {
3644
return
3745
}
3846
const s = session
3947
session = undefined
40-
let outPath: string | undefined
41-
s.post('Profiler.stop', (_err, params) => {
42-
if (_err || !params?.profile) {
43-
return
44-
}
45-
outPath = join(outDir, `profile-${profileCount++}.cpuprofile`)
46-
try {
47-
mkdirSync(outDir, { recursive: true })
48-
writeFileSync(outPath, JSON.stringify(params.profile))
49-
logger.info(`CPU profile written to ${colors.cyan(outPath)}`)
50-
logger.info(`Open it in ${colors.cyan('https://www.speedscope.app')} or Chrome DevTools`)
51-
}
52-
catch {}
48+
const outPath = join(outDir, `profile-${profileCount++}.cpuprofile`)
49+
try {
50+
await new Promise<any>((resolve, reject) => {
51+
s.post('Profiler.stop', (err, params) => {
52+
if (err) {
53+
return reject(err)
54+
}
55+
56+
if (!params?.profile) {
57+
return resolve(params)
58+
}
59+
60+
try {
61+
mkdirSync(outDir, { recursive: true })
62+
writeFileSync(outPath, JSON.stringify(params.profile))
63+
logger.info(`CPU profile written to ${colors.cyan(outPath)}`)
64+
logger.info(`Open it in ${colors.cyan('https://www.speedscope.app')} or Chrome DevTools`)
65+
}
66+
catch {}
67+
68+
resolve(params)
69+
})
70+
})
71+
}
72+
finally {
5373
s.disconnect()
54-
})
55-
return outPath
74+
}
5675
}

packages/nuxt-cli/bin/nuxi.mjs

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,28 @@ if (
3232
) {
3333
const session = new inspector.Session()
3434
session.connect()
35-
// eslint-disable-next-line antfu/no-top-level-await
36-
await new Promise((resolve) => {
37-
session.post('Profiler.enable', () => {
38-
session.post('Profiler.start', resolve)
35+
36+
try {
37+
// eslint-disable-next-line antfu/no-top-level-await
38+
await new Promise((resolve, reject) => {
39+
session.post('Profiler.enable', (err) => {
40+
if (err) {
41+
return reject(err)
42+
}
43+
session.post('Profiler.start', (err) => {
44+
if (err) {
45+
return reject(err)
46+
}
47+
resolve()
48+
})
49+
})
3950
})
40-
})
41-
globalThis.__nuxt_cli__.cpuProfileSession = session
51+
globalThis.__nuxt_cli__.cpuProfileSession = session
52+
}
53+
catch (err) {
54+
session.disconnect()
55+
throw err
56+
}
4257
}
4358

4459
// eslint-disable-next-line antfu/no-top-level-await

0 commit comments

Comments
 (0)