diff --git a/wshandler/wshandler.go b/wshandler/wshandler.go index ae73ddf..e8597e3 100644 --- a/wshandler/wshandler.go +++ b/wshandler/wshandler.go @@ -50,6 +50,20 @@ type CommandMessage struct { 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 { name string authCache *gocommon.AuthCollection @@ -58,8 +72,7 @@ type subhandler struct { redisSync *redis.Client connInOutChan chan *wsconn deliveryChan chan any - - callReceiver func(primitive.ObjectID, string, io.Reader) + callReceiver WebSocketMessageReceiver } // WebsocketHandler : @@ -72,7 +85,7 @@ type wsConfig struct { 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 gocommon.LoadConfig(&config) @@ -81,20 +94,20 @@ func NewWebsocketHandler[T any](authglobal gocommon.AuthCollectionGlobal, receiv panic(err) } - decoder := func(r io.Reader) *T { - if r == nil { - // 접속이 끊겼을 때. - return nil - } - var m T - dec := json.NewDecoder(r) - if err := dec.Decode(&m); err != nil { - logger.Println(err) - } + // decoder := func(r io.Reader) *T { + // if r == nil { + // // 접속이 끊겼을 때. + // return nil + // } + // var m T + // dec := json.NewDecoder(r) + // if err := dec.Decode(&m); err != nil { + // logger.Println(err) + // } - // decoding 실패하더라도 빈 *T를 내보냄 - return &m - } + // // decoding 실패하더라도 빈 *T를 내보냄 + // return &m + // } authCaches := make(map[string]*subhandler) for _, region := range authglobal.Regions() { @@ -106,9 +119,7 @@ func NewWebsocketHandler[T any](authglobal gocommon.AuthCollectionGlobal, receiv redisSync: redisSync, connInOutChan: make(chan *wsconn), deliveryChan: make(chan any, 1000), - callReceiver: func(accid primitive.ObjectID, alias string, r io.Reader) { - receiver(accid, alias, decoder(r)) - }, + callReceiver: receiver, } authCaches[region] = sh @@ -254,7 +265,7 @@ func (sh *subhandler) mainLoop(ctx context.Context) { for _, room := range rooms { room.out(c) } - sh.callReceiver(c.accid, c.alias, nil) + sh.callReceiver(c.accid, c.alias, Connected, nil) } else { entireConns[c.alias] = c } @@ -285,7 +296,9 @@ func upgrade_core(sh *subhandler, conn *websocket.Conn, accid primitive.ObjectID 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())