|
@@ -8,7 +8,7 @@ import (
|
|
"log"
|
|
"log"
|
|
"math/rand"
|
|
"math/rand"
|
|
"net"
|
|
"net"
|
|
- "regexp"
|
|
|
|
|
|
+ // "regexp"
|
|
"strconv"
|
|
"strconv"
|
|
"strings"
|
|
"strings"
|
|
"sync"
|
|
"sync"
|
|
@@ -103,12 +103,12 @@ func (h *Hub) UseMiddle(middleFunc MiddleFunc) {
|
|
}
|
|
}
|
|
|
|
|
|
// 注册频道,其中频道为正则表达式字符串
|
|
// 注册频道,其中频道为正则表达式字符串
|
|
-func (h *Hub) Subscribe(channel *regexp.Regexp, cmd string, backFunc SubscribeBack) (err error) {
|
|
|
|
- if channel == nil {
|
|
|
|
- return errors.New("channel can not be nil")
|
|
|
|
|
|
+func (h *Hub) Subscribe(filter FilterFunc, cmd string, backFunc SubscribeBackFunc) (err error) {
|
|
|
|
+ if filter == nil {
|
|
|
|
+ return errors.New("filter function can not be nil")
|
|
}
|
|
}
|
|
reg := &SubscribeData{
|
|
reg := &SubscribeData{
|
|
- Channel: channel,
|
|
|
|
|
|
+ Filter: filter,
|
|
Cmd: cmd,
|
|
Cmd: cmd,
|
|
BackFunc: backFunc,
|
|
BackFunc: backFunc,
|
|
}
|
|
}
|
|
@@ -226,7 +226,8 @@ func (h *Hub) sendRequest(gd *GetData) (count int) {
|
|
if conn.state != Connected {
|
|
if conn.state != Connected {
|
|
return true
|
|
return true
|
|
}
|
|
}
|
|
- if gd.Channel.MatchString(conn.channel) {
|
|
|
|
|
|
+ // if gd.Channel.MatchString(conn.channel) {
|
|
|
|
+ if gd.Filter(conn) {
|
|
var id uint16
|
|
var id uint16
|
|
if gd.backchan != nil {
|
|
if gd.backchan != nil {
|
|
id = h.GetID()
|
|
id = h.GetID()
|
|
@@ -239,7 +240,7 @@ func (h *Hub) sendRequest(gd *GetData) (count int) {
|
|
go h.outResponse(&ResponseData{
|
|
go h.outResponse(&ResponseData{
|
|
Id: id,
|
|
Id: id,
|
|
State: config.GET_TIMEOUT,
|
|
State: config.GET_TIMEOUT,
|
|
- Data: fmt.Appendf(nil, "[%s] %s %s", config.GET_TIMEOUT_MSG, gd.Channel.String(), gd.Cmd),
|
|
|
|
|
|
+ Data: fmt.Appendf(nil, "[%s] %s %s", config.GET_TIMEOUT_MSG, conn.channel, gd.Cmd),
|
|
conn: conn,
|
|
conn: conn,
|
|
})
|
|
})
|
|
// 检查是否已经很久时间没有使用连接了
|
|
// 检查是否已经很久时间没有使用连接了
|
|
@@ -312,7 +313,8 @@ func (h *Hub) requestFromNet(request *RequestData) {
|
|
// 倒序查找是为了新增的频道响应函数优先执行
|
|
// 倒序查找是为了新增的频道响应函数优先执行
|
|
for i := len(subs) - 1; i >= 0; i-- {
|
|
for i := len(subs) - 1; i >= 0; i-- {
|
|
rg := subs[i]
|
|
rg := subs[i]
|
|
- if rg.Channel.MatchString(channel) {
|
|
|
|
|
|
+ // if rg.Channel.MatchString(channel) {
|
|
|
|
+ if rg.Filter(request.conn) {
|
|
state, data := rg.BackFunc(request)
|
|
state, data := rg.BackFunc(request)
|
|
// NEXT_SUBSCRIBE 表示当前的函数没有处理完成,还需要下个注册函数处理
|
|
// NEXT_SUBSCRIBE 表示当前的函数没有处理完成,还需要下个注册函数处理
|
|
if state == config.NEXT_SUBSCRIBE {
|
|
if state == config.NEXT_SUBSCRIBE {
|
|
@@ -365,7 +367,11 @@ func (h *Hub) requestFromNet(request *RequestData) {
|
|
// 当前调用将会阻塞,直到命令都执行结束,最后返回执行的数量
|
|
// 当前调用将会阻塞,直到命令都执行结束,最后返回执行的数量
|
|
// 如果 backFunc 返回为 false 则提前结束
|
|
// 如果 backFunc 返回为 false 则提前结束
|
|
// 最大数量和超时时间如果为0的话表示使用默认值
|
|
// 最大数量和超时时间如果为0的话表示使用默认值
|
|
-func (h *Hub) GetWithMaxAndTimeout(channel *regexp.Regexp, cmd string, data any, backFunc GetBack, max int, timeout int) (count int) {
|
|
|
|
|
|
+func (h *Hub) GetWithMaxAndTimeout(filter FilterFunc, cmd string, data any, backFunc GetBackFunc, max int, timeout int) (count int) {
|
|
|
|
+ // 排除空频道
|
|
|
|
+ if filter == nil {
|
|
|
|
+ return 0
|
|
|
|
+ }
|
|
var reqData []byte
|
|
var reqData []byte
|
|
switch data := data.(type) {
|
|
switch data := data.(type) {
|
|
case []byte:
|
|
case []byte:
|
|
@@ -384,15 +390,11 @@ func (h *Hub) GetWithMaxAndTimeout(channel *regexp.Regexp, cmd string, data any,
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- // 排除空频道
|
|
|
|
- if channel == nil {
|
|
|
|
- return 0
|
|
|
|
- }
|
|
|
|
if timeout <= 0 {
|
|
if timeout <= 0 {
|
|
timeout = h.cf.ReadWait
|
|
timeout = h.cf.ReadWait
|
|
}
|
|
}
|
|
gd := &GetData{
|
|
gd := &GetData{
|
|
- Channel: channel,
|
|
|
|
|
|
+ Filter: filter,
|
|
Cmd: cmd,
|
|
Cmd: cmd,
|
|
Data: reqData,
|
|
Data: reqData,
|
|
Max: max,
|
|
Max: max,
|
|
@@ -443,21 +445,21 @@ func (h *Hub) GetWithMaxAndTimeout(channel *regexp.Regexp, cmd string, data any,
|
|
// 请求频道并获取数据,采用回调的方式返回结果
|
|
// 请求频道并获取数据,采用回调的方式返回结果
|
|
// 当前调用将会阻塞,直到命令都执行结束,最后返回执行的数量
|
|
// 当前调用将会阻塞,直到命令都执行结束,最后返回执行的数量
|
|
// 如果 backFunc 返回为 false 则提前结束
|
|
// 如果 backFunc 返回为 false 则提前结束
|
|
-func (h *Hub) Get(channel *regexp.Regexp, cmd string, data any, backFunc GetBack) (count int) {
|
|
|
|
- return h.GetWithMaxAndTimeout(channel, cmd, data, backFunc, 0, 0)
|
|
|
|
|
|
+func (h *Hub) Get(filter FilterFunc, cmd string, data any, backFunc GetBackFunc) (count int) {
|
|
|
|
+ return h.GetWithMaxAndTimeout(filter, cmd, data, backFunc, 0, 0)
|
|
}
|
|
}
|
|
|
|
|
|
// 只获取一个频道的数据,阻塞等待到默认超时间隔
|
|
// 只获取一个频道的数据,阻塞等待到默认超时间隔
|
|
// 如果没有结果将返回 NO_MATCH
|
|
// 如果没有结果将返回 NO_MATCH
|
|
-func (h *Hub) GetOne(channel *regexp.Regexp, cmd string, data any) (response *ResponseData) {
|
|
|
|
- h.GetWithMaxAndTimeout(channel, cmd, data, func(rp *ResponseData) (ok bool) {
|
|
|
|
|
|
+func (h *Hub) GetOne(filter FilterFunc, cmd string, data any) (response *ResponseData) {
|
|
|
|
+ h.GetWithMaxAndTimeout(filter, cmd, data, func(rp *ResponseData) (ok bool) {
|
|
response = rp
|
|
response = rp
|
|
return false
|
|
return false
|
|
}, 1, 0)
|
|
}, 1, 0)
|
|
if response == nil {
|
|
if response == nil {
|
|
response = &ResponseData{
|
|
response = &ResponseData{
|
|
State: config.CONNECT_NO_MATCH,
|
|
State: config.CONNECT_NO_MATCH,
|
|
- Data: fmt.Appendf(nil, "[%s] %s %s", config.CONNECT_NO_MATCH_MSG, channel.String(), cmd),
|
|
|
|
|
|
+ Data: fmt.Appendf(nil, "[%s] %s", config.CONNECT_NO_MATCH_MSG, cmd),
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return
|
|
return
|
|
@@ -465,29 +467,29 @@ func (h *Hub) GetOne(channel *regexp.Regexp, cmd string, data any) (response *Re
|
|
|
|
|
|
// 只获取一个频道的数据,阻塞等待到指定超时间隔
|
|
// 只获取一个频道的数据,阻塞等待到指定超时间隔
|
|
// 如果没有结果将返回 NO_MATCH
|
|
// 如果没有结果将返回 NO_MATCH
|
|
-func (h *Hub) GetOneWithTimeout(channel *regexp.Regexp, cmd string, data any, timeout int) (response *ResponseData) {
|
|
|
|
- h.GetWithMaxAndTimeout(channel, cmd, data, func(rp *ResponseData) (ok bool) {
|
|
|
|
|
|
+func (h *Hub) GetOneWithTimeout(filter FilterFunc, cmd string, data any, timeout int) (response *ResponseData) {
|
|
|
|
+ h.GetWithMaxAndTimeout(filter, cmd, data, func(rp *ResponseData) (ok bool) {
|
|
response = rp
|
|
response = rp
|
|
return false
|
|
return false
|
|
}, 1, timeout)
|
|
}, 1, timeout)
|
|
if response == nil {
|
|
if response == nil {
|
|
response = &ResponseData{
|
|
response = &ResponseData{
|
|
State: config.CONNECT_NO_MATCH,
|
|
State: config.CONNECT_NO_MATCH,
|
|
- Data: fmt.Appendf(nil, "[%s] %s %s", config.CONNECT_NO_MATCH_MSG, channel.String(), cmd),
|
|
|
|
|
|
+ Data: fmt.Appendf(nil, "[%s] %s", config.CONNECT_NO_MATCH_MSG, cmd),
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return
|
|
return
|
|
}
|
|
}
|
|
|
|
|
|
// 推送消息出去,不需要返回数据
|
|
// 推送消息出去,不需要返回数据
|
|
-func (h *Hub) Push(channel *regexp.Regexp, cmd string, data any) {
|
|
|
|
- h.PushWithMax(channel, cmd, data, 0)
|
|
|
|
|
|
+func (h *Hub) Push(filter FilterFunc, cmd string, data any) {
|
|
|
|
+ h.PushWithMax(filter, cmd, data, 0)
|
|
}
|
|
}
|
|
|
|
|
|
// 推送最大对应数量的消息出去,不需要返回数据
|
|
// 推送最大对应数量的消息出去,不需要返回数据
|
|
-func (h *Hub) PushWithMax(channel *regexp.Regexp, cmd string, data any, max int) {
|
|
|
|
|
|
+func (h *Hub) PushWithMax(filter FilterFunc, cmd string, data any, max int) {
|
|
// 排除空频道
|
|
// 排除空频道
|
|
- if channel == nil {
|
|
|
|
|
|
+ if filter == nil {
|
|
return
|
|
return
|
|
}
|
|
}
|
|
var reqData []byte
|
|
var reqData []byte
|
|
@@ -508,7 +510,7 @@ func (h *Hub) PushWithMax(channel *regexp.Regexp, cmd string, data any, max int)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
gd := &GetData{
|
|
gd := &GetData{
|
|
- Channel: channel,
|
|
|
|
|
|
+ Filter: filter,
|
|
Cmd: cmd,
|
|
Cmd: cmd,
|
|
Data: reqData,
|
|
Data: reqData,
|
|
Max: max,
|
|
Max: max,
|