batch method

Future<List> batch(
  1. List<(String, List?)> requests
)

Implementation

Future<List<dynamic>> batch(List<(String method, List<dynamic>? params)> requests) async {
  final payloads = <Map<String, dynamic>>[];
  final ids = <int>[];
  for (final (method, params) in requests) {
    final id = nextId;
    ids.add(id);
    payloads.add({
      'jsonrpc': '2.0',
      'id': id,
      'method': method,
      'params': params ?? [],
    });
  }
  final body = jsonEncode(payloads);
  final responseBody = await _postJson(body);
  final responses = (jsonDecode(responseBody) as List).cast<Map<String, dynamic>>();
  final byId = <int, Map<String, dynamic>>{};
  for (final r in responses) {
    byId[r['id'] as int] = r;
  }
  final results = <dynamic>[];
  for (final id in ids) {
    final r = byId[id]!;
    if (r.containsKey('error') && r['error'] != null) {
      final err = r['error'] as Map<String, dynamic>;
      throw JsonRpcError(
        code: err['code'] as int,
        message: err['message'] as String,
        data: err['data'],
      );
    }
    results.add(r['result']);
  }
  return results;
}