11package signalr
22
33import (
4+ "context"
45 "net"
56 "net/url"
67 "sync"
78 "time"
89
910 "github.com/gorilla/websocket"
1011 "github.com/pkg/errors"
12+ "github.com/rs/zerolog"
1113 "github.com/rs/zerolog/log"
1214)
1315
@@ -22,7 +24,7 @@ type Hub struct {
2224
2325 encoder Encoding
2426 msgs chan interface {}
25- stop chan struct {}
27+ log zerolog. Logger
2628 mx sync.Mutex
2729 wg sync.WaitGroup
2830
@@ -48,22 +50,22 @@ func NewHub(address, connectionToken string) (*Hub, error) {
4850 url : u ,
4951 encoder : NewJSONEncoding (),
5052 msgs : make (chan interface {}, 1024 ),
51- stop : make ( chan struct {}, 1 ) ,
53+ log : log . Logger ,
5254 }, nil
5355}
5456
5557// Connect -
56- func (hub * Hub ) Connect () error {
58+ func (hub * Hub ) Connect (ctx context. Context ) error {
5759 if err := hub .handshake (); err != nil {
5860 return err
5961 }
6062
61- hub .listen ()
63+ hub .listen (ctx )
6264 return nil
6365}
6466
6567func (hub * Hub ) handshake () error {
66- log .Trace ().Msgf ("connecting to %s..." , hub .url .String ())
68+ hub . log .Debug ().Msgf ("connecting to %s..." , hub .url .String ())
6769
6870 c , response , err := websocket .DefaultDialer .Dial (hub .url .String (), nil )
6971 if err != nil {
@@ -85,14 +87,13 @@ func (hub *Hub) handshake() error {
8587 if resp .Error != "" {
8688 return errors .Wrap (ErrHandshake , resp .Error )
8789 }
88- log .Trace ().Msg ("connected" )
90+ hub . log .Debug ().Msg ("connected" )
8991
9092 return nil
9193}
9294
9395// Close -
9496func (hub * Hub ) Close () error {
95- hub .stop <- struct {}{}
9697 hub .wg .Wait ()
9798
9899 if err := hub .Send (newCloseMessage ()); err != nil {
@@ -103,22 +104,21 @@ func (hub *Hub) Close() error {
103104 return err
104105 }
105106
106- close (hub .stop )
107107 close (hub .msgs )
108108 return nil
109109}
110110
111111func (hub * Hub ) reconnect () error {
112- log .Warn ().Msg ("reconnecting..." )
112+ hub . log .Warn ().Msg ("reconnecting..." )
113113
114114 if err := hub .Send (newCloseMessage ()); err != nil {
115- log .Err (err ).Msg ("send" )
115+ hub . log .Err (err ).Msg ("send" )
116116 }
117117
118118 if err := hub .conn .Close (); err != nil {
119- log .Err (err ).Msg ("close" )
119+ hub . log .Err (err ).Msg ("close" )
120120 }
121- log .Trace ().Msg ("connection closed" )
121+ hub . log .Debug ().Msg ("connection closed" )
122122 if err := hub .handshake (); err != nil {
123123 return err
124124 }
@@ -128,28 +128,29 @@ func (hub *Hub) reconnect() error {
128128 return nil
129129}
130130
131- func (hub * Hub ) listen () {
131+ func (hub * Hub ) listen (ctx context. Context ) {
132132 hub .wg .Add (1 )
133133
134134 go func () {
135135 defer hub .wg .Done ()
136136
137137 for {
138138 select {
139- case <- hub .stop :
139+ case <- ctx .Done ():
140+ hub .log .Debug ().Msg ("stop hub listenning..." )
140141 return
141142 default :
142143 if err := hub .readAllMessages (); err != nil {
143144 switch {
144145 case errors .Is (err , ErrTimeout ) || websocket .IsCloseError (err , websocket .CloseAbnormalClosure ):
145146 if err := hub .reconnect (); err != nil {
146- log .Err (err ).Msg ("reconnect" )
147- log .Warn ().Msg ("retry after 5 seconds" )
147+ hub . log .Err (err ).Msg ("reconnect" )
148+ hub . log .Warn ().Msg ("retry after 5 seconds" )
148149 time .Sleep (time .Second * 5 )
149150 }
150151 case errors .Is (err , ErrEmptyResponse ):
151152 default :
152- log .Err (err ).Msg ("readAllMessages" )
153+ hub . log .Err (err ).Msg ("readAllMessages" )
153154 }
154155 }
155156 }
@@ -163,6 +164,9 @@ func (hub *Hub) Send(msg interface{}) error {
163164 if err != nil {
164165 return err
165166 }
167+
168+ hub .log .Trace ().Str ("data" , string (data )).Msg ("==> TzKT server" )
169+
166170 hub .mx .Lock ()
167171 defer hub .mx .Unlock ()
168172 return hub .conn .WriteMessage (websocket .TextMessage , data )
@@ -186,6 +190,8 @@ func (hub *Hub) readOneMessage(msg interface{}) error {
186190 if len (data ) == 0 {
187191 return ErrEmptyResponse
188192 }
193+ hub .log .Trace ().Str ("data" , string (data )).Msg ("<== TzKT server" )
194+
189195 if err := json .Unmarshal (data , msg ); err != nil {
190196 return err
191197 }
@@ -203,7 +209,7 @@ func (hub *Hub) readAllMessages() error {
203209 return err
204210 }
205211 if scanner == nil {
206- log .Warn ().Msg ("no messages during read timeout" )
212+ hub . log .Warn ().Msg ("no messages during read timeout" )
207213 return ErrEmptyResponse
208214 }
209215 if err := scanner .Scan (); err != nil {
@@ -219,11 +225,14 @@ func (hub *Hub) readAllMessages() error {
219225 break
220226 }
221227
228+ hub .log .Trace ().Str ("data" , string (data )).Msg ("<== TzKT server" )
229+
222230 msg , err := hub .encoder .Decode (data )
223231 if err != nil {
224232 return err
225233 }
226234 hub .msgs <- msg
235+
227236 if closeMsg , ok := msg .(CloseMessage ); ok {
228237 return hub .closeMessageHandler (closeMsg )
229238 }
@@ -238,7 +247,7 @@ func (hub *Hub) readAllMessages() error {
238247
239248func (hub * Hub ) closeMessageHandler (msg CloseMessage ) error {
240249 if msg .Error != "" {
241- log .Error ().Msg (msg .Error )
250+ hub . log .Error ().Msg (msg .Error )
242251 }
243252 if ! msg .AllowReconnect {
244253 return ErrConnectionClose
0 commit comments