From bc3a365dea4077b13885eb125965f2b13531f900 Mon Sep 17 00:00:00 2001 From: Atridad Lahiji Date: Wed, 8 May 2024 15:05:12 -0600 Subject: [PATCH] Im real bad at this whole goroutine mutex shit but getting better! --- lib/email.go | 1 - lib/sse.go | 57 +++++++++++++++++++----------------------------- lib/stripe.go | 1 - lib/templates.go | 1 - main.go | 1 - 5 files changed, 23 insertions(+), 38 deletions(-) diff --git a/lib/email.go b/lib/email.go index f016d87..306375c 100644 --- a/lib/email.go +++ b/lib/email.go @@ -2,7 +2,6 @@ package lib import ( "crypto/tls" - "log" "net/smtp" "os" ) diff --git a/lib/sse.go b/lib/sse.go index 34b81e9..0c6237c 100644 --- a/lib/sse.go +++ b/lib/sse.go @@ -92,53 +92,42 @@ func SetSSEHeaders(c echo.Context) { func HandleIncomingMessages(c echo.Context, pubsub pubsub.PubSubMessage, client chan string) { if c.Response().Writer == nil { LogError.Printf("Cannot handle incoming messages: ResponseWriter is nil") - return } - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - go func() { - <-c.Request().Context().Done() - cancel() - }() - var mutex sync.Mutex for { - select { - case <-ctx.Done(): + msg, err := pubsub.ReceiveMessage(c.Request().Context()) + if err != nil { + if err == context.Canceled { + // The client has disconnected. Stop trying to send messages. + return + } + LogError.Printf("Failed to receive message: %v", err) return - default: - msg, err := pubsub.ReceiveMessage(ctx) - if err != nil { - LogError.Printf("Failed to receive message: %v", err) + } + data := fmt.Sprintf("data: %s\n\n", msg.Payload) + + mutex.Lock() + if c.Response().Writer != nil { + _, err := c.Response().Write([]byte(data)) + if err != nil { + LogError.Printf("Failed to write message: %v", err) + mutex.Unlock() return } - data := fmt.Sprintf("data: %s\n\n", msg.Payload) - - mutex.Lock() - if c.Response().Writer != nil { - _, err = c.Response().Write([]byte(data)) - if err != nil { - LogError.Printf("Failed to write message: %v", err) - mutex.Unlock() - return - } - - flusher, ok := c.Response().Writer.(http.Flusher) - if ok { - flusher.Flush() - } else { - LogError.Println("Failed to flush: ResponseWriter does not implement http.Flusher") - } + flusher, ok := c.Response().Writer.(http.Flusher) + if ok { + flusher.Flush() } else { - LogError.Println("Failed to write: ResponseWriter is nil") + LogError.Println("Failed to flush: ResponseWriter does not implement http.Flusher") } - mutex.Unlock() + } else { + LogError.Println("Failed to write: ResponseWriter is nil") } + mutex.Unlock() } } diff --git a/lib/stripe.go b/lib/stripe.go index f85cdbb..2f6b83b 100644 --- a/lib/stripe.go +++ b/lib/stripe.go @@ -1,7 +1,6 @@ package lib import ( - "log" "net/http" "os" diff --git a/lib/templates.go b/lib/templates.go index bf41d5d..e650567 100644 --- a/lib/templates.go +++ b/lib/templates.go @@ -2,7 +2,6 @@ package lib import ( "html/template" - "log" "net/http" "path/filepath" "runtime" diff --git a/main.go b/main.go index fc1b538..3b17dc3 100755 --- a/main.go +++ b/main.go @@ -5,7 +5,6 @@ import ( "embed" "flag" "fmt" - "log" "net/http" "time"