diff options
Diffstat (limited to 'server')
| -rw-r--r-- | server/server/server.go | 1 | ||||
| -rw-r--r-- | server/session/session.go | 14 |
2 files changed, 13 insertions, 2 deletions
diff --git a/server/server/server.go b/server/server/server.go index a5dd510..115fe74 100644 --- a/server/server/server.go +++ b/server/server/server.go @@ -111,6 +111,7 @@ func handleConn(conn net.Conn, rq chan<- session.Request, } conn.Close() close(send) + s.Close() disconnects <- s }() diff --git a/server/session/session.go b/server/session/session.go index cd36a7b..b6f9e5d 100644 --- a/server/session/session.go +++ b/server/session/session.go @@ -2,12 +2,14 @@ package session import ( "citrons.xyz/talk/proto" + "sync/atomic" ) type Session struct { send chan<- proto.Line UserId string subscribedTo map[*Stream]bool + disconnected atomic.Bool } func NewSession(send chan<- proto.Line) *Session { @@ -18,7 +20,9 @@ func NewSession(send chan<- proto.Line) *Session { } func (s *Session) Event(ev proto.Command) { - s.send <- proto.Line {'*', "", ev} + if !s.disconnected.Load() { + s.send <- proto.Line {'*', "", ev} + } } func (s *Session) Subscriptions() map[*Stream]bool { @@ -40,6 +44,10 @@ func (s *Session) Unsubscribe(to *Stream) { } } +func (s *Session) Close() { + s.disconnected.Store(true) +} + type Stream struct { subscribers map[*Session]bool } @@ -67,7 +75,9 @@ type Request struct { } func (r Request) Reply(reply proto.Command) { - r.From.send <- proto.Line {'!', r.RequestId, reply} + if !r.From.disconnected.Load() { + r.From.send <- proto.Line {'!', r.RequestId, reply} + } } func (r Request) ReplyOk() { |
