waitForBuild method

  1. @override
Future<ApiResourceDto<BuildAttributesDto>> waitForBuild({
  1. required String appId,
  2. required String version,
  3. required String buildNumber,
  4. required int timeoutMinutes,
  5. Duration interval = const Duration(seconds: 30),
})
override

Waits for an exact uploaded build to finish App Store processing.

Implementation

@override
Future<ApiResourceDto<BuildAttributesDto>> waitForBuild({
  required String appId,
  required String version,
  required String buildNumber,
  required int timeoutMinutes,
  Duration interval = const Duration(seconds: 30),
}) async {
  final deadline = _currentTime().add(Duration(minutes: timeoutMinutes));
  while (_currentTime().isBefore(deadline)) {
    final builds = await buildsForVersion(appId: appId, version: version);
    final build = builds
        .where(
          (item) => item.attributes.version == buildNumber,
        )
        .firstOrNull;
    if (build case final build?) {
      if (build.attributes.processingState == BuildProcessingState.valid) {
        return build;
      }
      if (build.attributes.processingState case BuildProcessingState.failed || BuildProcessingState.invalid) {
        throw SmfError(
          'Apple marked $version ($buildNumber) as '
          '${build.attributes.processingState.value}.',
          SmfErrorCode.buildInvalid,
        );
      }
    }
    if (interval > Duration.zero) await _delay(interval);
  }
  throw SmfError(
    'Timed out waiting for $version ($buildNumber) to finish processing.',
    SmfErrorCode.buildTimeout,
  );
}