pipe.go 828 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  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. var defaultLimit int32 = 10 * 1024 * 1024
  33. func init() {
  34. const raySizeEnvKey = "v2ray.ray.buffer.size"
  35. size := platform.EnvFlag{
  36. Name: raySizeEnvKey,
  37. AltName: platform.NormalizeEnvName(raySizeEnvKey),
  38. }.GetValueAsInt(10)
  39. defaultLimit = int32(size) * 1024 * 1024
  40. }