type streamID … type streamMessage … type stream … func newStream(id streamID, send sender) *stream { … } func (s *stream) closeWithError(err error) error { … } func (s *stream) send(mt messageType, flags uint8, b []byte) error { … } func (s *stream) receive(ctx context.Context, msg *streamMessage) error { … } type sender …