2021-02-27 08:47:21 +00:00
|
|
|
package ftx
|
|
|
|
|
|
|
|
import (
|
2021-02-27 10:41:46 +00:00
|
|
|
"fmt"
|
2021-02-27 08:47:21 +00:00
|
|
|
"time"
|
|
|
|
|
2021-02-27 10:41:46 +00:00
|
|
|
"github.com/gorilla/websocket"
|
|
|
|
|
2021-02-27 08:47:21 +00:00
|
|
|
"github.com/c9s/bbgo/pkg/service"
|
|
|
|
)
|
|
|
|
|
|
|
|
type WebsocketService struct {
|
|
|
|
*service.WebsocketClientBase
|
|
|
|
|
|
|
|
key string
|
|
|
|
secret string
|
2021-02-27 10:41:46 +00:00
|
|
|
|
2021-03-27 10:07:35 +00:00
|
|
|
subscriptions []websocketRequest
|
2021-02-27 08:47:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
const endpoint = "wss://ftx.com/ws/"
|
|
|
|
|
|
|
|
func NewWebsocketService(key string, secret string) *WebsocketService {
|
|
|
|
s := &WebsocketService{
|
|
|
|
WebsocketClientBase: service.NewWebsocketClientBase(endpoint, 3*time.Second),
|
|
|
|
key: key,
|
|
|
|
secret: secret,
|
|
|
|
}
|
2021-02-27 10:41:46 +00:00
|
|
|
s.OnConnected(func(_ *websocket.Conn) {
|
|
|
|
if err := s.sendSubscriptions(); err != nil {
|
|
|
|
s.EmitError(err)
|
|
|
|
}
|
|
|
|
})
|
2021-02-27 08:47:21 +00:00
|
|
|
return s
|
|
|
|
}
|
|
|
|
|
2021-03-27 10:07:35 +00:00
|
|
|
func (w *WebsocketService) Subscribe(request websocketRequest) {
|
|
|
|
w.subscriptions = append(w.subscriptions, request)
|
2021-02-27 10:41:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
var errSubscriptionFailed = fmt.Errorf("failed to subscribe")
|
|
|
|
|
|
|
|
func (w *WebsocketService) sendSubscriptions() error {
|
|
|
|
conn := w.Conn()
|
|
|
|
for _, s := range w.subscriptions {
|
|
|
|
if err := conn.WriteJSON(s); err != nil {
|
|
|
|
return fmt.Errorf("can't send subscription request %+v: %w", s, errSubscriptionFailed)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2021-03-27 10:07:35 +00:00
|
|
|
// After closing the websocket connection, you have to subscribe all events again
|
2021-02-27 08:47:21 +00:00
|
|
|
func (w *WebsocketService) Close() error {
|
2021-03-27 10:07:35 +00:00
|
|
|
w.subscriptions = nil
|
|
|
|
if conn := w.Conn(); conn != nil {
|
|
|
|
return conn.Close()
|
|
|
|
}
|
|
|
|
return nil
|
2021-02-27 08:47:21 +00:00
|
|
|
}
|