checkServerForUpdate method

  1. @override
Future<UpdateManifest?> checkServerForUpdate({
  1. required String channel,
  2. required String branch,
  3. required String runtimeFingerprint,
  4. required String deviceId,
})
override

Queries the update server for an available update manifest matching channel, branch, and runtimeFingerprint.

Implementation

@override
Future<UpdateManifest?> checkServerForUpdate({
  required String channel,
  required String branch,
  required String runtimeFingerprint,
  required String deviceId,
}) async {
  final uri = Uri.parse('$baseUrl/api/v1/updates/check').replace(queryParameters: {
    'channel': channel,
    'branch': branch,
    'fingerprint': runtimeFingerprint,
    'device_id': deviceId,
  });

  logger.debug('BloomHttpUpdateAdapter: Checking update server at $uri');

  try {
    final response = await httpClient.get(
      uri,
      headers: {
        'Accept': 'application/json',
        'User-Agent': 'BloomOTA/1.0.0',
        ...defaultHeaders,
      },
    );

    if (response.statusCode == 204 || response.statusCode == 404) {
      // No update available
      return null;
    }

    if (response.statusCode >= 200 && response.statusCode < 300) {
      final data = jsonDecode(response.body);
      if (data is Map<String, dynamic>) {
        if (data['is_available'] == false || data['manifest'] == null && data['id'] == null) {
          return null;
        }
        final manifestMap = data['manifest'] is Map<String, dynamic>
            ? data['manifest'] as Map<String, dynamic>
            : data;
        return UpdateManifest.fromJson(manifestMap);
      }
    }

    logger.warn('BloomHttpUpdateAdapter: Server returned status ${response.statusCode}: ${response.body}');
    return null;
  } catch (e, st) {
    logger.error('BloomHttpUpdateAdapter: Check failed: $e', e, st);
    rethrow;
  }
}