github.com/philippseith/signalr@v0.6.3/websocketconnection.go (about) 1 package signalr 2 3 import ( 4 "bytes" 5 "context" 6 "fmt" 7 8 "nhooyr.io/websocket" 9 ) 10 11 type webSocketConnection struct { 12 ConnectionBase 13 conn *websocket.Conn 14 transferMode TransferMode 15 } 16 17 func newWebSocketConnection(ctx context.Context, connectionID string, conn *websocket.Conn) *webSocketConnection { 18 w := &webSocketConnection{ 19 conn: conn, 20 ConnectionBase: *NewConnectionBase(ctx, connectionID), 21 } 22 return w 23 } 24 25 func (w *webSocketConnection) Write(p []byte) (n int, err error) { 26 messageType := websocket.MessageText 27 if w.transferMode == BinaryTransferMode { 28 messageType = websocket.MessageBinary 29 } 30 n, err = ReadWriteWithContext(w.Context(), 31 func() (int, error) { 32 err := w.conn.Write(w.Context(), messageType, p) 33 if err != nil { 34 return 0, err 35 } 36 return len(p), nil 37 }, 38 func() {}) 39 if err != nil { 40 err = fmt.Errorf("%T: %w", w, err) 41 _ = w.conn.Close(1000, err.Error()) 42 } 43 return n, err 44 } 45 46 func (w *webSocketConnection) Read(p []byte) (n int, err error) { 47 n, err = ReadWriteWithContext(w.Context(), 48 func() (int, error) { 49 _, data, err := w.conn.Read(w.Context()) 50 if err != nil { 51 return 0, err 52 } 53 return bytes.NewReader(data).Read(p) 54 }, 55 func() {}) 56 if err != nil { 57 err = fmt.Errorf("%T: %w", w, err) 58 _ = w.conn.Close(1000, err.Error()) 59 } 60 return n, err 61 } 62 63 func (w *webSocketConnection) TransferMode() TransferMode { 64 return w.transferMode 65 } 66 67 func (w *webSocketConnection) SetTransferMode(transferMode TransferMode) { 68 w.transferMode = transferMode 69 }