diff --git a/examples/main.go b/examples/main.go index f6e668c..d851dae 100644 --- a/examples/main.go +++ b/examples/main.go @@ -38,12 +38,23 @@ func main() { var wg sync.WaitGroup + // Create a fan-out mechanism for events + eventBroadcaster := make(chan derby.Event, 10) + + // Start the event broadcaster + go func() { + for event := range clock.Events() { + eventBroadcaster <- event + } + close(eventBroadcaster) + }() + // Start web interface if enabled if !*noWeb { wg.Add(1) go func() { defer wg.Done() - startWebInterface(clock, *webPort, sigChan) + startWebInterface(clock, eventBroadcaster, *webPort, sigChan) }() } @@ -52,7 +63,7 @@ func main() { wg.Add(1) go func() { defer wg.Done() - startTerminalInterface(clock, sigChan) + startTerminalInterface(clock, eventBroadcaster, sigChan) }() } @@ -66,9 +77,9 @@ func main() { } // startWebInterface initializes and runs the web interface -func startWebInterface(clock *derby.DerbyClock, webPort int, sigChan chan os.Signal) { +func startWebInterface(clock *derby.DerbyClock, events <-chan derby.Event, webPort int, sigChan chan os.Signal) { // Create and start the web server - server, err := web.NewServer(clock, webPort) + server, err := web.NewServer(clock, events, webPort) if err != nil { fmt.Printf("Error creating web server: %v\n", err) sigChan <- syscall.SIGTERM @@ -85,7 +96,7 @@ func startWebInterface(clock *derby.DerbyClock, webPort int, sigChan chan os.Sig } // startTerminalInterface initializes and runs the terminal interface -func startTerminalInterface(clock *derby.DerbyClock, sigChan chan os.Signal) { +func startTerminalInterface(clock *derby.DerbyClock, events <-chan derby.Event, sigChan chan os.Signal) { fmt.Println("Terminal interface started") // Reset the clock to start fresh @@ -106,7 +117,7 @@ func startTerminalInterface(clock *derby.DerbyClock, sigChan chan os.Signal) { // Process events from the clock go func() { raceResults := make([]*derby.Result, 0) - for event := range clock.Events() { + for event := range events { switch event.Type { case derby.EventRaceStart: fmt.Println("\nšŸ Race started!") diff --git a/web/server.go b/web/server.go index 884d4f0..1250548 100644 --- a/web/server.go +++ b/web/server.go @@ -19,22 +19,22 @@ var content embed.FS // Server represents the web server for the derby clock type Server struct { - router *chi.Mux - clock *derby.DerbyClock - raceEvents chan derby.Event - clients map[chan string]bool - port int + router *chi.Mux + clock *derby.DerbyClock + events <-chan derby.Event + clients map[chan string]bool + port int } // NewServer creates a new web server -func NewServer(clock *derby.DerbyClock, port int) (*Server, error) { +func NewServer(clock *derby.DerbyClock, events <-chan derby.Event, port int) (*Server, error) { // Create server s := &Server{ - router: chi.NewRouter(), - clock: clock, - raceEvents: make(chan derby.Event, 10), - clients: make(map[chan string]bool), - port: port, + router: chi.NewRouter(), + clock: clock, + events: events, + clients: make(map[chan string]bool), + port: port, } // Set up routes @@ -73,11 +73,11 @@ func (s *Server) Start() error { return http.ListenAndServe(fmt.Sprintf(":%d", s.port), s.router) } -// forwardEvents forwards derby clock events to the web clients +// forwardEvents forwards derby events to SSE clients func (s *Server) forwardEvents() { - for event := range s.clock.Events() { + for event := range s.events { // Store the event for new clients - s.raceEvents <- event + // s.raceEvents <- event // Create the SSE message based on the event type var message string