create event broadcaster

main
DustyP 9 months ago
parent 65b85c3d16
commit fbaf70bafc

@ -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!")

@ -21,18 +21,18 @@ var content embed.FS
type Server struct {
router *chi.Mux
clock *derby.DerbyClock
raceEvents chan derby.Event
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),
events: events,
clients: make(map[chan string]bool),
port: port,
}
@ -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

Loading…
Cancel
Save