package commonservice import ( "errors" "fmt" "go-admin/common/global" "go-admin/common/helper" "go-admin/models/binancedto" "time" "github.com/bytedance/sonic" ) // 判断api订阅是否超时 // wsType 1 现货 2 合约 func JudgeWebsocketTimeout(apiKey string, wsType int) error { key := fmt.Sprintf(global.USER_SUBSCRIBE, apiKey) cache := binancedto.UserSubscribeState{} // 从redis中获取订阅信息 subscribeInfo, err := helper.DefaultRedis.GetString(key) if err != nil { return errors.New("获取订阅信息失败") } sonic.Unmarshal([]byte(subscribeInfo), &cache) if cache.FuturesLastTime == nil && cache.SpotLastTime == nil { return errors.New("未订阅任何行情") } var timeOutInterval time.Duration if wsType == 1 { timeOutInterval = time.Minute * 2 } else { timeOutInterval = time.Minute * 4 } switch wsType { case 1: // 现货 if cache.SpotLastTime == nil { return errors.New("未订阅现货行情") } if time.Since(*cache.SpotLastTime) > timeOutInterval { return errors.New("现货行情订阅超时") } case 2: // 合约 if cache.FuturesLastTime == nil { return errors.New("未订阅合约行情") } if time.Since(*cache.FuturesLastTime) > timeOutInterval { return errors.New("合约行情订阅超时") } default: return errors.New("无效的wsType") } return nil }