first commit
This commit is contained in:
28
pkg/websocket/client/service/method.go
Normal file
28
pkg/websocket/client/service/method.go
Normal 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
|
||||
}
|
19
pkg/websocket/client/service/peer.go
Normal file
19
pkg/websocket/client/service/peer.go
Normal 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
|
||||
}
|
57
pkg/websocket/client/service/receiver.go
Normal file
57
pkg/websocket/client/service/receiver.go
Normal 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
|
||||
}
|
Reference in New Issue
Block a user