feat: Improve Docusaurus dev server experience
- Stream server logs to the terminal for better monitoring. - Run the server in a background screen session for persistence. - Provide clearer instructions for managing the server. - Improve error handling and fallback mechanisms.
This commit is contained in:
@@ -8,6 +8,7 @@ import freeflowuniverse.herolib.develop.gittools
|
||||
// import json
|
||||
import freeflowuniverse.herolib.osal
|
||||
import freeflowuniverse.herolib.ui.console
|
||||
import time
|
||||
|
||||
@[heap]
|
||||
pub struct DocSite {
|
||||
@@ -88,22 +89,36 @@ pub fn (mut s DocSite) dev(args DevArgs) ! {
|
||||
// Send commands to the screen session
|
||||
console.print_item('To view the server output:: cd ${s.path_build.path}')
|
||||
scr.cmd_send('cd ${s.path_build.path}')!
|
||||
scr.cmd_send('bun start -p ${args.port} -h ${args.host}')!
|
||||
|
||||
// Print instructions for user
|
||||
// Start script recording in the screen session for log streaming
|
||||
log_file := '/tmp/docusaurus_${screen_name}.log'
|
||||
script_cmd := 'script -f ${log_file}'
|
||||
scr.cmd_send(script_cmd)!
|
||||
|
||||
// Small delay to ensure script is ready
|
||||
time.sleep(500 * time.millisecond)
|
||||
|
||||
// Start bun in the scripted session
|
||||
bun_cmd := 'bun start -p ${args.port} -h ${args.host}'
|
||||
scr.cmd_send(bun_cmd)!
|
||||
|
||||
// Stream the log output to current terminal
|
||||
console.print_header(' Docusaurus Development Server')
|
||||
console.print_item('Development server is running in a screen session.')
|
||||
console.print_item('Server is running on: https://${args.host}:${args.port}')
|
||||
console.print_item('To view the server output:')
|
||||
console.print_item(' 1. Attach to screen: screen -r ${screen_name}')
|
||||
console.print_item(' 2. To detach from screen: Press Ctrl+A then D')
|
||||
console.print_item(' 3. To list all screens: screen -ls')
|
||||
console.print_item('The site content is on::')
|
||||
console.print_item(' 1. location of documents: ${s.path_src.path}/docs')
|
||||
// if osal.cmd_exists('code') {
|
||||
// console.print_item(' 2. We opened above dir in vscode.')
|
||||
// osal.exec(cmd: 'code ${s.path_src.path}/docs')!
|
||||
// }
|
||||
console.print_item('Streaming server output... Press Ctrl+C to detach and leave server running')
|
||||
console.print_item('Server will be available at: http://${args.host}:${args.port}')
|
||||
console.print_item('To reattach later: screen -r ${screen_name}')
|
||||
println('')
|
||||
|
||||
// Stream logs until user interrupts
|
||||
s.stream_logs(log_file, screen_name)!
|
||||
|
||||
// After user interrupts, show final instructions
|
||||
console.print_header(' Server Running in Background')
|
||||
console.print_item('✓ Development server is running in background')
|
||||
console.print_item('Server URL: http://${args.host}:${args.port}')
|
||||
console.print_item('To reattach: screen -r ${screen_name}')
|
||||
console.print_item('To stop server: screen -S ${screen_name} -X kill')
|
||||
console.print_item('The site content is on: ${s.path_src.path}/docs')
|
||||
|
||||
// Start the watcher in a separate thread
|
||||
// mut tf:=spawn watch_docs(docs_path, s.path_src.path, s.path_build.path)
|
||||
@@ -120,6 +135,39 @@ pub fn (mut s DocSite) dev(args DevArgs) ! {
|
||||
}
|
||||
}
|
||||
|
||||
// Stream logs from script file to current terminal until user interrupts
|
||||
fn (mut s DocSite) stream_logs(log_file string, screen_name string) ! {
|
||||
// Wait a moment for the log file to be created
|
||||
mut attempts := 0
|
||||
for !os.exists(log_file) && attempts < 10 {
|
||||
time.sleep(200 * time.millisecond)
|
||||
attempts++
|
||||
}
|
||||
|
||||
if !os.exists(log_file) {
|
||||
console.print_stderr('Warning: Log file not created, falling back to screen attach')
|
||||
console.print_item('Attaching to screen session... Press Ctrl+A then D to detach')
|
||||
// Fallback to direct screen attach
|
||||
osal.execute_interactive('screen -r ${screen_name}')!
|
||||
return
|
||||
}
|
||||
|
||||
// Use tail -f to stream the log file
|
||||
// The -f flag follows the file as it grows
|
||||
tail_cmd := 'tail -f ${log_file}'
|
||||
|
||||
// Execute tail in interactive mode - this will stream until Ctrl+C
|
||||
osal.execute_interactive(tail_cmd) or {
|
||||
// If tail fails, try alternative approach
|
||||
console.print_stderr('Log streaming failed, attaching to screen session...')
|
||||
osal.execute_interactive('screen -r ${screen_name}')!
|
||||
return
|
||||
}
|
||||
|
||||
// Clean up the log file after streaming
|
||||
os.rm(log_file) or {}
|
||||
}
|
||||
|
||||
@[params]
|
||||
pub struct ErrorArgs {
|
||||
pub mut:
|
||||
|
||||
Reference in New Issue
Block a user