resolve method

Future<MiniProgramDiscoveryState> resolve({
  1. required String miniProgramId,
  2. required MiniProgramSource source,
  3. required ManifestCache manifestCache,
  4. required ScreenCache screenCache,
  5. required MiniProgramDiscoverySourceKind sourceKind,
})

Implementation

Future<MiniProgramDiscoveryState> resolve({
  required String miniProgramId,
  required MiniProgramSource source,
  required ManifestCache manifestCache,
  required ScreenCache screenCache,
  required MiniProgramDiscoverySourceKind sourceKind,
}) async {
  final cachedManifest = await manifestCache.read(miniProgramId);

  try {
    final manifest = await source.loadManifest(miniProgramId);
    if (sourceKind == MiniProgramDiscoverySourceKind.remote) {
      await _updateManifestCache(
        miniProgramId: miniProgramId,
        manifest: manifest,
        manifestCache: manifestCache,
      );
    }

    return MiniProgramDiscoveryState(
      miniProgramId: miniProgramId,
      status: switch (sourceKind) {
        MiniProgramDiscoverySourceKind.bundled =>
          MiniProgramDiscoveryStatus.cached,
        MiniProgramDiscoverySourceKind.remote =>
          MiniProgramDiscoveryStatus.live,
      },
      manifest: manifest,
    );
  } catch (error) {
    final sourceException = error is MiniProgramSourceException
        ? error
        : null;
    final offlineState = await _resolveOfflineDiscoveryState(
      miniProgramId: miniProgramId,
      sourceKind: sourceKind,
      sourceException: sourceException,
      cachedManifest: cachedManifest,
      screenCache: screenCache,
    );
    if (offlineState != null) {
      return offlineState;
    }

    return MiniProgramDiscoveryState(
      miniProgramId: miniProgramId,
      status: MiniProgramDiscoveryStatus.unavailable,
      manifest: cachedManifest?.manifest,
      errorCode: sourceException?.errorCode,
      manifestCachedAt: cachedManifest?.cachedAt,
      message: _unavailableMessage(sourceKind, sourceException),
      details: <String, dynamic>{
        if (cachedManifest != null) ...<String, dynamic>{
          'manifestCacheExpired': !_isWithinMaxStaleAge(
            cachedAt: cachedManifest.cachedAt,
            maxStaleAge: cachedManifest.manifest.manifestMaxStaleAge,
          ),
        },
        if (sourceException != null) ...sourceException.details,
      },
    );
  }
}