func (w *watchV2) Send(s Response) error {
	w.mu.RLock()
	defer w.mu.RUnlock()
	if w.closed {
		return nil
	}
	select {
	case <-w.out:
		w.scope.Counter(metrics.OrchestratorWatchDequeued).Inc(1)
	default:
	}
	select {
	case w.out <- &gcpv2.PassthroughResponse{DiscoveryResponse: s.Get().V2, Request: s.GetRequest().V2}:
		return nil
	default:
		return fmt.Errorf("channel is blocked")
	}
}
Send sends the xds response over wire
package transport
import (
	"fmt"
	"sync"
	gcpv2 "github.com/envoyproxy/go-control-plane/pkg/cache/v2"
	"github.com/uber-go/tally"
	"github.com/envoyproxy/xds-relay/internal/app/metrics"
)
var _ Watch = &watchV2{}
type watchV2 struct {
	out    chan gcpv2.Response
	mu     sync.RWMutex
	closed bool
	scope tally.Scope
}
func newWatchV2(scope tally.Scope) Watch {
	return &watchV2{
		out:   make(chan gcpv2.Response, 1),
		scope: scope,
	}
}
func (w *watchV2) Close() {
	w.mu.Lock()
	defer w.mu.Unlock()
	w.closed = true
	close(w.out)
}
func (w *watchV2) GetChannel() *ChannelVersion {
	return &ChannelVersion{V2: w.out}
}