github.com/status-im/status-go@v1.1.0/services/updates/api.go (about)

     1  package updates
     2  
     3  import (
     4  	"context"
     5  	"encoding/json"
     6  	"fmt"
     7  	"io/ioutil"
     8  	"net/http"
     9  	"time"
    10  
    11  	"github.com/hashicorp/go-version"
    12  	"go.uber.org/zap"
    13  
    14  	"github.com/ethereum/go-ethereum/log"
    15  	"github.com/status-im/status-go/services/ens"
    16  	"github.com/status-im/status-go/signal"
    17  )
    18  
    19  func NewAPI(ensService *ens.Service) *API {
    20  	return &API{
    21  		ensService: ensService,
    22  		httpClient: &http.Client{Timeout: time.Minute},
    23  	}
    24  }
    25  
    26  type API struct {
    27  	ensService *ens.Service
    28  	httpClient *http.Client
    29  }
    30  
    31  func (api *API) Check(ctx context.Context, chainID uint64, ens string, currentVersion string) {
    32  	go func() {
    33  		ctx, cancel := context.WithTimeout(context.Background(), 45*time.Second)
    34  		defer cancel()
    35  
    36  		current, err := version.NewVersion(currentVersion)
    37  		if err != nil {
    38  			log.Error("invalid current version", "err", err)
    39  			return
    40  		}
    41  
    42  		uri, err := api.ensService.API().ResourceURL(ctx, chainID, ens)
    43  		if err != nil || uri.Host == "" {
    44  			log.Error("can't get obtain the updates content hash url", "ens", ens)
    45  			signal.SendUpdateAvailable(false, "", "")
    46  			return
    47  		}
    48  
    49  		url := uri.Scheme + "://" + uri.Host + uri.Path
    50  		versionURL := url + "VERSION"
    51  		response, err := api.httpClient.Get(versionURL)
    52  		if err != nil {
    53  			log.Error("can't get content", zap.String("any", versionURL))
    54  			signal.SendUpdateAvailable(false, "", "")
    55  			return
    56  		}
    57  
    58  		defer response.Body.Close()
    59  		if response.StatusCode != http.StatusOK {
    60  			log.Error(fmt.Sprintf("version verification response status error: %v", response.StatusCode))
    61  			signal.SendUpdateAvailable(false, "", "")
    62  			return
    63  		}
    64  
    65  		data, err := ioutil.ReadAll(response.Body)
    66  		if err != nil {
    67  			log.Error("version verification body err", "err", err)
    68  			signal.SendUpdateAvailable(false, "", "")
    69  			return
    70  		}
    71  
    72  		c := make(map[string]interface{})
    73  		err = json.Unmarshal(data, &c)
    74  		if err != nil {
    75  			log.Error("invalid json", "err", err)
    76  			signal.SendUpdateAvailable(false, "", "")
    77  			return
    78  		}
    79  
    80  		latestStr := ""
    81  		switch c["version"].(type) {
    82  		case string:
    83  			latestStr = c["version"].(string)
    84  		default:
    85  			log.Error("invalid latest version", "val", c["version"])
    86  			signal.SendUpdateAvailable(false, "", "")
    87  			return
    88  		}
    89  
    90  		latest, err := version.NewVersion(latestStr)
    91  		if err != nil {
    92  			log.Error("invalid latest version", "err", err)
    93  			signal.SendUpdateAvailable(false, "", "")
    94  			return
    95  		}
    96  
    97  		signal.SendUpdateAvailable(latest.GreaterThan(current), latestStr, url)
    98  	}()
    99  }