| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 | 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)func WithoutSizeLimit() Option {	return func(p *pipe) {		p.limit = -1	}}func WithSizeLimit(limit int32) Option {	return func(p *pipe) {		p.limit = limit	}}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()	}}
 |