package main import ( "fmt" "os" "os/signal" "strconv" "syscall" ) func main() { watchedDir := os.Getenv("WATCHED_DIR") numChildProcesses := 1 if n, err := strconv.Atoi(os.Getenv("NUM_CHILD_PROCESSES")); err == nil && n > 0 { numChildProcesses = n } basePort := 3000 if p, err := strconv.Atoi(os.Getenv("BASE_PORT")); err == nil && p > 0 { basePort = p } listenPort := 8080 if p, err := strconv.Atoi(os.Getenv("LISTEN_PORT")); err == nil && p > 0 { listenPort = p } // Create worker pool pool := NewWorkerPool() // Setup signal handling sigCh := make(chan os.Signal, 1) signal.Notify(sigCh, os.Interrupt, syscall.SIGTERM) fileChanges := make(chan FileChange, 10) go watchFiles(watchedDir, fileChanges) go runExpress(fileChanges, numChildProcesses, basePort, pool) // Start the reverse proxy listenAddr := fmt.Sprintf(":%d", listenPort) go startProxy(listenAddr, pool) // Wait for interrupt signal <-sigCh fmt.Println("\nReceived interrupt signal, shutting down...") fmt.Println("All processes terminated cleanly") }