diff --git a/cmd/serve.go b/cmd/serve.go index a0a0bff..ee61554 100644 --- a/cmd/serve.go +++ b/cmd/serve.go @@ -55,6 +55,7 @@ func serveCmd() *cli.Command { Value: 3000, }, }, + Action: func(ctx *cli.Context) error { log.Info("Starting Norsky feed generator") @@ -100,9 +101,11 @@ func serveCmd() *cli.Command { go func() { for post := range postChan { switch post := post.(type) { + // Don't crash if broadcast fails case models.CreatePostEvent: dbPostChan <- post - broadcaster.Broadcast(post) // Broadcast new post to SSE clients + // Broadcast without blocking + go broadcaster.Broadcast(post) // Broadcast new post to SSE clients default: dbPostChan <- post } diff --git a/server/server.go b/server/server.go index 30c37ab..445caca 100644 --- a/server/server.go +++ b/server/server.go @@ -59,9 +59,6 @@ func (b *Broadcaster) Broadcast(post models.CreatePostEvent) { log.WithFields(log.Fields{ "clients": len(b.clients), }).Info("Broadcasting post to SSE clients") - - b.Lock() - defer b.Unlock() for _, client := range b.clients { client <- post } @@ -82,8 +79,12 @@ func (b *Broadcaster) AddClient(key string, client chan models.CreatePostEvent) func (b *Broadcaster) RemoveClient(key string) { b.Lock() defer b.Unlock() + // Check if client channel exists in map if _, ok := b.clients[key]; !ok { - close(b.clients[key]) + // Close the channel unless it's already closed + if b.clients[key] != nil { + close(b.clients[key]) + } delete(b.clients, key) }