rewrite ws client to expose a callback instead of a channel

callback gives more power to the publisher. plus it is optional
comparing to a channel, which will block the whole client if you won't
read from it.
This commit is contained in:
Anton Kaliaev
2017-09-29 14:11:46 +04:00
committed by Zach Ramsay
parent ce36a0111a
commit 45ff7cdd0c
3 changed files with 19 additions and 10 deletions

View File

@ -41,9 +41,11 @@ type WSClient struct {
PingPongLatencyTimer metrics.Timer
// user facing channels, closed only when the client is being stopped.
ResultsCh chan json.RawMessage
ErrorsCh chan error
ReconnectCh chan bool
ResultsCh chan json.RawMessage
ErrorsCh chan error
// Callback, which will be called each time after successful reconnect.
onReconnect func()
// internal channels
send chan types.RPCRequest // user requests
@ -125,6 +127,14 @@ func PingPeriod(pingPeriod time.Duration) func(*WSClient) {
}
}
// OnReconnect sets the callback, which will be called every time after
// successful reconnect.
func OnReconnect(cb func()) func(*WSClient) {
return func(c *WSClient) {
c.onReconnect = cb
}
}
// String returns WS client full address.
func (c *WSClient) String() string {
return fmt.Sprintf("%s (%s)", c.Address, c.Endpoint)
@ -140,7 +150,6 @@ func (c *WSClient) OnStart() error {
c.ResultsCh = make(chan json.RawMessage)
c.ErrorsCh = make(chan error)
c.ReconnectCh = make(chan bool)
c.send = make(chan types.RPCRequest)
// 1 additional error may come from the read/write
@ -256,7 +265,9 @@ func (c *WSClient) reconnect() error {
c.Logger.Error("failed to redial", "err", err)
} else {
c.Logger.Info("reconnected")
c.ReconnectCh <- true
if c.onReconnect != nil {
go c.onReconnect()
}
return nil
}