zhangqian
2023-08-26 5193dcb9336e853502baf8a539d3f45efebe2f86
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package ws
 
import (
    "github.com/flipped-aurora/ws/core/biz"
    "github.com/flipped-aurora/ws/core/data"
    "github.com/gin-gonic/gin"
    "go.uber.org/zap"
    "nhooyr.io/websocket"
)
 
type wsPlugin struct {
    logger               *zap.Logger                       // 日志输出对象
    manageBuf            int64                             // buffer
    registeredMsgHandler map[int32]func(biz.IMessage) bool // 消息处理
    checkMap             map[string]biz.CheckFunc          // 用户校验
 
    admin     biz.IManage
    adminCase *biz.AdminCase
}
 
func DefaultRegisteredMsgHandler(admin biz.IManage, logger *zap.Logger) map[int32]func(biz.IMessage) bool {
    return map[int32]func(msg biz.IMessage) bool{
        1: func(msg biz.IMessage) bool {
            // w.admin 里面找到注册客户端的方法
            client, ok := admin.FindClient(msg.GetTo())
            if !ok {
                logger.Info("没有找到该用户")
                return false
            }
            return client.SendMes(msg)
        },
    }
}
 
func DefaultCheckMap() map[string]biz.CheckFunc {
    return map[string]biz.CheckFunc{
        "gva_ws": func(c interface{}) (string, bool) {
            // 先断言是gin.content
            cc, ok := c.(*gin.Context)
            if !ok {
                return "", false
            }
            token := cc.Query("jwt")
            // 可以携带jwt
            if len(token) == 0 {
                return "", false
            }
            // 解析 jwt...
 
            return token, true
        },
    }
}
 
func (w *wsPlugin) Register(g *gin.RouterGroup) {
    // gva_ws 为身份校验函数
    g.GET("/ws", w.adminCase.HandlerWS("gva_ws", &websocket.AcceptOptions{
        InsecureSkipVerify: true,
    }))
    g.POST("/sendMsg", w.adminCase.SendMsg("gva_ws"))
}
 
func (w *wsPlugin) RouterPath() string {
    return "gva_ws"
}
 
func GenerateWs(logger *zap.Logger, manageBuf int64, checkMap map[string]biz.CheckFunc) *wsPlugin {
    m := data.NewManage(manageBuf)
    t := data.NewTopic()
    h := data.NewHandle()
    admin := data.NewAdmin(m, t, h, logger)
    for s, checkFunc := range checkMap {
        admin.AddCheckFunc(s, checkFunc)
    }
    registeredMsgHandler := DefaultRegisteredMsgHandler(admin, logger)
 
    for key, handler := range registeredMsgHandler {
        admin.RegisteredMsgHandler(key, handler)
    }
    return &wsPlugin{
        logger: logger, manageBuf: manageBuf,
        registeredMsgHandler: registeredMsgHandler, checkMap: checkMap, admin: admin, adminCase: biz.NewAdmin(admin),
    }
}