summaryrefslogtreecommitdiffstats
path: root/vendor/gopkg.in/olahol/melody.v1/melody.go
diff options
context:
space:
mode:
authorWim <wim@42.be>2023-03-11 18:14:49 +0100
committerGitHub <noreply@github.com>2023-03-11 18:14:49 +0100
commit89e2dbac1504d6df205938df750fa9eb15996afd (patch)
tree51c94428af04fc882c5209e85afead9cf9a825f5 /vendor/gopkg.in/olahol/melody.v1/melody.go
parent356ada872c0e1564097e2f8165931fb8c9ee9d23 (diff)
downloadmatterbridge-msglm-89e2dbac1504d6df205938df750fa9eb15996afd.tar.gz
matterbridge-msglm-89e2dbac1504d6df205938df750fa9eb15996afd.tar.bz2
matterbridge-msglm-89e2dbac1504d6df205938df750fa9eb15996afd.zip
Check client disconnect to exit for loop (api). Fixes #1983 (#2012)
Also update to latest melody upstream
Diffstat (limited to 'vendor/gopkg.in/olahol/melody.v1/melody.go')
-rw-r--r--vendor/gopkg.in/olahol/melody.v1/melody.go313
1 files changed, 0 insertions, 313 deletions
diff --git a/vendor/gopkg.in/olahol/melody.v1/melody.go b/vendor/gopkg.in/olahol/melody.v1/melody.go
deleted file mode 100644
index 6e416b15..00000000
--- a/vendor/gopkg.in/olahol/melody.v1/melody.go
+++ /dev/null
@@ -1,313 +0,0 @@
-package melody
-
-import (
- "errors"
- "net/http"
- "sync"
-
- "github.com/gorilla/websocket"
-)
-
-// Close codes defined in RFC 6455, section 11.7.
-// Duplicate of codes from gorilla/websocket for convenience.
-const (
- CloseNormalClosure = 1000
- CloseGoingAway = 1001
- CloseProtocolError = 1002
- CloseUnsupportedData = 1003
- CloseNoStatusReceived = 1005
- CloseAbnormalClosure = 1006
- CloseInvalidFramePayloadData = 1007
- ClosePolicyViolation = 1008
- CloseMessageTooBig = 1009
- CloseMandatoryExtension = 1010
- CloseInternalServerErr = 1011
- CloseServiceRestart = 1012
- CloseTryAgainLater = 1013
- CloseTLSHandshake = 1015
-)
-
-// Duplicate of codes from gorilla/websocket for convenience.
-var validReceivedCloseCodes = map[int]bool{
- // see http://www.iana.org/assignments/websocket/websocket.xhtml#close-code-number
-
- CloseNormalClosure: true,
- CloseGoingAway: true,
- CloseProtocolError: true,
- CloseUnsupportedData: true,
- CloseNoStatusReceived: false,
- CloseAbnormalClosure: false,
- CloseInvalidFramePayloadData: true,
- ClosePolicyViolation: true,
- CloseMessageTooBig: true,
- CloseMandatoryExtension: true,
- CloseInternalServerErr: true,
- CloseServiceRestart: true,
- CloseTryAgainLater: true,
- CloseTLSHandshake: false,
-}
-
-type handleMessageFunc func(*Session, []byte)
-type handleErrorFunc func(*Session, error)
-type handleCloseFunc func(*Session, int, string) error
-type handleSessionFunc func(*Session)
-type filterFunc func(*Session) bool
-
-// Melody implements a websocket manager.
-type Melody struct {
- Config *Config
- Upgrader *websocket.Upgrader
- messageHandler handleMessageFunc
- messageHandlerBinary handleMessageFunc
- messageSentHandler handleMessageFunc
- messageSentHandlerBinary handleMessageFunc
- errorHandler handleErrorFunc
- closeHandler handleCloseFunc
- connectHandler handleSessionFunc
- disconnectHandler handleSessionFunc
- pongHandler handleSessionFunc
- hub *hub
-}
-
-// New creates a new melody instance with default Upgrader and Config.
-func New() *Melody {
- upgrader := &websocket.Upgrader{
- ReadBufferSize: 1024,
- WriteBufferSize: 1024,
- CheckOrigin: func(r *http.Request) bool { return true },
- }
-
- hub := newHub()
-
- go hub.run()
-
- return &Melody{
- Config: newConfig(),
- Upgrader: upgrader,
- messageHandler: func(*Session, []byte) {},
- messageHandlerBinary: func(*Session, []byte) {},
- messageSentHandler: func(*Session, []byte) {},
- messageSentHandlerBinary: func(*Session, []byte) {},
- errorHandler: func(*Session, error) {},
- closeHandler: nil,
- connectHandler: func(*Session) {},
- disconnectHandler: func(*Session) {},
- pongHandler: func(*Session) {},
- hub: hub,
- }
-}
-
-// HandleConnect fires fn when a session connects.
-func (m *Melody) HandleConnect(fn func(*Session)) {
- m.connectHandler = fn
-}
-
-// HandleDisconnect fires fn when a session disconnects.
-func (m *Melody) HandleDisconnect(fn func(*Session)) {
- m.disconnectHandler = fn
-}
-
-// HandlePong fires fn when a pong is received from a session.
-func (m *Melody) HandlePong(fn func(*Session)) {
- m.pongHandler = fn
-}
-
-// HandleMessage fires fn when a text message comes in.
-func (m *Melody) HandleMessage(fn func(*Session, []byte)) {
- m.messageHandler = fn
-}
-
-// HandleMessageBinary fires fn when a binary message comes in.
-func (m *Melody) HandleMessageBinary(fn func(*Session, []byte)) {
- m.messageHandlerBinary = fn
-}
-
-// HandleSentMessage fires fn when a text message is successfully sent.
-func (m *Melody) HandleSentMessage(fn func(*Session, []byte)) {
- m.messageSentHandler = fn
-}
-
-// HandleSentMessageBinary fires fn when a binary message is successfully sent.
-func (m *Melody) HandleSentMessageBinary(fn func(*Session, []byte)) {
- m.messageSentHandlerBinary = fn
-}
-
-// HandleError fires fn when a session has an error.
-func (m *Melody) HandleError(fn func(*Session, error)) {
- m.errorHandler = fn
-}
-
-// HandleClose sets the handler for close messages received from the session.
-// The code argument to h is the received close code or CloseNoStatusReceived
-// if the close message is empty. The default close handler sends a close frame
-// back to the session.
-//
-// The application must read the connection to process close messages as
-// described in the section on Control Frames above.
-//
-// The connection read methods return a CloseError when a close frame is
-// received. Most applications should handle close messages as part of their
-// normal error handling. Applications should only set a close handler when the
-// application must perform some action before sending a close frame back to
-// the session.
-func (m *Melody) HandleClose(fn func(*Session, int, string) error) {
- if fn != nil {
- m.closeHandler = fn
- }
-}
-
-// HandleRequest upgrades http requests to websocket connections and dispatches them to be handled by the melody instance.
-func (m *Melody) HandleRequest(w http.ResponseWriter, r *http.Request) error {
- return m.HandleRequestWithKeys(w, r, nil)
-}
-
-// 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")
- }
-
- conn, err := m.Upgrader.Upgrade(w, r, nil)
-
- if err != nil {
- return err
- }
-
- session := &Session{
- Request: r,
- Keys: keys,
- conn: conn,
- output: make(chan *envelope, m.Config.MessageBufferSize),
- melody: m,
- open: true,
- rwmutex: &sync.RWMutex{},
- }
-
- m.hub.register <- session
-
- m.connectHandler(session)
-
- go session.writePump()
-
- session.readPump()
-
- if !m.hub.closed() {
- m.hub.unregister <- session
- }
-
- session.close()
-
- m.disconnectHandler(session)
-
- return nil
-}
-
-// 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")
- }
-
- message := &envelope{t: websocket.TextMessage, msg: msg}
- m.hub.broadcast <- message
-
- return nil
-}
-
-// 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")
- }
-
- message := &envelope{t: websocket.TextMessage, msg: msg, filter: fn}
- m.hub.broadcast <- message
-
- return nil
-}
-
-// BroadcastOthers broadcasts a text message to all sessions except session s.
-func (m *Melody) BroadcastOthers(msg []byte, s *Session) error {
- return m.BroadcastFilter(msg, func(q *Session) bool {
- return s != q
- })
-}
-
-// BroadcastMultiple broadcasts a text message to multiple sessions given in the sessions slice.
-func (m *Melody) BroadcastMultiple(msg []byte, sessions []*Session) error {
- for _, sess := range sessions {
- if writeErr := sess.Write(msg); writeErr != nil {
- return writeErr
- }
- }
- return nil
-}
-
-// 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")
- }
-
- message := &envelope{t: websocket.BinaryMessage, msg: msg}
- m.hub.broadcast <- message
-
- return nil
-}
-
-// 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")
- }
-
- message := &envelope{t: websocket.BinaryMessage, msg: msg, filter: fn}
- m.hub.broadcast <- message
-
- return nil
-}
-
-// BroadcastBinaryOthers broadcasts a binary message to all sessions except session s.
-func (m *Melody) BroadcastBinaryOthers(msg []byte, s *Session) error {
- return m.BroadcastBinaryFilter(msg, func(q *Session) bool {
- return s != q
- })
-}
-
-// 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")
- }
-
- m.hub.exit <- &envelope{t: websocket.CloseMessage, msg: []byte{}}
-
- return nil
-}
-
-// CloseWithMsg closes the melody instance with the given close payload and all connected sessions.
-// 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")
- }
-
- m.hub.exit <- &envelope{t: websocket.CloseMessage, msg: msg}
-
- return nil
-}
-
-// Len return the number of connected sessions.
-func (m *Melody) Len() int {
- return m.hub.len()
-}
-
-// IsClosed returns the status of the melody instance.
-func (m *Melody) IsClosed() bool {
- return m.hub.closed()
-}
-
-// FormatCloseMessage formats closeCode and text as a WebSocket close message.
-func FormatCloseMessage(closeCode int, text string) []byte {
- return websocket.FormatCloseMessage(closeCode, text)
-}