first commit

This commit is contained in:
2024-07-23 10:23:43 +08:00
commit 7b4c2521a3
126 changed files with 15931 additions and 0 deletions

View File

@ -0,0 +1,28 @@
package service
import (
"reflect"
)
var (
typeOfBytes = reflect.TypeOf(([]byte)(nil))
typeOfSession = reflect.TypeOf(NewSession(nil))
)
// 方法检测
func isHandlerMethod(method reflect.Method) bool {
mt := method.Type
if method.PkgPath != "" {
return false
}
if mt.NumIn() != 3 {
return false
}
if t1 := mt.In(1); t1.Kind() != reflect.Ptr || t1 != typeOfSession {
return false
}
if mt.In(2).Kind() != reflect.Ptr && mt.In(2) != typeOfBytes {
return false
}
return true
}

View File

@ -0,0 +1,19 @@
package service
import (
"github.com/gorilla/websocket"
"time"
)
type Session struct {
Conn *websocket.Conn
Time time.Time
}
func NewSession(conn *websocket.Conn) *Session {
s := &Session{
Conn: conn,
Time: time.Now(),
}
return s
}

View File

@ -0,0 +1,57 @@
package service
import (
"fmt"
"git.bvbej.com/bvbej/base-golang/pkg/websocket/codec"
"git.bvbej.com/bvbej/base-golang/pkg/websocket/util"
"reflect"
"strings"
)
type Handler struct {
Receiver reflect.Value // 值
Method reflect.Method // 方法
Type reflect.Type // 类型
IsRawArg bool // 数据是否需要序列化
}
func RegisterHandler(components ...any) map[string]*Handler {
methods := make(map[string]*Handler)
for _, component := range components {
rt := reflect.TypeOf(component)
rv := reflect.ValueOf(component)
typeName := reflect.Indirect(rv).Type().Name()
if typeName == "" {
continue
}
if !util.IsExported(typeName) {
continue
}
for m := 0; m < rt.NumMethod(); m++ {
method := rt.Method(m)
mt := method.Type
mn := method.Name
if isHandlerMethod(method) {
raw := false
if mt.In(2) == typeOfBytes {
raw = true
}
router := fmt.Sprintf("%s.%s", strings.ToLower(typeName), strings.ToLower(mn))
methods[router] = &Handler{
Receiver: rv,
Method: method,
Type: mt.In(2),
IsRawArg: raw,
}
}
}
}
for router, handler := range methods {
codec.RegisterMessage(router, handler.Type)
}
return methods
}