github.com/nsqio/nsq@v1.3.0/internal/protocol/protocol.go (about)

     1  package protocol
     2  
     3  import (
     4  	"encoding/binary"
     5  	"io"
     6  	"net"
     7  )
     8  
     9  type Client interface {
    10  	Close() error
    11  }
    12  
    13  // Protocol describes the basic behavior of any protocol in the system
    14  type Protocol interface {
    15  	NewClient(net.Conn) Client
    16  	IOLoop(Client) error
    17  }
    18  
    19  // SendResponse is a server side utility function to prefix data with a length header
    20  // and write to the supplied Writer
    21  func SendResponse(w io.Writer, data []byte) (int, error) {
    22  	err := binary.Write(w, binary.BigEndian, int32(len(data)))
    23  	if err != nil {
    24  		return 0, err
    25  	}
    26  
    27  	n, err := w.Write(data)
    28  	if err != nil {
    29  		return 0, err
    30  	}
    31  
    32  	return (n + 4), nil
    33  }
    34  
    35  // SendFramedResponse is a server side utility function to prefix data with a length header
    36  // and frame header and write to the supplied Writer
    37  func SendFramedResponse(w io.Writer, frameType int32, data []byte) (int, error) {
    38  	beBuf := make([]byte, 4)
    39  	size := uint32(len(data)) + 4
    40  
    41  	binary.BigEndian.PutUint32(beBuf, size)
    42  	n, err := w.Write(beBuf)
    43  	if err != nil {
    44  		return n, err
    45  	}
    46  
    47  	binary.BigEndian.PutUint32(beBuf, uint32(frameType))
    48  	n, err = w.Write(beBuf)
    49  	if err != nil {
    50  		return n + 4, err
    51  	}
    52  
    53  	n, err = w.Write(data)
    54  	return n + 8, err
    55  }