package main import ( "flag" "fmt" "os" "os/signal" "syscall" ) func main() { watchDir := flag.String("watch", "../backend", "directory to watch for changes") workers := flag.Int("workers", 1, "number of worker processes") basePort := flag.Int("base-port", 3000, "base port for worker processes") listenPort := flag.Int("port", 8080, "port for the reverse proxy to listen on") loggerPort := flag.Int("logger-port", 8085, "port for the logger service") loggerCapacity := flag.Int("logger-capacity", 1000000, "max messages for logger to store") flag.Parse() // Setup signal handling sigCh := make(chan os.Signal, 1) signal.Notify(sigCh, os.Interrupt, syscall.SIGTERM) // Start and manage the logger process stopLogger := startLogger(*loggerPort, *loggerCapacity) defer stopLogger() // Create worker pool pool := NewWorkerPool() fileChanges := make(chan FileChange, 10) go watchFiles(*watchDir, fileChanges) go runExpress(fileChanges, *workers, *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") }