An experimental pub/sub client and server project.

fixed the peer read action pointer

Changed files
+12 -10
server
+2 -2
server/peer.go
··· 32 connMu sync.Mutex 33 } 34 35 - func newPeer(conn net.Conn) peer { 36 - return peer{ 37 conn: conn, 38 } 39 }
··· 32 connMu sync.Mutex 33 } 34 35 + func newPeer(conn net.Conn) *peer { 36 + return &peer{ 37 conn: conn, 38 } 39 }
+10 -8
server/server.go
··· 70 71 func (s *Server) handleConn(conn net.Conn) { 72 peer := newPeer(conn) 73 - action, err := readAction(peer) 74 if err != nil { 75 slog.Error("failed to read action from peer", "error", err, "peer", peer.addr()) 76 return ··· 78 79 switch action { 80 case Subscribe: 81 - s.handleSubscribe(&peer) 82 case Unsubscribe: 83 - s.handleUnsubscribe(&peer) 84 case Publish: 85 - s.handlePublish(&peer) 86 default: 87 slog.Error("unknown action", "action", action, "peer", peer.addr()) 88 writeStatus(Error, "unknown action", peer.conn) ··· 96 // keep handling the peers connection, getting the action from the peer when it wishes to do something else. 97 // once the peers connection ends, it will be unsubscribed from all topics and returned 98 for { 99 - action, err := readAction(*peer) 100 if err != nil { 101 var neterr net.Error 102 if errors.As(err, &neterr) && neterr.Timeout() { ··· 338 return nil 339 } 340 341 - // TODO: work out why this can't take a pointer to the peer 342 - func readAction(peer peer) (Action, error) { 343 var action Action 344 op := func(conn net.Conn) error { 345 - conn.SetReadDeadline(time.Now().Add(time.Second)) 346 347 err := binary.Read(conn, binary.BigEndian, &action) 348 if err != nil {
··· 70 71 func (s *Server) handleConn(conn net.Conn) { 72 peer := newPeer(conn) 73 + 74 + action, err := readAction(peer, 0) 75 if err != nil { 76 slog.Error("failed to read action from peer", "error", err, "peer", peer.addr()) 77 return ··· 79 80 switch action { 81 case Subscribe: 82 + s.handleSubscribe(peer) 83 case Unsubscribe: 84 + s.handleUnsubscribe(peer) 85 case Publish: 86 + s.handlePublish(peer) 87 default: 88 slog.Error("unknown action", "action", action, "peer", peer.addr()) 89 writeStatus(Error, "unknown action", peer.conn) ··· 97 // keep handling the peers connection, getting the action from the peer when it wishes to do something else. 98 // once the peers connection ends, it will be unsubscribed from all topics and returned 99 for { 100 + action, err := readAction(peer, time.Millisecond*100) 101 if err != nil { 102 var neterr net.Error 103 if errors.As(err, &neterr) && neterr.Timeout() { ··· 339 return nil 340 } 341 342 + func readAction(peer *peer, timeout time.Duration) (Action, error) { 343 var action Action 344 op := func(conn net.Conn) error { 345 + if timeout > 0 { 346 + conn.SetReadDeadline(time.Now().Add(timeout)) 347 + } 348 349 err := binary.Read(conn, binary.BigEndian, &action) 350 if err != nil {