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 }