receiver 타입 변경

This commit is contained in:
2023-07-06 12:35:39 +09:00
parent 7ef3e68d16
commit 2b54d69b9e

View File

@ -50,6 +50,20 @@ type CommandMessage struct {
Args []string Args []string
} }
type WebSocketMessageType int
const (
TextMessage = WebSocketMessageType(websocket.TextMessage)
BinaryMessage = WebSocketMessageType(websocket.BinaryMessage)
CloseMessage = WebSocketMessageType(websocket.CloseMessage)
PingMessage = WebSocketMessageType(websocket.PingMessage)
PongMessage = WebSocketMessageType(websocket.PongMessage)
Connected = WebSocketMessageType(100)
Disconnected = WebSocketMessageType(101)
)
type WebSocketMessageReceiver func(accid primitive.ObjectID, alias string, messageType WebSocketMessageType, body io.Reader)
type subhandler struct { type subhandler struct {
name string name string
authCache *gocommon.AuthCollection authCache *gocommon.AuthCollection
@ -58,8 +72,7 @@ type subhandler struct {
redisSync *redis.Client redisSync *redis.Client
connInOutChan chan *wsconn connInOutChan chan *wsconn
deliveryChan chan any deliveryChan chan any
callReceiver WebSocketMessageReceiver
callReceiver func(primitive.ObjectID, string, io.Reader)
} }
// WebsocketHandler : // WebsocketHandler :
@ -72,7 +85,7 @@ type wsConfig struct {
SyncPipeline string `json:"ws_sync_pipeline"` SyncPipeline string `json:"ws_sync_pipeline"`
} }
func NewWebsocketHandler[T any](authglobal gocommon.AuthCollectionGlobal, receiver func(primitive.ObjectID, string, *T)) (wsh *WebsocketHandler) { func NewWebsocketHandler(authglobal gocommon.AuthCollectionGlobal, receiver WebSocketMessageReceiver) (wsh *WebsocketHandler) {
var config wsConfig var config wsConfig
gocommon.LoadConfig(&config) gocommon.LoadConfig(&config)
@ -81,20 +94,20 @@ func NewWebsocketHandler[T any](authglobal gocommon.AuthCollectionGlobal, receiv
panic(err) panic(err)
} }
decoder := func(r io.Reader) *T { // decoder := func(r io.Reader) *T {
if r == nil { // if r == nil {
// 접속이 끊겼을 때. // // 접속이 끊겼을 때.
return nil // return nil
} // }
var m T // var m T
dec := json.NewDecoder(r) // dec := json.NewDecoder(r)
if err := dec.Decode(&m); err != nil { // if err := dec.Decode(&m); err != nil {
logger.Println(err) // logger.Println(err)
} // }
// decoding 실패하더라도 빈 *T를 내보냄 // // decoding 실패하더라도 빈 *T를 내보냄
return &m // return &m
} // }
authCaches := make(map[string]*subhandler) authCaches := make(map[string]*subhandler)
for _, region := range authglobal.Regions() { for _, region := range authglobal.Regions() {
@ -106,9 +119,7 @@ func NewWebsocketHandler[T any](authglobal gocommon.AuthCollectionGlobal, receiv
redisSync: redisSync, redisSync: redisSync,
connInOutChan: make(chan *wsconn), connInOutChan: make(chan *wsconn),
deliveryChan: make(chan any, 1000), deliveryChan: make(chan any, 1000),
callReceiver: func(accid primitive.ObjectID, alias string, r io.Reader) { callReceiver: receiver,
receiver(accid, alias, decoder(r))
},
} }
authCaches[region] = sh authCaches[region] = sh
@ -254,7 +265,7 @@ func (sh *subhandler) mainLoop(ctx context.Context) {
for _, room := range rooms { for _, room := range rooms {
room.out(c) room.out(c)
} }
sh.callReceiver(c.accid, c.alias, nil) sh.callReceiver(c.accid, c.alias, Connected, nil)
} else { } else {
entireConns[c.alias] = c entireConns[c.alias] = c
} }
@ -285,7 +296,9 @@ func upgrade_core(sh *subhandler, conn *websocket.Conn, accid primitive.ObjectID
if messageType == websocket.TextMessage { if messageType == websocket.TextMessage {
// 유저가 직접 보낸 메시지 // 유저가 직접 보낸 메시지
sh.callReceiver(accid, c.alias, r) sh.callReceiver(accid, c.alias, TextMessage, r)
} else if messageType == websocket.BinaryMessage {
sh.callReceiver(accid, c.alias, BinaryMessage, r)
} }
} }
sh.redisSync.HDel(context.Background(), sh.name, accid.Hex()) sh.redisSync.HDel(context.Background(), sh.name, accid.Hex())