From dbf787761eedd54be78cedd617864eef6c345bdc Mon Sep 17 00:00:00 2001 From: Wael Nasreddine Date: Sat, 21 Dec 2024 12:52:34 -0800 Subject: [PATCH] refactor: server should start the receive loop (#19) Move the receive loop into the server package and make it restart on error The receive loop is now managed by the server package, which will restart it automatically if it encounters an error. The loop previously lived in main.go but has been relocated to server.go for better error handling and recovery. ref #8 Co-authored-by: Mathias Fredriksson --- main.go | 2 -- receiver/client.go | 4 ++-- server/server.go | 15 ++++++++++++++- server/server_test.go | 4 ++++ 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/main.go b/main.go index f7431af..560a7ba 100644 --- a/main.go +++ b/main.go @@ -60,8 +60,6 @@ func realMain() int { return 1 } - go sarc.ReceiveLoop() - srv := server.New(sarc) server := &http.Server{ diff --git a/receiver/client.go b/receiver/client.go index 4f2c149..3149a31 100644 --- a/receiver/client.go +++ b/receiver/client.go @@ -110,7 +110,7 @@ func New(uri *url.URL) (*Client, error) { // ReceiveLoop is a blocking call and it loop over receiving messages over the // websocket and record them internally to be consumed by either Pop() or // Flush(). -func (c *Client) ReceiveLoop() { +func (c *Client) ReceiveLoop() error { log.Print("Starting the receive loop from Signal API") for { @@ -118,7 +118,7 @@ func (c *Client) ReceiveLoop() { if err != nil { log.Printf("error returned by the websocket: %s", err) - return + return err } c.recordMessage(msg) diff --git a/server/server.go b/server/server.go index 0da8285..23f23ca 100644 --- a/server/server.go +++ b/server/server.go @@ -3,6 +3,7 @@ package server import ( "encoding/json" "fmt" + "log" "net/http" "github.com/kalbasit/signal-api-receiver/receiver" @@ -19,13 +20,25 @@ type Server struct { } type client interface { + ReceiveLoop() error Pop() *receiver.Message Flush() []receiver.Message } // New returns a new Server. func New(sarc client) *Server { - return &Server{sarc: sarc} + s := &Server{sarc: sarc} + go s.start() + + return s +} + +func (s *Server) start() { + for { + if err := s.sarc.ReceiveLoop(); err != nil { + log.Printf("Error in the receive loop: %v", err) + } + } } // ServeHTTP implements the http.Handler interface diff --git a/server/server_test.go b/server/server_test.go index e716468..02b2607 100644 --- a/server/server_test.go +++ b/server/server_test.go @@ -19,6 +19,10 @@ type mockClient struct { msgs []receiver.Message } +func (mc *mockClient) ReceiveLoop() error { + return nil +} + func (mc *mockClient) Pop() *receiver.Message { if len(mc.msgs) == 0 { return nil