SendCloseMessage 추가

This commit is contained in:
2023-07-06 20:37:32 +09:00
parent ba746d03fa
commit b85d271efe

View File

@ -9,6 +9,7 @@ import (
"net/http" "net/http"
"strings" "strings"
"sync" "sync"
"time"
"go.mongodb.org/mongo-driver/bson/primitive" "go.mongodb.org/mongo-driver/bson/primitive"
"repositories.action2quare.com/ayo/gocommon" "repositories.action2quare.com/ayo/gocommon"
@ -44,11 +45,12 @@ type CommandType string
const ( const (
CommandType_JoinRoom = CommandType("join_room") CommandType_JoinRoom = CommandType("join_room")
CommandType_LeaveRoom = CommandType("leave_room") CommandType_LeaveRoom = CommandType("leave_room")
CommandType_WriteControl = CommandType("write_control")
) )
type CommandMessage struct { type CommandMessage struct {
Cmd CommandType Cmd CommandType
Args []string Args []any
} }
type WebSocketMessageType int type WebSocketMessageType int
@ -177,6 +179,20 @@ func (ws *WebsocketHandler) SendUpstreamMessage(region string, msg *UpstreamMess
} }
} }
func (ws *WebsocketHandler) SendCloseMessage(region string, target string, text string) {
sh := ws.authCaches[region]
if sh != nil {
sh.localDeliveryChan <- &CommandMessage{
Cmd: CommandType_WriteControl,
Args: []any{
target,
int(websocket.CloseMessage),
websocket.FormatCloseMessage(websocket.CloseNormalClosure, text),
},
}
}
}
func (sh *subhandler) mainLoop(ctx context.Context) { func (sh *subhandler) mainLoop(ctx context.Context) {
defer func() { defer func() {
s := recover() s := recover()
@ -257,8 +273,8 @@ func (sh *subhandler) mainLoop(ctx context.Context) {
case *CommandMessage: case *CommandMessage:
if usermsg.Cmd == CommandType_JoinRoom && len(usermsg.Args) == 2 { if usermsg.Cmd == CommandType_JoinRoom && len(usermsg.Args) == 2 {
alias := usermsg.Args[0] alias := usermsg.Args[0].(string)
roomName := usermsg.Args[1] roomName := usermsg.Args[1].(string)
conn := entireConns[alias] conn := entireConns[alias]
if conn != nil { if conn != nil {
@ -266,8 +282,8 @@ func (sh *subhandler) mainLoop(ctx context.Context) {
break break
} }
} else if usermsg.Cmd == CommandType_LeaveRoom && len(usermsg.Args) == 2 { } else if usermsg.Cmd == CommandType_LeaveRoom && len(usermsg.Args) == 2 {
alias := usermsg.Args[0] alias := usermsg.Args[0].(string)
roomName := usermsg.Args[1] roomName := usermsg.Args[1].(string)
conn := entireConns[alias] conn := entireConns[alias]
if conn != nil { if conn != nil {
@ -276,6 +292,12 @@ func (sh *subhandler) mainLoop(ctx context.Context) {
break break
} }
} }
} else if usermsg.Cmd == CommandType_WriteControl && len(usermsg.Args) == 2 {
alias := usermsg.Args[0].(string)
conn := entireConns[alias]
if conn != nil {
conn.WriteControl(usermsg.Args[1].(int), usermsg.Args[2].([]byte), time.Time{})
}
} }
// 위에서 break 안걸리면 나한테 없으므로 publish를 해야 함. 그러면 다른 호스트가 deliveryChan으로 받는다 // 위에서 break 안걸리면 나한테 없으므로 publish를 해야 함. 그러면 다른 호스트가 deliveryChan으로 받는다
@ -303,16 +325,16 @@ func (sh *subhandler) mainLoop(ctx context.Context) {
case *CommandMessage: case *CommandMessage:
if usermsg.Cmd == CommandType_JoinRoom && len(usermsg.Args) == 2 { if usermsg.Cmd == CommandType_JoinRoom && len(usermsg.Args) == 2 {
alias := usermsg.Args[0] alias := usermsg.Args[0].(string)
roomName := usermsg.Args[1] roomName := usermsg.Args[1].(string)
conn := entireConns[alias] conn := entireConns[alias]
if conn != nil { if conn != nil {
findRoom(roomName, true).in(conn) findRoom(roomName, true).in(conn)
} }
} else if usermsg.Cmd == CommandType_LeaveRoom && len(usermsg.Args) == 2 { } else if usermsg.Cmd == CommandType_LeaveRoom && len(usermsg.Args) == 2 {
alias := usermsg.Args[0] alias := usermsg.Args[0].(string)
roomName := usermsg.Args[1] roomName := usermsg.Args[1].(string)
conn := entireConns[alias] conn := entireConns[alias]
if conn != nil { if conn != nil {