You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
104 lines
2.3 KiB
104 lines
2.3 KiB
package okx |
|
|
|
import ( |
|
"sig-pub/pkg/zlog" |
|
|
|
"github.com/bytedance/sonic" |
|
"github.com/gorilla/websocket" |
|
) |
|
|
|
func (c *wsChannel[T, R]) Consumer() <-chan R { |
|
return c.dataC |
|
} |
|
|
|
func (c *wsChannel[T, R]) Subscribe(instIds ...string) (err error) { |
|
c.Lock() |
|
defer c.Unlock() |
|
|
|
var args []WebSocketEventArg |
|
for _, instId := range instIds { |
|
if status, ok := c.subscribeInsts.Load(instId); !ok || status == StatusUnsubscribe { |
|
for _, channel := range c.cfg.subscribeChannels { |
|
args = append(args, WebSocketEventArg{ |
|
Channel: channel, |
|
InstId: instId, |
|
}) |
|
} |
|
c.subscribeInsts.Store(instId, StatusSubscribing) // 订阅中 |
|
} |
|
} |
|
if len(args) == 0 { |
|
return |
|
} |
|
|
|
// 发送订阅消息 |
|
subscribeMsg := map[string]any{ |
|
"op": "subscribe", |
|
"args": args, |
|
} |
|
msg, err := sonic.Marshal(subscribeMsg) |
|
if err != nil { |
|
return |
|
} |
|
err = c.conn.WriteMessage(websocket.TextMessage, msg) |
|
if err != nil { |
|
zlog.Errorf("channel %s write subscribe msg error: %v", c.channelId, err) |
|
return |
|
} |
|
return |
|
} |
|
|
|
// Unsubscribe todo 无订阅时关闭 channel |
|
func (c *wsChannel[T, R]) Unsubscribe(instIds ...string) (err error) { |
|
c.Lock() |
|
defer c.Unlock() |
|
|
|
var args []WebSocketEventArg |
|
for _, instId := range instIds { |
|
if status, ok := c.subscribeInsts.Load(instId); ok && status != StatusUnsubscribe { |
|
for _, channel := range c.cfg.subscribeChannels { |
|
args = append(args, WebSocketEventArg{ |
|
Channel: channel, |
|
InstId: instId, |
|
}) |
|
} |
|
c.subscribeInsts.Store(instId, StatusUnsubscribe) // todo 取消订阅中 |
|
} |
|
} |
|
if len(args) == 0 { |
|
return |
|
} |
|
|
|
// send subscribe message |
|
unsubscribeMsg := map[string]any{ |
|
"op": ChannelEventTypeUnsubscribe, |
|
"args": args, |
|
} |
|
msg, err := sonic.Marshal(unsubscribeMsg) |
|
if err != nil { |
|
return |
|
} |
|
err = c.conn.WriteMessage(websocket.TextMessage, msg) |
|
if err != nil { |
|
zlog.Error("Error write connecting to server:", err) |
|
return |
|
} |
|
return |
|
} |
|
|
|
// 产品是否已订阅 |
|
func (c *wsChannel[T, R]) IsSubscribed(instId string) bool { |
|
status, ok := c.subscribeInsts.Load(instId) |
|
return ok && (status == StatusSubscribed) |
|
} |
|
|
|
// 已订阅产品列表 |
|
func (c *wsChannel[T, R]) GetSubscribes() (instIds []string) { |
|
c.subscribeInsts.Range(func(instId string, status SubscribeStatus) bool { |
|
if status == StatusSubscribed { |
|
instIds = append(instIds, instId) |
|
} |
|
return true |
|
}) |
|
return |
|
}
|
|
|