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  }