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 }