liuxiaolong
2022-03-08 015c1a5d8b803dbd867f31426dd1391cd51b0ee3
NewClient add Remote call options
2个文件已修改
72 ■■■■■ 已修改文件
client.go 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
clientFactory.go 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
client.go
@@ -48,10 +48,14 @@
    return nil
}
var n_getNetNode = func(topic string) []*bhome_msg.MsgQueryTopicReply_BHNodeAddress{
    return nil
}
func InitGetNetNode(fn func(name string)[]*bhome_msg.MsgQueryTopicReply_BHNodeAddress) {
    //if fn != nil {
    //    getNetNode = fn
    //}
    if fn != nil {
        n_getNetNode = fn
    }
}
var busReq = func(req *bhome_msg.MsgRequestTopic,dest []*bhome_msg.MsgQueryTopicReply_BHNodeAddress) ([]byte, error) {
clientFactory.go
@@ -5,18 +5,35 @@
)
//Factory new client
/*
    跨机请求时,topic devId ip必须非空
*/
func NewClient(opts ...IOption) Client {
    opt := defaultOption()
    for _,o := range opts {
        o.apply(&opt)
    }
    if opt.ip != "" { //跨机请求
        if opt.topic == "" {
            return nil
        }
        opt.nodes = n_getNetNode(opt.topic)
        if !checkRemoteNetNode(opt.ip, &opt.nodes) {
            return nil
        }
    }
    return &SBusClient{
        nodes: opt.nodes,
    }
}
type Option struct {
    nodes []*bhome_msg.MsgQueryTopicReply_BHNodeAddress
    nodes         []*bhome_msg.MsgQueryTopicReply_BHNodeAddress
    topic         string
    devId         string
    ip               string
    port         int32
}
type IOption interface {
@@ -43,8 +60,51 @@
    })
}
func WithTopic(topic string) IOption {
    return newFuncOption(func(o *Option){
        o.topic = topic
    })
}
func WithIp(ip string) IOption {
    return newFuncOption(func(o *Option) {
        o.ip = ip
    })
}
func WithDevId(devId string) IOption {
    return newFuncOption(func(o *Option) {
        o.devId = devId
    })
}
func WithPort(port int32) IOption {
    return newFuncOption(func(o *Option) {
        o.port = port
    })
}
func defaultOption() Option {
    return Option{
    }
}
func checkRemoteNetNode(rip string, netNode *[]*bhome_msg.MsgQueryTopicReply_BHNodeAddress) bool {
    if netNode == nil || len(*netNode) == 0 {
        return false
    }
    for _,n := range *netNode {
        if n.Addr != nil && string(n.Addr.Ip) == rip && n.Addr.Port >0 {
            *netNode = append([]*bhome_msg.MsgQueryTopicReply_BHNodeAddress{}, &bhome_msg.MsgQueryTopicReply_BHNodeAddress{
                Addr: &bhome_msg.BHAddress{
                    Ip: []byte(rip),
                    Port: n.Addr.Port,
                },
            })
            return true
        }
    }
    return false
}