github.com/status-im/status-go@v1.1.0/services/wallet/connection/status.go (about)

     1  package connection
     2  
     3  import (
     4  	"sync"
     5  	"time"
     6  )
     7  
     8  type Connectable interface {
     9  	SetIsConnected(bool)
    10  	IsConnected() bool
    11  }
    12  
    13  type StateChangeCb func(State)
    14  
    15  type Status struct {
    16  	stateChangeCb StateChangeCb
    17  	state         State
    18  	stateLock     sync.RWMutex
    19  }
    20  
    21  func NewStatus() *Status {
    22  	return &Status{
    23  		state: NewState(),
    24  	}
    25  }
    26  
    27  func (c *Status) SetStateChangeCb(stateChangeCb StateChangeCb) {
    28  	c.stateChangeCb = stateChangeCb
    29  }
    30  
    31  func (c *Status) SetIsConnected(value bool) {
    32  	now := time.Now().Unix()
    33  
    34  	state := c.GetState()
    35  	state.LastCheckedAt = now
    36  	if value {
    37  		state.LastSuccessAt = now
    38  	}
    39  	if value {
    40  		state.Value = StateValueConnected
    41  	} else {
    42  		state.Value = StateValueDisconnected
    43  	}
    44  
    45  	c.SetState(state)
    46  }
    47  
    48  func (c *Status) ResetStateValue() {
    49  	state := c.GetState()
    50  	state.Value = StateValueUnknown
    51  	c.SetState(state)
    52  }
    53  
    54  func (c *Status) GetState() State {
    55  	c.stateLock.RLock()
    56  	defer c.stateLock.RUnlock()
    57  
    58  	return c.state
    59  }
    60  
    61  func (c *Status) SetState(state State) {
    62  	c.stateLock.Lock()
    63  	isStateChange := c.state.Value != state.Value
    64  	c.state = state
    65  	c.stateLock.Unlock()
    66  
    67  	if isStateChange && c.stateChangeCb != nil {
    68  		c.stateChangeCb(state)
    69  	}
    70  }
    71  
    72  func (c *Status) GetStateValue() StateValue {
    73  	return c.GetState().Value
    74  }
    75  
    76  func (c *Status) IsConnected() bool {
    77  	return c.GetStateValue() == StateValueConnected
    78  }