| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 | 
							- package mux
 
- import (
 
- 	"io"
 
- 	"github.com/xtls/xray-core/common/buf"
 
- 	"github.com/xtls/xray-core/common/crypto"
 
- 	"github.com/xtls/xray-core/common/errors"
 
- 	"github.com/xtls/xray-core/common/net"
 
- 	"github.com/xtls/xray-core/common/serial"
 
- )
 
- // PacketReader is an io.Reader that reads whole chunk of Mux frames every time.
 
- type PacketReader struct {
 
- 	reader io.Reader
 
- 	eof    bool
 
- 	dest   *net.Destination
 
- }
 
- // NewPacketReader creates a new PacketReader.
 
- func NewPacketReader(reader io.Reader, dest *net.Destination) *PacketReader {
 
- 	return &PacketReader{
 
- 		reader: reader,
 
- 		eof:    false,
 
- 		dest:   dest,
 
- 	}
 
- }
 
- // ReadMultiBuffer implements buf.Reader.
 
- func (r *PacketReader) ReadMultiBuffer() (buf.MultiBuffer, error) {
 
- 	if r.eof {
 
- 		return nil, io.EOF
 
- 	}
 
- 	size, err := serial.ReadUint16(r.reader)
 
- 	if err != nil {
 
- 		return nil, err
 
- 	}
 
- 	if size > buf.Size {
 
- 		return nil, errors.New("packet size too large: ", size)
 
- 	}
 
- 	b := buf.New()
 
- 	if _, err := b.ReadFullFrom(r.reader, int32(size)); err != nil {
 
- 		b.Release()
 
- 		return nil, err
 
- 	}
 
- 	r.eof = true
 
- 	if r.dest != nil && r.dest.Network == net.Network_UDP {
 
- 		b.UDP = r.dest
 
- 	}
 
- 	return buf.MultiBuffer{b}, nil
 
- }
 
- // NewStreamReader creates a new StreamReader.
 
- func NewStreamReader(reader *buf.BufferedReader) buf.Reader {
 
- 	return crypto.NewChunkStreamReaderWithChunkCount(crypto.PlainChunkSizeParser{}, reader, 1)
 
- }
 
 
  |