55 lines
2.4 KiB
Swift
55 lines
2.4 KiB
Swift
import CodexBarCore
|
|
import Foundation
|
|
|
|
extension UsageStore {
|
|
func refreshProviderStatus(_ provider: UsageProvider) async {
|
|
guard self.settings.statusChecksEnabled else { return }
|
|
guard let meta = self.providerMetadata[provider] else { return }
|
|
let publicationRevision = self.providerPublicationRevision(for: provider)
|
|
|
|
do {
|
|
let status: ProviderStatus
|
|
var components: [ProviderStatusComponent]?
|
|
if let override = self._test_providerStatusFetchOverride {
|
|
status = try await override(provider)
|
|
} else if let urlString = meta.statusPageURL, let baseURL = URL(string: urlString) {
|
|
let summary = try await Self.fetchStatusSummary(from: baseURL)
|
|
status = summary.status
|
|
components = summary.components
|
|
} else if let productID = meta.statusWorkspaceProductID {
|
|
status = try await Self.fetchWorkspaceStatus(productID: productID)
|
|
} else {
|
|
return
|
|
}
|
|
guard self.statusRefreshPublicationIsCurrent(publicationRevision, for: provider) else { return }
|
|
self.statuses[provider] = status
|
|
// A component endpoint is best-effort. Preserve the last good list when the
|
|
// overall status succeeds but the component request or decoding fails.
|
|
if let components {
|
|
self.statusComponents[provider] = components
|
|
}
|
|
} catch {
|
|
guard self.statusRefreshPublicationIsCurrent(publicationRevision, for: provider) else { return }
|
|
self.recordStartupConnectivityRetryableFailure(error)
|
|
// Keep the previous status to avoid flapping when the API hiccups.
|
|
if self.statuses[provider] == nil {
|
|
self.statuses[provider] = ProviderStatus(
|
|
indicator: .unknown,
|
|
description: error.localizedDescription,
|
|
updatedAt: nil)
|
|
}
|
|
}
|
|
}
|
|
|
|
private func statusRefreshPublicationIsCurrent(
|
|
_ publicationRevision: ProviderPublicationRevision,
|
|
for provider: UsageProvider) -> Bool
|
|
{
|
|
self.providerPublicationRevisionIsCurrent(publicationRevision, for: provider) &&
|
|
self.settings.statusChecksEnabled &&
|
|
self.settings.isProviderEnabledCached(
|
|
provider: provider,
|
|
metadataByProvider: self.providerMetadata)
|
|
}
|
|
}
|