Binance: Fix websocket subscribe error with many currency pairs enabled (#670)

* Fix subscribe error with many currency pairs

* Adds proper rate limit. Adds empty check.

Co-authored-by: gloriousCode <scott.grant@thrasher.io>
Co-authored-by: Scott <gloriousCode@users.noreply.github.com>
This commit is contained in:
arttobe
2021-06-23 07:53:57 +02:00
committed by GitHub
parent 83057ef515
commit d978b3bbdc
3 changed files with 27 additions and 8 deletions

View File

@@ -8,6 +8,8 @@ import (
"github.com/thrasher-corp/gocryptotrader/exchanges/asset"
)
const wsRateLimitMilliseconds = 250
// withdrawals status codes description
const (
EmailSent = iota

View File

@@ -540,14 +540,21 @@ func (b *Binance) Subscribe(channelsToSubscribe []stream.ChannelSubscription) er
payload := WsPayload{
Method: "SUBSCRIBE",
}
for i := range channelsToSubscribe {
payload.Params = append(payload.Params, channelsToSubscribe[i].Channel)
if i%50 == 0 && i != 0 {
err := b.Websocket.Conn.SendJSONMessage(payload)
if err != nil {
return err
}
payload.Params = []string{}
}
}
err := b.Websocket.Conn.SendJSONMessage(payload)
if err != nil {
return err
if len(payload.Params) > 0 {
err := b.Websocket.Conn.SendJSONMessage(payload)
if err != nil {
return err
}
}
b.Websocket.AddSuccessfulSubscriptions(channelsToSubscribe...)
return nil
@@ -560,10 +567,19 @@ func (b *Binance) Unsubscribe(channelsToUnsubscribe []stream.ChannelSubscription
}
for i := range channelsToUnsubscribe {
payload.Params = append(payload.Params, channelsToUnsubscribe[i].Channel)
if i%50 == 0 && i != 0 {
err := b.Websocket.Conn.SendJSONMessage(payload)
if err != nil {
return err
}
payload.Params = []string{}
}
}
err := b.Websocket.Conn.SendJSONMessage(payload)
if err != nil {
return err
if len(payload.Params) > 0 {
err := b.Websocket.Conn.SendJSONMessage(payload)
if err != nil {
return err
}
}
b.Websocket.RemoveSuccessfulUnsubscriptions(channelsToUnsubscribe...)
return nil

View File

@@ -241,6 +241,7 @@ func (b *Binance) Setup(exch *config.ExchangeConfig) error {
return b.Websocket.SetupNewConnection(stream.ConnectionSetup{
ResponseCheckTimeout: exch.WebsocketResponseCheckTimeout,
ResponseMaxLimit: exch.WebsocketResponseMaxLimit,
RateLimit: wsRateLimitMilliseconds,
})
}