Hunter0x7c7
2022-08-11 b8230139fb40edea387617b6accd8371e37eda58
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package pipe
 
import (
    "context"
 
    "github.com/v2fly/v2ray-core/v5/common/signal"
    "github.com/v2fly/v2ray-core/v5/common/signal/done"
    "github.com/v2fly/v2ray-core/v5/features/policy"
)
 
// Option for creating new Pipes.
type Option func(*pipeOption)
 
// WithoutSizeLimit returns an Option for Pipe to have no size limit.
func WithoutSizeLimit() Option {
    return func(opt *pipeOption) {
        opt.limit = -1
    }
}
 
// WithSizeLimit returns an Option for Pipe to have the given size limit.
func WithSizeLimit(limit int32) Option {
    return func(opt *pipeOption) {
        opt.limit = limit
    }
}
 
// DiscardOverflow returns an Option for Pipe to discard writes if full.
func DiscardOverflow() Option {
    return func(opt *pipeOption) {
        opt.discardOverflow = true
    }
}
 
// OptionsFromContext returns a list of Options from context.
func OptionsFromContext(ctx context.Context) []Option {
    var opt []Option
 
    bp := policy.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{
        readSignal:  signal.NewNotifier(),
        writeSignal: signal.NewNotifier(),
        done:        done.New(),
        option: pipeOption{
            limit: -1,
        },
    }
 
    for _, opt := range opts {
        opt(&(p.option))
    }
 
    return &Reader{
            pipe: p,
        }, &Writer{
            pipe: p,
        }
}