diff --git a/errors.go b/errors.go new file mode 100644 index 0000000..d8be615 --- /dev/null +++ b/errors.go @@ -0,0 +1,10 @@ +package melody + +import "errors" + +var ( + ErrClosed = errors.New("melody instance is closed") + ErrSessionClosed = errors.New("session is closed") + ErrWriteClosed = errors.New("tried to write to closed a session") + ErrMessageBufferFull = errors.New("session message buffer is full") +) diff --git a/melody.go b/melody.go index 6123e77..e78055a 100644 --- a/melody.go +++ b/melody.go @@ -1,7 +1,6 @@ package melody import ( - "errors" "net/http" "sync" @@ -164,7 +163,7 @@ func (m *Melody) HandleRequest(w http.ResponseWriter, r *http.Request) error { // HandleRequestWithKeys does the same as HandleRequest but populates session.Keys with keys. func (m *Melody) HandleRequestWithKeys(w http.ResponseWriter, r *http.Request, keys map[string]interface{}) error { if m.hub.closed() { - return errors.New("melody instance is closed") + return ErrClosed } conn, err := m.Upgrader.Upgrade(w, r, w.Header()) @@ -206,7 +205,7 @@ func (m *Melody) HandleRequestWithKeys(w http.ResponseWriter, r *http.Request, k // Broadcast broadcasts a text message to all sessions. func (m *Melody) Broadcast(msg []byte) error { if m.hub.closed() { - return errors.New("melody instance is closed") + return ErrClosed } message := &envelope{t: websocket.TextMessage, msg: msg} @@ -218,7 +217,7 @@ func (m *Melody) Broadcast(msg []byte) error { // BroadcastFilter broadcasts a text message to all sessions that fn returns true for. func (m *Melody) BroadcastFilter(msg []byte, fn func(*Session) bool) error { if m.hub.closed() { - return errors.New("melody instance is closed") + return ErrClosed } message := &envelope{t: websocket.TextMessage, msg: msg, filter: fn} @@ -247,7 +246,7 @@ func (m *Melody) BroadcastMultiple(msg []byte, sessions []*Session) error { // BroadcastBinary broadcasts a binary message to all sessions. func (m *Melody) BroadcastBinary(msg []byte) error { if m.hub.closed() { - return errors.New("melody instance is closed") + return ErrClosed } message := &envelope{t: websocket.BinaryMessage, msg: msg} @@ -259,7 +258,7 @@ func (m *Melody) BroadcastBinary(msg []byte) error { // BroadcastBinaryFilter broadcasts a binary message to all sessions that fn returns true for. func (m *Melody) BroadcastBinaryFilter(msg []byte, fn func(*Session) bool) error { if m.hub.closed() { - return errors.New("melody instance is closed") + return ErrClosed } message := &envelope{t: websocket.BinaryMessage, msg: msg, filter: fn} @@ -278,7 +277,7 @@ func (m *Melody) BroadcastBinaryOthers(msg []byte, s *Session) error { // Close closes the melody instance and all connected sessions. func (m *Melody) Close() error { if m.hub.closed() { - return errors.New("melody instance is already closed") + return ErrClosed } m.hub.exit <- &envelope{t: websocket.CloseMessage, msg: []byte{}} @@ -290,7 +289,7 @@ func (m *Melody) Close() error { // Use the FormatCloseMessage function to format a proper close message payload. func (m *Melody) CloseWithMsg(msg []byte) error { if m.hub.closed() { - return errors.New("melody instance is already closed") + return ErrClosed } m.hub.exit <- &envelope{t: websocket.CloseMessage, msg: msg} diff --git a/session.go b/session.go index c34a785..2870591 100644 --- a/session.go +++ b/session.go @@ -1,7 +1,6 @@ package melody import ( - "errors" "net/http" "sync" "time" @@ -23,20 +22,20 @@ type Session struct { func (s *Session) writeMessage(message *envelope) { if s.closed() { - s.melody.errorHandler(s, errors.New("tried to write to closed a session")) + s.melody.errorHandler(s, ErrWriteClosed) return } select { case s.output <- message: default: - s.melody.errorHandler(s, errors.New("session message buffer is full")) + s.melody.errorHandler(s, ErrMessageBufferFull) } } func (s *Session) writeRaw(message *envelope) error { if s.closed() { - return errors.New("tried to write to a closed session") + return ErrWriteClosed } s.conn.SetWriteDeadline(time.Now().Add(s.melody.Config.WriteWait)) @@ -144,7 +143,7 @@ func (s *Session) readPump() { // Write writes message to session. func (s *Session) Write(msg []byte) error { if s.closed() { - return errors.New("session is closed") + return ErrSessionClosed } s.writeMessage(&envelope{t: websocket.TextMessage, msg: msg}) @@ -155,7 +154,7 @@ func (s *Session) Write(msg []byte) error { // WriteBinary writes a binary message to session. func (s *Session) WriteBinary(msg []byte) error { if s.closed() { - return errors.New("session is closed") + return ErrSessionClosed } s.writeMessage(&envelope{t: websocket.BinaryMessage, msg: msg}) @@ -166,7 +165,7 @@ func (s *Session) WriteBinary(msg []byte) error { // Close closes session. func (s *Session) Close() error { if s.closed() { - return errors.New("session is already closed") + return ErrSessionClosed } s.writeMessage(&envelope{t: websocket.CloseMessage, msg: []byte{}}) @@ -178,7 +177,7 @@ func (s *Session) Close() error { // Use the FormatCloseMessage function to format a proper close message payload. func (s *Session) CloseWithMsg(msg []byte) error { if s.closed() { - return errors.New("session is already closed") + return ErrSessionClosed } s.writeMessage(&envelope{t: websocket.CloseMessage, msg: msg})