mirror of
https://github.com/d0zingcat/gocryptotrader.git
synced 2026-06-04 15:10:54 +00:00
websocket/exchanges: populate context before multi connection upgrade (#1933)
* websocket/exchanges: populate context before multi connection upgrade * fix test * linter: fix * gk: dial * gk: nits rm param names --------- Co-authored-by: Ryan O'Hara-Reid <ryan.oharareid@thrasher.io>
This commit is contained in:
@@ -36,6 +36,7 @@ var defaultSubscriptions = subscription.List{
|
||||
|
||||
// WsConnect initiates a websocket connection
|
||||
func (b *Bithumb) WsConnect() error {
|
||||
ctx := context.TODO()
|
||||
if !b.Websocket.IsEnabled() || !b.IsEnabled() {
|
||||
return websocket.ErrWebsocketNotEnabled
|
||||
}
|
||||
@@ -44,17 +45,15 @@ func (b *Bithumb) WsConnect() error {
|
||||
dialer.HandshakeTimeout = b.Config.HTTPTimeout
|
||||
dialer.Proxy = http.ProxyFromEnvironment
|
||||
|
||||
err := b.Websocket.Conn.Dial(&dialer, http.Header{})
|
||||
err := b.Websocket.Conn.Dial(ctx, &dialer, http.Header{})
|
||||
if err != nil {
|
||||
return fmt.Errorf("%v - Unable to connect to Websocket. Error: %w",
|
||||
b.Name,
|
||||
err)
|
||||
return fmt.Errorf("%v - Unable to connect to Websocket. Error: %w", b.Name, err)
|
||||
}
|
||||
|
||||
b.Websocket.Wg.Add(1)
|
||||
go b.wsReadData()
|
||||
|
||||
b.setupOrderbookManager()
|
||||
b.setupOrderbookManager(ctx)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -183,9 +182,10 @@ func (b *Bithumb) GetSubscriptionTemplate(_ *subscription.Subscription) (*templa
|
||||
|
||||
// Subscribe subscribes to a set of channels
|
||||
func (b *Bithumb) Subscribe(subs subscription.List) error {
|
||||
ctx := context.TODO()
|
||||
var errs error
|
||||
for _, s := range subs {
|
||||
err := b.Websocket.Conn.SendJSONMessage(context.TODO(), request.Unset, json.RawMessage(s.QualifiedChannel))
|
||||
err := b.Websocket.Conn.SendJSONMessage(ctx, request.Unset, json.RawMessage(s.QualifiedChannel))
|
||||
if err == nil {
|
||||
err = b.Websocket.AddSuccessfulSubscriptions(b.Websocket.Conn, s)
|
||||
}
|
||||
|
||||
@@ -51,7 +51,7 @@ func TestWsHandleData(t *testing.T) {
|
||||
},
|
||||
}
|
||||
|
||||
dummy.setupOrderbookManager()
|
||||
dummy.setupOrderbookManager(t.Context())
|
||||
dummy.API.Endpoints = b.NewEndpoints()
|
||||
|
||||
welcomeMsg := []byte(`{"status":"0000","resmsg":"Connected Successfully"}`)
|
||||
|
||||
@@ -85,21 +85,13 @@ func (b *Bithumb) applyBufferUpdate(pair currency.Pair) error {
|
||||
|
||||
recent, err := b.Websocket.Orderbook.GetOrderbook(pair, asset.Spot)
|
||||
if err != nil {
|
||||
log.Errorf(
|
||||
log.WebsocketMgr,
|
||||
"%s error fetching recent orderbook when applying updates: %s\n",
|
||||
b.Name,
|
||||
err)
|
||||
log.Errorf(log.WebsocketMgr, "%s error fetching recent orderbook when applying updates: %s\n", b.Name, err)
|
||||
}
|
||||
|
||||
if recent != nil {
|
||||
err = b.obm.checkAndProcessOrderbookUpdate(b.processBooks, pair, recent)
|
||||
if err != nil {
|
||||
log.Errorf(
|
||||
log.WebsocketMgr,
|
||||
"%s error processing update - initiating new orderbook sync via REST: %s\n",
|
||||
b.Name,
|
||||
err)
|
||||
log.Errorf(log.WebsocketMgr, "%s error processing update - initiating new orderbook sync via REST: %s\n", b.Name, err)
|
||||
err = b.obm.setNeedsFetchingBook(pair)
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -112,7 +104,7 @@ func (b *Bithumb) applyBufferUpdate(pair currency.Pair) error {
|
||||
|
||||
// SynchroniseWebsocketOrderbook synchronises full orderbook for currency pair
|
||||
// asset
|
||||
func (b *Bithumb) SynchroniseWebsocketOrderbook() {
|
||||
func (b *Bithumb) SynchroniseWebsocketOrderbook(ctx context.Context) {
|
||||
b.Websocket.Wg.Add(1)
|
||||
go func() {
|
||||
defer b.Websocket.Wg.Done()
|
||||
@@ -127,11 +119,9 @@ func (b *Bithumb) SynchroniseWebsocketOrderbook() {
|
||||
}
|
||||
}
|
||||
case j := <-b.obm.jobs:
|
||||
err := b.processJob(j.Pair)
|
||||
err := b.processJob(ctx, j.Pair)
|
||||
if err != nil {
|
||||
log.Errorf(log.WebsocketMgr,
|
||||
"%s processing websocket orderbook error %v",
|
||||
b.Name, err)
|
||||
log.Errorf(log.WebsocketMgr, "%s processing websocket orderbook error %v", b.Name, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -139,8 +129,8 @@ func (b *Bithumb) SynchroniseWebsocketOrderbook() {
|
||||
}
|
||||
|
||||
// processJob fetches and processes orderbook updates
|
||||
func (b *Bithumb) processJob(p currency.Pair) error {
|
||||
err := b.SeedLocalCache(context.TODO(), p)
|
||||
func (b *Bithumb) processJob(ctx context.Context, p currency.Pair) error {
|
||||
err := b.SeedLocalCache(ctx, p)
|
||||
if err != nil {
|
||||
return fmt.Errorf("%s %s seeding local cache for orderbook error: %v",
|
||||
p, asset.Spot, err)
|
||||
@@ -178,7 +168,7 @@ func (b *Bithumb) flushAndCleanup(p currency.Pair) {
|
||||
}
|
||||
}
|
||||
|
||||
func (b *Bithumb) setupOrderbookManager() {
|
||||
func (b *Bithumb) setupOrderbookManager(ctx context.Context) {
|
||||
if b.obm.state == nil {
|
||||
b.obm.state = make(map[currency.Code]map[currency.Code]map[asset.Item]*update)
|
||||
b.obm.jobs = make(chan job, maxWSOrderbookJobs)
|
||||
@@ -197,7 +187,7 @@ func (b *Bithumb) setupOrderbookManager() {
|
||||
|
||||
for range maxWSOrderbookWorkers {
|
||||
// 10 workers for synchronising book
|
||||
b.SynchroniseWebsocketOrderbook()
|
||||
b.SynchroniseWebsocketOrderbook(ctx)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user