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 }