listener.go 806 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. package pipelistener
  2. import (
  3. "io"
  4. "net"
  5. )
  6. var _ net.Listener = (*Listener)(nil)
  7. type Listener struct {
  8. pipe chan net.Conn
  9. done chan struct{}
  10. }
  11. func New(channelSize int) *Listener {
  12. return &Listener{
  13. pipe: make(chan net.Conn, channelSize),
  14. done: make(chan struct{}),
  15. }
  16. }
  17. func (l *Listener) Serve(conn net.Conn) {
  18. l.pipe <- conn
  19. }
  20. func (l *Listener) Accept() (net.Conn, error) {
  21. select {
  22. case conn := <-l.pipe:
  23. return conn, nil
  24. case <-l.done:
  25. return nil, io.ErrClosedPipe
  26. }
  27. }
  28. func (l *Listener) Close() error {
  29. select {
  30. case <-l.done:
  31. return io.ErrClosedPipe
  32. default:
  33. }
  34. close(l.done)
  35. return nil
  36. }
  37. func (l *Listener) Addr() net.Addr {
  38. return addr{}
  39. }
  40. type addr struct{}
  41. func (a addr) Network() string {
  42. return "pipe"
  43. }
  44. func (a addr) String() string {
  45. return "pipe"
  46. }