github.com/philippseith/signalr@v0.6.3/netconnection.go (about)

     1  package signalr
     2  
     3  import (
     4  	"context"
     5  	"crypto/rand"
     6  	"encoding/base64"
     7  	"fmt"
     8  	"net"
     9  	"time"
    10  )
    11  
    12  type netConnection struct {
    13  	ConnectionBase
    14  	conn net.Conn
    15  }
    16  
    17  // NewNetConnection wraps net.Conn into a Connection
    18  func NewNetConnection(ctx context.Context, conn net.Conn) Connection {
    19  	netConn := &netConnection{
    20  		ConnectionBase: *NewConnectionBase(ctx, getConnectionID()),
    21  		conn:           conn,
    22  	}
    23  	go func() {
    24  		<-ctx.Done()
    25  		_ = conn.Close()
    26  	}()
    27  	return netConn
    28  }
    29  
    30  func (nc *netConnection) Write(p []byte) (n int, err error) {
    31  	n, err = ReadWriteWithContext(nc.Context(),
    32  		func() (int, error) { return nc.conn.Write(p) },
    33  		func() { _ = nc.conn.SetWriteDeadline(time.Now()) })
    34  	if err != nil {
    35  		err = fmt.Errorf("%T: %w", nc, err)
    36  	}
    37  	return n, err
    38  }
    39  
    40  func (nc *netConnection) Read(p []byte) (n int, err error) {
    41  	n, err = ReadWriteWithContext(nc.Context(),
    42  		func() (int, error) { return nc.conn.Read(p) },
    43  		func() { _ = nc.conn.SetReadDeadline(time.Now()) })
    44  	if err != nil {
    45  		err = fmt.Errorf("%T: %w", nc, err)
    46  	}
    47  	return n, err
    48  }
    49  
    50  func getConnectionID() string {
    51  	bytes := make([]byte, 16)
    52  	_, _ = rand.Read(bytes)
    53  	return base64.StdEncoding.EncodeToString(bytes)
    54  }