github.com/status-im/status-go@v1.1.0/protocol/subscription/subscription.go (about)

     1  package subscription
     2  
     3  import (
     4  	"sync"
     5  )
     6  
     7  type Subscription struct {
     8  	sync.RWMutex
     9  
    10  	err  error
    11  	done chan struct{}
    12  }
    13  
    14  func New() *Subscription {
    15  	return &Subscription{
    16  		done: make(chan struct{}),
    17  	}
    18  }
    19  
    20  func (s *Subscription) Cancel(err error) {
    21  	s.Lock()
    22  	defer s.Unlock()
    23  
    24  	if s.done == nil {
    25  		return
    26  	}
    27  
    28  	close(s.done)
    29  	s.done = nil
    30  	s.err = err
    31  }
    32  
    33  func (s *Subscription) Unsubscribe() {
    34  	s.Lock()
    35  	defer s.Unlock()
    36  
    37  	if s.done == nil {
    38  		return
    39  	}
    40  
    41  	close(s.done)
    42  	s.done = nil
    43  }
    44  
    45  func (s *Subscription) Err() error {
    46  	s.RLock()
    47  	defer s.RUnlock()
    48  	return s.err
    49  }
    50  
    51  func (s *Subscription) Done() <-chan struct{} {
    52  	s.RLock()
    53  	defer s.RUnlock()
    54  	return s.done
    55  }