status-im/status-go

View on GitHub
services/wallet/connection/status.go

Summary

Maintainability
A
0 mins
Test Coverage
B
89%
package connection

import (
    "sync"
    "time"
)

type Connectable interface {
    SetIsConnected(bool)
    IsConnected() bool
}

type StateChangeCb func(State)

type Status struct {
    stateChangeCb StateChangeCb
    state         State
    stateLock     sync.RWMutex
}

func NewStatus() *Status {
    return &Status{
        state: NewState(),
    }
}

func (c *Status) SetStateChangeCb(stateChangeCb StateChangeCb) {
    c.stateChangeCb = stateChangeCb
}

func (c *Status) SetIsConnected(value bool) {
    now := time.Now().Unix()

    state := c.GetState()
    state.LastCheckedAt = now
    if value {
        state.LastSuccessAt = now
    }
    if value {
        state.Value = StateValueConnected
    } else {
        state.Value = StateValueDisconnected
    }

    c.SetState(state)
}

func (c *Status) ResetStateValue() {
    state := c.GetState()
    state.Value = StateValueUnknown
    c.SetState(state)
}

func (c *Status) GetState() State {
    c.stateLock.RLock()
    defer c.stateLock.RUnlock()

    return c.state
}

func (c *Status) SetState(state State) {
    c.stateLock.Lock()
    isStateChange := c.state.Value != state.Value
    c.state = state
    c.stateLock.Unlock()

    if isStateChange && c.stateChangeCb != nil {
        c.stateChangeCb(state)
    }
}

func (c *Status) GetStateValue() StateValue {
    return c.GetState().Value
}

func (c *Status) IsConnected() bool {
    return c.GetStateValue() == StateValueConnected
}