gotunnelserver/server/session.go

66 lines
1.1 KiB
Go

package server
import (
"context"
"git.pyer.club/kingecg/goemitter"
"git.pyer.club/kingecg/gotunnelserver/util"
"github.com/gorilla/websocket"
)
type Session struct {
Id string
conn *websocket.Conn
ctx context.Context
cancel context.CancelFunc
*goemitter.EventEmitter
}
type Command struct {
Type int `json:"type"`
Payload map[string]string `json:"payload"`
}
func (s *Session) Send(cmd *Command) (err error) {
return s.conn.WriteJSON(cmd)
}
func (s *Session) Close() {
s.conn.Close()
}
func (s *Session) Start() {
s.ctx, s.cancel = context.WithCancel(context.Background())
go func() {
defer s.conn.Close()
for {
var cmd Command
err := s.conn.ReadJSON(&cmd)
if err != nil {
return
}
if cmd.Type == util.NewConnection {
s.Emit("NewSession", cmd.Payload)
}
select {
case <-s.ctx.Done():
return
default:
continue
}
}
}()
}
func (s *Session) Stop() {
s.cancel()
}
func NewSession(conn *websocket.Conn) *Session {
return &Session{
conn: conn,
Id: util.GenRandomstring(16),
EventEmitter: goemitter.NewEmitter(),
}
}