| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 | package ioimport (	"io"	"v2ray.com/core/common"	"v2ray.com/core/common/buf")// Writer extends io.Writer with alloc.Buffer.type Writer interface {	common.Releasable	// Write writes an alloc.Buffer into underlying writer.	Write(*buf.Buffer) error}// AdaptiveWriter is a Writer that writes alloc.Buffer into underlying writer.type AdaptiveWriter struct {	writer io.Writer}// NewAdaptiveWriter creates a new AdaptiveWriter.func NewAdaptiveWriter(writer io.Writer) *AdaptiveWriter {	return &AdaptiveWriter{		writer: writer,	}}// Write implements Writer.Write(). Write() takes ownership of the given buffer.func (v *AdaptiveWriter) Write(buffer *buf.Buffer) error {	defer buffer.Release()	for {		nBytes, err := v.writer.Write(buffer.Bytes())		if err != nil {			return err		}		if nBytes == buffer.Len() {			break		}		buffer.SliceFrom(nBytes)	}	return nil}// Release implements Releasable.Release().func (v *AdaptiveWriter) Release() {	v.writer = nil}
 |