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 }