세션 해제 콜백 추가

This commit is contained in:
2023-12-25 22:06:57 +09:00
parent 08802176cb
commit 46f7d358ed
6 changed files with 110 additions and 27 deletions

View File

@ -86,9 +86,7 @@ type send_msg_queue_elem struct {
msg []byte
}
type WebsocketHandler struct {
WebsocketApiBroker
type websocketHandlerBase struct {
redisMsgChanName string
redisCmdChanName string
redisSync *redis.Client
@ -101,6 +99,11 @@ type WebsocketHandler struct {
sessionConsumer session.Consumer
}
type WebsocketHandler struct {
WebsocketApiBroker
websocketHandlerBase
}
type wsConfig struct {
gocommon.StorageAddr `json:"storage"`
}
@ -152,14 +155,16 @@ func NewWebsocketHandler(consumer session.Consumer, redisUrl string) (*Websocket
}()
return &WebsocketHandler{
redisMsgChanName: fmt.Sprintf("_wsh_msg_%d", redisSync.Options().DB),
redisCmdChanName: fmt.Sprintf("_wsh_cmd_%d", redisSync.Options().DB),
redisSync: redisSync,
connInOutChan: make(chan *wsconn),
deliveryChan: make(chan any, 1000),
localDeliveryChan: make(chan any, 100),
sendMsgChan: sendchan,
sessionConsumer: consumer,
websocketHandlerBase: websocketHandlerBase{
redisMsgChanName: fmt.Sprintf("_wsh_msg_%d", redisSync.Options().DB),
redisCmdChanName: fmt.Sprintf("_wsh_cmd_%d", redisSync.Options().DB),
redisSync: redisSync,
connInOutChan: make(chan *wsconn),
deliveryChan: make(chan any, 1000),
localDeliveryChan: make(chan any, 100),
sendMsgChan: sendchan,
sessionConsumer: consumer,
},
}, nil
}

View File

@ -22,10 +22,22 @@ type WebsocketPeerHandler interface {
RegisterHandlers(serveMux *http.ServeMux, prefix string) error
}
type connEstChannelValue struct {
accid primitive.ObjectID
conn *websocket.Conn
}
type connDisChannelValue struct {
accid primitive.ObjectID
closed bool
}
type websocketPeerHandler[T PeerInterface] struct {
methods map[string]peerApiFuncType[T]
createPeer func(primitive.ObjectID) T
sessionConsumer session.Consumer
connEstChannel chan connEstChannelValue
connDisChannel chan connDisChannelValue
}
type PeerInterface interface {
@ -140,14 +152,28 @@ func NewWebsocketPeerHandler[T PeerInterface](consumer session.Consumer, creator
methods[k] = v
}
return &websocketPeerHandler[T]{
wsh := &websocketPeerHandler[T]{
sessionConsumer: consumer,
methods: methods,
createPeer: creator,
connEstChannel: make(chan connEstChannelValue),
connDisChannel: make(chan connDisChannelValue),
}
consumer.RegisterOnSessionInvalidated(wsh.onSessionInvalidated)
return wsh
}
func (ws *websocketPeerHandler[T]) onSessionInvalidated(accid primitive.ObjectID) {
ws.connDisChannel <- connDisChannelValue{
accid: accid,
closed: false,
}
}
func (ws *websocketPeerHandler[T]) RegisterHandlers(serveMux *http.ServeMux, prefix string) error {
go ws.sessionMonitoring()
if *noAuthFlag {
serveMux.HandleFunc(prefix, ws.upgrade_nosession)
} else {
@ -157,14 +183,33 @@ func (ws *websocketPeerHandler[T]) RegisterHandlers(serveMux *http.ServeMux, pre
return nil
}
func (ws *websocketPeerHandler[T]) sessionMonitoring() {
all := make(map[primitive.ObjectID]*websocket.Conn)
for {
select {
case estVal := <-ws.connEstChannel:
all[estVal.accid] = estVal.conn
case disVal := <-ws.connDisChannel:
if disVal.closed {
delete(all, disVal.accid)
} else if c := all[disVal.accid]; c != nil {
c.Close()
delete(all, disVal.accid)
}
}
}
}
func (ws *websocketPeerHandler[T]) upgrade_core(conn *websocket.Conn, accid primitive.ObjectID, nonce uint32) {
go func(c *websocket.Conn, accid primitive.ObjectID) {
peer := ws.createPeer(accid)
var closeReason string
peer.ClientConnected(conn)
ws.connEstChannel <- connEstChannelValue{accid: accid, conn: conn}
defer func() {
ws.connDisChannel <- connDisChannelValue{accid: accid, closed: true}
peer.ClientDisconnected(closeReason)
}()