|
@@ -34,10 +34,11 @@ type Hub struct {
|
|
|
sync.Mutex
|
|
|
cf *config.Config
|
|
|
globalID uint16
|
|
|
- channel string // 本地频道信息
|
|
|
- connects sync.Map // map[*Line]bool(true) //记录当前的连接,方便查找
|
|
|
- subscribes sync.Map // [cmd]->[]*SubscribeData //注册绑定频道的函数,用于响应请求
|
|
|
- msgCache sync.Map // map[uint16]*GetMsg //请求的回应记录,key为id
|
|
|
+ channel string // 本地频道信息
|
|
|
+ middle []MiddleFunc // 中间件
|
|
|
+ connects sync.Map // map[*Line]bool(true) //记录当前的连接,方便查找
|
|
|
+ subscribes sync.Map // [cmd]->[]*SubscribeData //注册绑定频道的函数,用于响应请求
|
|
|
+ msgCache sync.Map // map[uint16]*GetMsg //请求的回应记录,key为id
|
|
|
|
|
|
// 客户端需要用的函数
|
|
|
connectHostFunc ConnectHostFunc // 获取对应频道的一个连接地址
|
|
@@ -92,6 +93,11 @@ func (h *Hub) GetID() uint16 {
|
|
|
return h.globalID
|
|
|
}
|
|
|
|
|
|
+// 添加中间件
|
|
|
+func (h *Hub) UseMiddle(middleFunc MiddleFunc) {
|
|
|
+ h.middle = append(h.middle, middleFunc)
|
|
|
+}
|
|
|
+
|
|
|
// 注册频道,其中频道为正则表达式字符串
|
|
|
func (h *Hub) Subscribe(channel *regexp.Regexp, cmd string, backFunc SubscribeBack) (err error) {
|
|
|
if channel == nil {
|
|
@@ -265,6 +271,17 @@ func (h *Hub) requestFromNet(request *RequestData) {
|
|
|
cmd := request.Cmd
|
|
|
channel := request.conn.channel
|
|
|
log.Println("[REQU]<-", channel, "["+cmd+"]", subStr(string(request.Data), 200))
|
|
|
+ // 执行中间件
|
|
|
+ for _, mdFunc := range h.middle {
|
|
|
+ rsp := mdFunc(request)
|
|
|
+ if rsp != nil {
|
|
|
+ if request.Id != 0 {
|
|
|
+ rsp.Id = request.Id
|
|
|
+ request.conn.sendResponse <- rsp
|
|
|
+ }
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
sub, ok := h.subscribes.Load(cmd)
|
|
|
if ok {
|
|
|
subs := sub.([]*SubscribeData)
|
|
@@ -668,6 +685,7 @@ func NewHub(
|
|
|
h = &Hub{
|
|
|
cf: cf,
|
|
|
channel: channel,
|
|
|
+ middle: make([]MiddleFunc, 0),
|
|
|
connectHostFunc: connectHostFunc,
|
|
|
authFunc: authFunc,
|
|
|
checkAuthFunc: checkAuthFunc,
|