@@ -36,31 +36,68 @@ func (b *WebSocket) SetMessageHandler(handler MessageHandler) {
3636}
3737
3838type WebSocket struct {
39- conn * websocket.Conn
40- url string
41- apiKey string
42- apiSecret string
43- onMessage MessageHandler
39+ conn * websocket.Conn
40+ url string
41+ apiKey string
42+ apiSecret string
43+ maxAliveTime string
44+ pingInterval int
45+ onMessage MessageHandler
4446}
4547
46- func NewBybitPrivateWebSocket (url , apiKey , apiSecret string , handler MessageHandler ) * WebSocket {
47- return & WebSocket {
48- url : url ,
49- apiKey : apiKey ,
50- apiSecret : apiSecret ,
51- onMessage : handler ,
48+ type WebsocketOption func (* WebSocket )
49+
50+ func WithPingInterval (pingInterval int ) WebsocketOption {
51+ return func (c * WebSocket ) {
52+ c .pingInterval = pingInterval
53+ }
54+ }
55+
56+ func WithMaxAliveTime (maxAliveTime string ) WebsocketOption {
57+ return func (c * WebSocket ) {
58+ c .maxAliveTime = maxAliveTime
5259 }
5360}
5461
55- func NewBybitPublicWebSocket (url string , handler MessageHandler ) * WebSocket {
56- return & WebSocket {
57- url : url ,
58- onMessage : handler ,
62+ func NewBybitPrivateWebSocket (url , apiKey , apiSecret string , handler MessageHandler , options ... WebsocketOption ) * WebSocket {
63+ c := & WebSocket {
64+ url : url ,
65+ apiKey : apiKey ,
66+ apiSecret : apiSecret ,
67+ maxAliveTime : "" ,
68+ pingInterval : 20 ,
69+ onMessage : handler ,
5970 }
71+
72+ // Apply the provided options
73+ for _ , opt := range options {
74+ opt (c )
75+ }
76+
77+ return c
78+ }
79+
80+ func NewBybitPublicWebSocket (url string , pingInterval int , handler MessageHandler , options ... WebsocketOption ) * WebSocket {
81+ c := & WebSocket {
82+ url : url ,
83+ pingInterval : pingInterval , // default is 20 seconds
84+ onMessage : handler ,
85+ }
86+
87+ // Apply the provided options
88+ for _ , opt := range options {
89+ opt (c )
90+ }
91+
92+ return c
6093}
6194
6295func (b * WebSocket ) Connect (args []string ) error {
6396 var err error
97+ wssUrl := b .url
98+ if b .maxAliveTime != "" {
99+ wssUrl += "?max_alive_time=" + b .maxAliveTime
100+ }
64101 b .conn , _ , err = websocket .DefaultDialer .Dial (b .url , nil )
65102 if err != nil {
66103 return err
@@ -80,7 +117,7 @@ func (b *WebSocket) Connect(args []string) error {
80117}
81118
82119func Ping (b * WebSocket ) {
83- ticker := time .NewTicker (15 * time .Second )
120+ ticker := time .NewTicker (time . Duration ( b . pingInterval ) * time .Second )
84121 go func () {
85122 defer ticker .Stop () // Ensure the ticker is stopped when this goroutine ends
86123 for {
@@ -123,7 +160,7 @@ func (b *WebSocket) sendAuth() error {
123160 fmt .Println ("signature generated : " + signature )
124161
125162 authMessage := map [string ]interface {}{
126- "req_id" : uuid .New (), // You would need to implement or find a package for generating GUID
163+ "req_id" : uuid .New (),
127164 "op" : "auth" ,
128165 "args" : []interface {}{b .apiKey , expires , signature },
129166 }
0 commit comments