// +build ignore package main import ( "encoding/json" "fmt" "log" "net/url" "time" "github.com/gorilla/websocket" ) func main() { u := url.URL{Scheme: "wss", Host: "indexer.dydx.trade", Path: "/v4/ws"} log.Printf("Connecting to %s", u.String()) c, _, err := websocket.DefaultDialer.Dial(u.String(), nil) if err != nil { log.Fatal("dial:", err) } defer c.Close() done := make(chan struct{}) go func() { defer close(done) for { _, message, err := c.ReadMessage() if err != nil { log.Println("read:", err) return } log.Printf("recv: %s", string(message)) } }() // Subscribe sub := map[string]string{"type": "subscribe", "channel": "v4_markets"} subData, _ := json.Marshal(sub) c.WriteMessage(websocket.TextMessage, subData) log.Printf("sent sub: %s", string(subData)) // Try pings for i := 0; i < 5; i++ { time.Sleep(10 * time.Second) // Try JSON ping ping := map[string]string{"type": "ping"} pingData, _ := json.Marshal(ping) err := c.WriteMessage(websocket.TextMessage, pingData) if err != nil { log.Printf("JSON ping error: %v", err) } else { log.Printf("sent JSON ping: %s", string(pingData)) } // Try raw WS ping frame err = c.WriteMessage(websocket.PingMessage, []byte("ping")) if err != nil { log.Printf("WS ping error: %v", err) } else { log.Printf("sent WS ping frame") } } time.Sleep(30 * time.Second) fmt.Println("Done - checking if still connected") select { case <-done: fmt.Println("Connection closed") default: fmt.Println("Still connected!") } }