util.go
func newDelimitedReader(r io.Reader, maxSize int) *delimitedReader {
	return &delimitedReader{r: r, buf: pool.Get(maxSize)}
}
func newDelimitedReader(r io.Reader, maxSize int) *delimitedReader {
	return &delimitedReader{r: r, buf: pool.Get(maxSize)}
}
func newDelimitedReader ( r io . Reader , maxSize int ) * delimitedReader { return & delimitedReader { r : r , buf : pool . Get ( maxSize ) } }
// The gogo protobuf NewDelimitedReader is buffered, which may eat up stream data.
// So we need to implement a compatible delimited reader that reads unbuffered.
// There is a slowdown from unbuffered reading: when reading the message
// it can take multiple single byte Reads to read the length and another Read
// to read the message payload.
// However, this is not critical performance degradation as
// - the reader is utilized to read one (dialer, stop) or two messages (hop) during
//   the handshake, so it's a drop in the water for the connection lifetime.
// - messages are small (max 4k) and the length fits in a couple of bytes,
//   so overall we have at most three reads per message.
The gogo protobuf NewDelimitedReader is buffered which may eat up stream data . So we need to implement a compatible delimited reader that reads unbuffered . There is a slowdown from unbuffered reading : when reading the message it can take multiple single byte Reads to read the length and another Read to read the message payload . However this is not critical performance degradation as - the reader is utilized to read one ( dialer stop ) or two messages ( hop ) during the handshake so it s a drop in the water for the connection lifetime . - messages are small ( max 4k ) and the length fits in a couple of bytes so overall we have at most three reads per message .