Files
slgserver/net/router.go
2025-11-18 18:08:48 +08:00

96 lines
1.9 KiB
Go

package net
import (
"encoding/json"
"log/slog"
"strings"
)
type HandlerFunc func(req *WsMsgReq, rsp *WsMsgRsp)
type MiddlewareFunc func(HandlerFunc) HandlerFunc
type Group struct {
prefix string
hMap map[string]HandlerFunc
hMapMidd map[string][]MiddlewareFunc
middleware []MiddlewareFunc
}
func (this *Group) AddRouter(name string, handlerFunc HandlerFunc, middleware ...MiddlewareFunc) {
this.hMap[name] = handlerFunc
this.hMapMidd[name] = middleware
}
func (this *Group) Use(middleware ...MiddlewareFunc) *Group {
this.middleware = append(this.middleware, middleware...)
return this
}
func (this *Group) applyMiddleware(name string) HandlerFunc {
h, ok := this.hMap[name]
if !ok {
//通配符
h, ok = this.hMap["*"]
}
if ok {
for i := len(this.middleware) - 1; i >= 0; i-- {
h = this.middleware[i](h)
}
for i := len(this.hMapMidd[name]) - 1; i >= 0; i-- {
h = this.hMapMidd[name][i](h)
}
}
return h
}
func (this *Group) exec(name string, req *WsMsgReq, rsp *WsMsgRsp) {
slog.Debug("route exec", "group", this.prefix, "name", name)
h := this.applyMiddleware(name)
if h == nil {
slog.Warn("Group has not",
"msgName", req.Body.Name)
} else {
h(req, rsp)
}
if dd, err := json.Marshal(rsp.Body); err == nil {
slog.Debug("route response", "group", this.prefix, "name", name, "size", len(dd))
}
}
type Router struct {
groups []*Group
}
func (this *Router) Group(prefix string) *Group {
g := &Group{prefix: prefix,
hMap: make(map[string]HandlerFunc),
hMapMidd: make(map[string][]MiddlewareFunc),
}
this.groups = append(this.groups, g)
return g
}
func (this *Router) Run(req *WsMsgReq, rsp *WsMsgRsp) {
name := req.Body.Name
msgName := name
sArr := strings.Split(name, ".")
prefix := ""
if len(sArr) == 2 {
prefix = sArr[0]
msgName = sArr[1]
}
for _, g := range this.groups {
if g.prefix == prefix {
g.exec(msgName, req, rsp)
} else if g.prefix == "*" {
g.exec(msgName, req, rsp)
}
}
}