2020-02-12 16:39:57 +00:00
|
|
|
package core
|
2020-02-10 09:23:10 +00:00
|
|
|
|
|
|
|
import (
|
2021-03-30 19:40:02 +00:00
|
|
|
"github.com/cadmium-im/zirconium-go/core/models"
|
2020-02-10 09:23:10 +00:00
|
|
|
"github.com/google/logger"
|
|
|
|
"github.com/google/uuid"
|
|
|
|
"github.com/gorilla/websocket"
|
|
|
|
)
|
|
|
|
|
2021-04-06 13:55:41 +00:00
|
|
|
type SessionManager struct {
|
2021-03-30 19:40:02 +00:00
|
|
|
router *Router
|
|
|
|
connections map[string]*Session
|
2020-02-10 09:23:10 +00:00
|
|
|
}
|
|
|
|
|
2021-04-06 13:55:41 +00:00
|
|
|
func NewSessionManager(r *Router) *SessionManager {
|
|
|
|
return &SessionManager{
|
2021-03-30 19:40:02 +00:00
|
|
|
router: r,
|
|
|
|
connections: make(map[string]*Session),
|
2020-02-10 10:44:40 +00:00
|
|
|
}
|
2020-02-10 09:23:10 +00:00
|
|
|
}
|
|
|
|
|
2021-04-06 13:55:41 +00:00
|
|
|
func (ch *SessionManager) HandleNewConnection(wsocket *websocket.Conn) {
|
|
|
|
randomUUID := uuid.New().String()
|
2021-03-30 19:40:02 +00:00
|
|
|
o := &Session{
|
2020-02-10 09:23:10 +00:00
|
|
|
wsConn: wsocket,
|
2021-04-06 13:55:41 +00:00
|
|
|
connID: randomUUID,
|
2020-02-10 09:23:10 +00:00
|
|
|
}
|
|
|
|
ch.connections[o.connID] = o
|
|
|
|
go func() {
|
|
|
|
for {
|
|
|
|
var msg models.BaseMessage
|
|
|
|
err := o.wsConn.ReadJSON(&msg)
|
|
|
|
if err != nil {
|
|
|
|
delete(ch.connections, o.connID)
|
2021-03-30 19:40:02 +00:00
|
|
|
_ = o.wsConn.Close()
|
2020-02-10 09:23:10 +00:00
|
|
|
logger.Infof("Connection %s was closed. (Reason: %s)", o.connID, err.Error())
|
|
|
|
break
|
|
|
|
}
|
2021-03-30 19:40:02 +00:00
|
|
|
ch.router.RouteMessage(o, msg)
|
2020-02-10 09:23:10 +00:00
|
|
|
}
|
|
|
|
}()
|
2020-02-10 10:55:43 +00:00
|
|
|
logger.Infof("Connection %s was created", o.connID)
|
2020-02-10 09:23:10 +00:00
|
|
|
}
|