| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 | package pipeimport (	"context"	"v2ray.com/core"	"v2ray.com/core/common/signal"	"v2ray.com/core/common/signal/done")// Option for creating new Pipes.type Option func(*pipe)// WithoutSizeLimit returns an Option for Pipe to have no size limit.func WithoutSizeLimit() Option {	return func(p *pipe) {		p.limit = -1	}}// WithSizeLimit returns an Option for Pipe to have the given size limit.func WithSizeLimit(limit int32) Option {	return func(p *pipe) {		p.limit = limit	}}// DiscardOverflow returns an Option for Pipe to discard writes if full.func DiscardOverflow() Option {	return func(p *pipe) {		p.discardOverflow = true	}}// OptionsFromContext returns a list of Options from context.func OptionsFromContext(ctx context.Context) []Option {	var opt []Option	bp := core.BufferPolicyFromContext(ctx)	if bp.PerConnection >= 0 {		opt = append(opt, WithSizeLimit(bp.PerConnection))	} else {		opt = append(opt, WithoutSizeLimit())	}	return opt}// New creates a new Reader and Writer that connects to each other.func New(opts ...Option) (*Reader, *Writer) {	p := &pipe{		limit:       -1,		readSignal:  signal.NewNotifier(),		writeSignal: signal.NewNotifier(),		done:        done.New(),	}	for _, opt := range opts {		opt(p)	}	return &Reader{			pipe: p,		}, &Writer{			pipe: p,		}}type closeError interface {	CloseError()}// CloseError invokes CloseError() method if the object is either Reader or Writer.func CloseError(v interface{}) {	if c, ok := v.(closeError); ok {		c.CloseError()	}}
 |