Skip to content

Commit 807caae

Browse files
morealkermanx
andauthored
fix: race condition in concurrent slidev export (#2461)
Co-authored-by: _Kerman <kermanx@qq.com>
1 parent ff17bc0 commit 807caae

1 file changed

Lines changed: 55 additions & 37 deletions

File tree

packages/slidev/node/cli.ts

Lines changed: 55 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -456,7 +456,7 @@ cli.command(
456456
async (args) => {
457457
const { entry, theme } = args
458458
const { exportSlides, getExportOptions } = await import('./commands/export')
459-
const port = await getPort(12445)
459+
const candidatePort = await getPort(12445)
460460

461461
let warned = false
462462
for (const entryFile of entry as unknown as string) {
@@ -471,21 +471,27 @@ cli.command(
471471
)
472472
}
473473

474-
const server = await createServer(
475-
options,
476-
{
477-
server: { port },
478-
clearScreen: false,
479-
},
480-
)
481-
await server.listen(port)
482-
printInfo(options)
483-
const result = await exportSlides({
484-
port,
485-
...getExportOptions({ ...args, entry: entryFile }, options),
486-
})
487-
console.log(`${green(' ✓ ')}${dim('exported to ')}${result}\n`)
488-
server.close()
474+
let server: ViteDevServer | undefined
475+
try {
476+
server = await createServer(
477+
options,
478+
{
479+
server: { port: candidatePort },
480+
clearScreen: false,
481+
},
482+
)
483+
await server.listen(candidatePort)
484+
const port = getViteServerPort(server)
485+
printInfo(options)
486+
const result = await exportSlides({
487+
port,
488+
...getExportOptions({ ...args, entry: entryFile }, options),
489+
})
490+
console.log(`${green(' ✓ ')}${dim('exported to ')}${result}\n`)
491+
}
492+
finally {
493+
await server?.close()
494+
}
489495
}
490496

491497
process.exit(0)
@@ -524,30 +530,35 @@ cli.command(
524530
wait,
525531
}) => {
526532
const { exportNotes } = await import('./commands/export')
527-
const port = await getPort(12445)
533+
const candidatePort = await getPort(12445)
528534

529535
for (const entryFile of entry as unknown as string[]) {
530536
const options = await resolveOptions({ entry: entryFile }, 'export')
531-
const server = await createServer(
532-
options,
533-
{
534-
server: { port },
535-
clearScreen: false,
536-
},
537-
)
538-
await server.listen(port)
539-
540-
printInfo(options)
541-
542-
const result = await exportNotes({
543-
port,
544-
output: output || (options.data.config.exportFilename ? `${options.data.config.exportFilename}-notes` : `${path.basename(entryFile, '.md')}-export-notes`),
545-
timeout,
546-
wait,
547-
})
548-
console.log(`${green(' ✓ ')}${dim('exported to ')}${result}\n`)
549-
550-
server.close()
537+
let server: ViteDevServer | undefined
538+
try {
539+
server = await createServer(
540+
options,
541+
{
542+
server: { port: candidatePort },
543+
clearScreen: false,
544+
},
545+
)
546+
await server.listen(candidatePort)
547+
const port = getViteServerPort(server)
548+
549+
printInfo(options)
550+
551+
const result = await exportNotes({
552+
port,
553+
output: output || (options.data.config.exportFilename ? `${options.data.config.exportFilename}-notes` : `${path.basename(entryFile, '.md')}-export-notes`),
554+
timeout,
555+
wait,
556+
})
557+
console.log(`${green(' ✓ ')}${dim('exported to ')}${result}\n`)
558+
}
559+
finally {
560+
await server?.close()
561+
}
551562
}
552563

553564
process.exit(0)
@@ -558,6 +569,13 @@ cli
558569
.help()
559570
.parse()
560571

572+
function getViteServerPort(server: ViteDevServer): number {
573+
const address = server.httpServer?.address()
574+
if (address && typeof address === 'object')
575+
return address.port
576+
throw new Error('Failed to get Vite server port')
577+
}
578+
561579
function commonOptions(args: Argv<object>) {
562580
return args
563581
.positional('entry', {

0 commit comments

Comments
 (0)