pipe.go 963 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. package pipe
  2. import (
  3. "v2ray.com/core/common/platform"
  4. "v2ray.com/core/common/signal"
  5. )
  6. type Option func(*pipe)
  7. func WithoutSizeLimit() Option {
  8. return func(p *pipe) {
  9. p.limit = -1
  10. }
  11. }
  12. func WithSizeLimit(limit int32) Option {
  13. return func(p *pipe) {
  14. p.limit = limit
  15. }
  16. }
  17. func New(opts ...Option) (*Reader, *Writer) {
  18. p := &pipe{
  19. limit: defaultLimit,
  20. readSignal: signal.NewNotifier(),
  21. writeSignal: signal.NewNotifier(),
  22. }
  23. for _, opt := range opts {
  24. opt(p)
  25. }
  26. return &Reader{
  27. pipe: p,
  28. }, &Writer{
  29. pipe: p,
  30. }
  31. }
  32. type closeError interface {
  33. CloseError()
  34. }
  35. func CloseError(v interface{}) {
  36. if c, ok := v.(closeError); ok {
  37. c.CloseError()
  38. }
  39. }
  40. var defaultLimit int32 = 10 * 1024 * 1024
  41. func init() {
  42. const raySizeEnvKey = "v2ray.ray.buffer.size"
  43. size := platform.EnvFlag{
  44. Name: raySizeEnvKey,
  45. AltName: platform.NormalizeEnvName(raySizeEnvKey),
  46. }.GetValueAsInt(10)
  47. defaultLimit = int32(size) * 1024 * 1024
  48. }