wshandler와 분리 중
This commit is contained in:
@ -9,6 +9,7 @@ import (
|
||||
"reflect"
|
||||
"strings"
|
||||
|
||||
"repositories.action2quare.com/ayo/gocommon"
|
||||
common "repositories.action2quare.com/ayo/gocommon"
|
||||
"repositories.action2quare.com/ayo/gocommon/logger"
|
||||
"repositories.action2quare.com/ayo/gocommon/wshandler"
|
||||
@ -71,41 +72,12 @@ func readBsonDoc(r io.Reader, src any) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
type rpcCallDomain[T any] struct {
|
||||
rpcCallChanName string
|
||||
caller rpc.RpcCaller
|
||||
callee rpc.RpcCallee[T]
|
||||
methods map[string]reflect.Method
|
||||
}
|
||||
|
||||
func createRpcCallDomain[CalleeType any](syncConn *redis.Client, creator func(*wshandler.Richconn) *CalleeType) rpcCallDomain[CalleeType] {
|
||||
var tmp *CalleeType
|
||||
methods := make(map[string]reflect.Method)
|
||||
tp := reflect.TypeOf(tmp)
|
||||
for i := 0; i < tp.NumMethod(); i++ {
|
||||
method := tp.Method(i)
|
||||
methods[method.Name] = method
|
||||
}
|
||||
|
||||
rpcChanName := "conn_rpc_channel_" + tp.Name()
|
||||
publishFunc := func(bt []byte) error {
|
||||
_, err := syncConn.Publish(context.Background(), rpcChanName, bt).Result()
|
||||
return err
|
||||
}
|
||||
|
||||
return rpcCallDomain[CalleeType]{
|
||||
rpcCallChanName: rpcChanName,
|
||||
caller: rpc.NewRpcCaller(publishFunc),
|
||||
callee: rpc.NewRpcCallee(creator),
|
||||
methods: methods,
|
||||
}
|
||||
}
|
||||
|
||||
type TavernConfig struct {
|
||||
common.RegionStorageConfig `json:",inline"`
|
||||
|
||||
GroupTypes map[string]*groupConfig `json:"tavern_group_types"`
|
||||
MaingateApiToken string `json:"maingate_api_token"`
|
||||
RedisURL string `json:"tavern_redis_url"`
|
||||
macAddr string
|
||||
}
|
||||
|
||||
@ -122,7 +94,8 @@ type subTavern struct {
|
||||
region string
|
||||
groups map[string]group
|
||||
methods map[string]reflect.Method
|
||||
wshRpc rpcCallDomain[richConnOuter]
|
||||
|
||||
redisClient *redis.Client
|
||||
}
|
||||
|
||||
func getMacAddr() (string, error) {
|
||||
@ -190,12 +163,18 @@ type groupPipelineDocument struct {
|
||||
}
|
||||
|
||||
func (tv *Tavern) prepare(ctx context.Context) error {
|
||||
redisClient, err := gocommon.NewRedisClient(config.RedisURL, 0)
|
||||
if err != nil {
|
||||
logger.Error("config tavern_redis_url is not valid or missing")
|
||||
return err
|
||||
}
|
||||
|
||||
for region, url := range config.RegionStorage {
|
||||
var dbconn common.MongoClient
|
||||
var err error
|
||||
var groupinstance group
|
||||
|
||||
if err := rpc.IsCallerCalleeMethodMatch[richConnOuter](); err != nil {
|
||||
if err := rpc.IsCallerCalleeMethodMatch[connection](); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@ -212,25 +191,23 @@ func (tv *Tavern) prepare(ctx context.Context) error {
|
||||
mongoClient: dbconn,
|
||||
region: region,
|
||||
methods: methods,
|
||||
redisClient: redisClient,
|
||||
}
|
||||
|
||||
sub.wshRpc = createRpcCallDomain(tv.wsh.RedisSync, func(rc *wshandler.Richconn) *richConnOuter {
|
||||
return &richConnOuter{wsh: sub.wsh, rc: rc}
|
||||
})
|
||||
|
||||
groups := make(map[string]group)
|
||||
for typename, cfg := range config.GroupTypes {
|
||||
cfg.Name = typename
|
||||
if cfg.Transient {
|
||||
groupinstance, err = cfg.prepareInMemory(ctx, region, typename, tv.wsh)
|
||||
} else {
|
||||
if !dbconn.Connected() {
|
||||
dbconn, err = common.NewMongoClient(ctx, url.Mongo, region)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
groupinstance, err = cfg.preparePersistent(ctx, region, dbconn, tv.wsh)
|
||||
// TODO : db
|
||||
// if !dbconn.Connected() {
|
||||
// dbconn, err = common.NewMongoClient(ctx, url.Mongo, region)
|
||||
// if err != nil {
|
||||
// return err
|
||||
// }
|
||||
// }
|
||||
// groupinstance, err = cfg.preparePersistent(ctx, region, dbconn, tv.wsh)
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
@ -246,9 +223,6 @@ func (tv *Tavern) prepare(ctx context.Context) error {
|
||||
}
|
||||
|
||||
func (tv *Tavern) RegisterHandlers(ctx context.Context, serveMux *http.ServeMux, prefix string) error {
|
||||
// request는 항상 서비스 서버를 거쳐서 들어온다. [client] <--tls--> [service server] <--http--> tavern
|
||||
// 클라이언트는 tavern으로부터 메시지를 수신할 뿐, 송신하지 못한다.
|
||||
// 단, 요청은 https 서비스 서버를 통해 들어오고 클라이언트는 ws으로 수신만 한다는 원칙이 유지되어야 한다.(채팅 메시지는 예외?)
|
||||
for _, sub := range tv.subTaverns {
|
||||
var pattern string
|
||||
if sub.region == "default" {
|
||||
|
||||
Reference in New Issue
Block a user