| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 | package kcpimport (	"io"	"sync"	"v2ray.com/core/common/alloc"	v2io "v2ray.com/core/common/io"	"v2ray.com/core/transport/internet")type SegmentWriter interface {	Write(seg Segment)}type BufferedSegmentWriter struct {	sync.Mutex	mtu    uint32	buffer *alloc.Buffer	writer v2io.Writer}func NewSegmentWriter(writer *AuthenticationWriter) *BufferedSegmentWriter {	return &BufferedSegmentWriter{		mtu:    writer.Mtu(),		writer: writer,	}}func (this *BufferedSegmentWriter) Write(seg Segment) {	this.Lock()	defer this.Unlock()	nBytes := seg.ByteSize()	if uint32(this.buffer.Len()+nBytes) > this.mtu {		this.FlushWithoutLock()	}	if this.buffer == nil {		this.buffer = alloc.NewLocalBuffer(2048).Clear()	}	this.buffer.Value = seg.Bytes(this.buffer.Value)}func (this *BufferedSegmentWriter) FlushWithoutLock() {	go this.writer.Write(this.buffer)	this.buffer = nil}func (this *BufferedSegmentWriter) Flush() {	this.Lock()	defer this.Unlock()	if this.buffer.Len() == 0 {		return	}	this.FlushWithoutLock()}type AuthenticationWriter struct {	Authenticator internet.Authenticator	Writer        io.Writer	Config        *Config}func (this *AuthenticationWriter) Write(payload *alloc.Buffer) error {	defer payload.Release()	this.Authenticator.Seal(payload)	_, err := this.Writer.Write(payload.Value)	return err}func (this *AuthenticationWriter) Release() {}func (this *AuthenticationWriter) Mtu() uint32 {	return this.Config.Mtu.GetValue() - uint32(this.Authenticator.Overhead())}
 |