github.com/vmpartner/bitmex@v1.1.0/websocket/websocket.go (about)

     1  package websocket
     2  
     3  import (
     4  	"crypto/hmac"
     5  	"crypto/sha256"
     6  	"encoding/hex"
     7  	"encoding/json"
     8  	"fmt"
     9  	"net/url"
    10  	"reflect"
    11  	"time"
    12  	"github.com/gorilla/websocket"
    13  	"github.com/vmpartner/bitmex/tools"
    14  )
    15  
    16  type Message struct {
    17  	Op   string        `json:"op,omitempty"`
    18  	Args []interface{} `json:"args,omitempty"`
    19  }
    20  
    21  func (m *Message) AddArgument(argument string) {
    22  	m.Args = append(m.Args, argument)
    23  }
    24  
    25  func Connect(host string) *websocket.Conn {
    26  	u := url.URL{Scheme: "wss", Host: host, Path: "/realtime"}
    27  	conn, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
    28  	tools.CheckErr(err)
    29  
    30  	return conn
    31  }
    32  
    33  func ReadFromWSToChannel(c *websocket.Conn, chRead chan<- []byte) {
    34  	for {
    35  		_, message, err := c.ReadMessage()
    36  		//fmt.Println("Read", string(message))
    37  		tools.CheckErr(err)
    38  		chRead <- message
    39  	}
    40  }
    41  
    42  func WriteFromChannelToWS(c *websocket.Conn, chWrite <-chan interface{}) {
    43  	for {
    44  		message := <-chWrite
    45  		if reflect.TypeOf(message).String() == "websocket.Message" {
    46  			var err error
    47  			message, err = json.Marshal(message)
    48  			tools.CheckErr(err)
    49  		}
    50  		err := c.WriteMessage(websocket.TextMessage, message.([]byte))
    51  		tools.CheckErr(err)
    52  	}
    53  }
    54  
    55  func GetAuthMessage(key string, secret string) Message {
    56  	nonce := time.Now().Unix() + 412
    57  	req := fmt.Sprintf("GET/realtime%d", nonce)
    58  	sig := hmac.New(sha256.New, []byte(secret))
    59  	sig.Write([]byte(req))
    60  	signature := hex.EncodeToString(sig.Sum(nil))
    61  	var msgKey []interface{}
    62  	msgKey = append(msgKey, key)
    63  	msgKey = append(msgKey, nonce)
    64  	msgKey = append(msgKey, signature)
    65  
    66  	return Message{"authKey", msgKey}
    67  }