Skip to content
Snippets Groups Projects
duniter_indexer.dart 4.97 KiB
import 'dart:async';
import 'dart:convert';
import 'dart:io';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:gecko/globals.dart';
import 'package:gecko/models/queries_indexer.dart';
import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/providers/wallet_options.dart';
import 'package:graphql_flutter/graphql_flutter.dart';
import 'package:provider/provider.dart';

class DuniterIndexer with ChangeNotifier {
  Map<String, String?> walletNameIndexer = {};

  void reload() {
    notifyListeners();
  }

  Future checkIndexerEndpoint() async {
    final oldEndpoint = indexerEndpoint;
    while (true) {
      await Future.delayed(const Duration(seconds: 30));
      final _client = HttpClient();
      _client.connectionTimeout = const Duration(milliseconds: 1000);
      try {
        final request = await _client.postUrl(Uri.parse(oldEndpoint));
        final response = await request.close();
        if (response.statusCode != 200) {
          log.d('INDEXER IS OFFILINE');
          indexerEndpoint = '';
        } else {
          // log.d('Indexer is online');
          indexerEndpoint = oldEndpoint;
        }
      } catch (e) {
        log.d('INDEXER IS OFFILINE');
        indexerEndpoint = '';
      }
    }
  }

  Future<String> getValidIndexerEndpoint() async {
    List _listEndpoints = await rootBundle
        .loadString('config/indexer_endpoints.json')
        .then((jsonStr) => jsonDecode(jsonStr));
    // _listEndpoints.shuffle();

    int i = 0;
    // String _endpoint = '';
    int _statusCode = 0;

    final _client = HttpClient();
    _client.connectionTimeout = const Duration(milliseconds: 1000);

    do {
      int listLenght = _listEndpoints.length;
      if (i >= listLenght) {
        log.e('NO VALID INDEXER ENDPOINT FOUND');
        indexerEndpoint = '';
        break;
      }
      log.d(
          (i + 1).toString() + 'n indexer endpoint try: ${_listEndpoints[i]}');

      if (i != 0) {
        await Future.delayed(const Duration(milliseconds: 300));
      }