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(), } }