웹 소켓 접속 종료 시그니쳐 변경
This commit is contained in:
@ -18,11 +18,12 @@ const (
|
|||||||
|
|
||||||
type apiFuncType func(ApiCallContext)
|
type apiFuncType func(ApiCallContext)
|
||||||
type connFuncType func(*websocket.Conn, *Sender)
|
type connFuncType func(*websocket.Conn, *Sender)
|
||||||
|
type disconnFuncType func(string, *Sender)
|
||||||
|
|
||||||
type WebsocketApiHandler struct {
|
type WebsocketApiHandler struct {
|
||||||
methods map[string]apiFuncType
|
methods map[string]apiFuncType
|
||||||
connfunc connFuncType
|
connfunc connFuncType
|
||||||
disconnfunc connFuncType
|
disconnfunc disconnFuncType
|
||||||
originalReceiverName string
|
originalReceiverName string
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -40,7 +41,7 @@ func MakeWebsocketApiHandler[T any](receiver *T, receiverName string) WebsocketA
|
|||||||
}
|
}
|
||||||
|
|
||||||
var connfunc connFuncType
|
var connfunc connFuncType
|
||||||
var disconnfunc connFuncType
|
var disconnfunc disconnFuncType
|
||||||
|
|
||||||
for i := 0; i < tp.NumMethod(); i++ {
|
for i := 0; i < tp.NumMethod(); i++ {
|
||||||
method := tp.Method(i)
|
method := tp.Method(i)
|
||||||
@ -70,7 +71,7 @@ func MakeWebsocketApiHandler[T any](receiver *T, receiverName string) WebsocketA
|
|||||||
if method.Type.NumIn() != 3 {
|
if method.Type.NumIn() != 3 {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if method.Type.In(1) != reflect.TypeOf((*websocket.Conn)(nil)) {
|
if method.Type.In(1) != reflect.TypeOf("") {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if method.Type.In(2) != reflect.TypeOf((*Sender)(nil)) {
|
if method.Type.In(2) != reflect.TypeOf((*Sender)(nil)) {
|
||||||
@ -79,10 +80,10 @@ func MakeWebsocketApiHandler[T any](receiver *T, receiverName string) WebsocketA
|
|||||||
funcptr := method.Func.Pointer()
|
funcptr := method.Func.Pointer()
|
||||||
p1 := unsafe.Pointer(&funcptr)
|
p1 := unsafe.Pointer(&funcptr)
|
||||||
p2 := unsafe.Pointer(&p1)
|
p2 := unsafe.Pointer(&p1)
|
||||||
disconnfuncptr := (*func(*T, *websocket.Conn, *Sender))(p2)
|
disconnfuncptr := (*func(*T, string, *Sender))(p2)
|
||||||
|
|
||||||
disconnfunc = func(c *websocket.Conn, s *Sender) {
|
disconnfunc = func(msg string, s *Sender) {
|
||||||
(*disconnfuncptr)(receiver, c, s)
|
(*disconnfuncptr)(receiver, msg, s)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if method.Type.NumIn() != 2 {
|
if method.Type.NumIn() != 2 {
|
||||||
@ -114,7 +115,7 @@ type WebsocketApiBroker struct {
|
|||||||
methods map[string]apiFuncType
|
methods map[string]apiFuncType
|
||||||
methods_dup map[string][]apiFuncType
|
methods_dup map[string][]apiFuncType
|
||||||
connFuncs []connFuncType
|
connFuncs []connFuncType
|
||||||
disconnFuncs []connFuncType
|
disconnFuncs []disconnFuncType
|
||||||
}
|
}
|
||||||
|
|
||||||
func (hc *WebsocketApiBroker) AddHandler(receiver WebsocketApiHandler) {
|
func (hc *WebsocketApiBroker) AddHandler(receiver WebsocketApiHandler) {
|
||||||
@ -148,7 +149,7 @@ func (hc *WebsocketApiBroker) AddHandler(receiver WebsocketApiHandler) {
|
|||||||
if receiver.disconnfunc != nil {
|
if receiver.disconnfunc != nil {
|
||||||
// disconnfunc은 역순
|
// disconnfunc은 역순
|
||||||
logger.Printf("ws api registered : %s.ClientDisconnected\n", receiver.originalReceiverName)
|
logger.Printf("ws api registered : %s.ClientDisconnected\n", receiver.originalReceiverName)
|
||||||
hc.disconnFuncs = append([]connFuncType{receiver.disconnfunc}, hc.disconnFuncs...)
|
hc.disconnFuncs = append([]disconnFuncType{receiver.disconnfunc}, hc.disconnFuncs...)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -160,7 +161,7 @@ func (hc *WebsocketApiBroker) ClientConnected(c *wsconn) {
|
|||||||
|
|
||||||
func (hc *WebsocketApiBroker) ClientDisconnected(c *wsconn) {
|
func (hc *WebsocketApiBroker) ClientDisconnected(c *wsconn) {
|
||||||
for _, v := range hc.disconnFuncs {
|
for _, v := range hc.disconnFuncs {
|
||||||
v(c.Conn, c.sender)
|
v(c.closeMessage, c.sender)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -30,6 +30,7 @@ var noAuthFlag = flagx.Bool("noauth", false, "")
|
|||||||
type wsconn struct {
|
type wsconn struct {
|
||||||
*websocket.Conn
|
*websocket.Conn
|
||||||
sender *Sender
|
sender *Sender
|
||||||
|
closeMessage string
|
||||||
}
|
}
|
||||||
|
|
||||||
type UpstreamMessage struct {
|
type UpstreamMessage struct {
|
||||||
@ -455,11 +456,16 @@ func upgrade_core(ws *WebsocketHandler, conn *websocket.Conn, accid primitive.Ob
|
|||||||
for {
|
for {
|
||||||
messageType, r, err := c.NextReader()
|
messageType, r, err := c.NextReader()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
if ce, ok := err.(*websocket.CloseError); ok {
|
||||||
|
c.closeMessage = ce.Text
|
||||||
|
}
|
||||||
c.Close()
|
c.Close()
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
if messageType == websocket.CloseMessage {
|
if messageType == websocket.CloseMessage {
|
||||||
|
closeMsg, _ := io.ReadAll(r)
|
||||||
|
logger.Println("close message :", string(closeMsg))
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user