62 lines · 2.4 KB · Swift
RawDownload
import Foundation extension FactoryStatusProbe {    /// Fetch Factory usage using a Factory API key (`FACTORY_API_KEY` / `fk-…`).    public func fetch(        apiKey: String,        logger: ((String) -> Void)? = nil) async throws -> FactoryStatusSnapshot    {        let trimmed = apiKey.trimmingCharacters(in: .whitespacesAndNewlines)        guard !trimmed.isEmpty else {            throw FactoryStatusProbeError.missingAPIKey        }        let log: (String) -> Void = { msg in logger?("[factory] \(msg)") }        log("Using Factory API key")        return try await self.fetchWithBearerToken(trimmed, logger: log)    }     func fetchWithBearerToken(        _ bearerToken: String,        logger: (String) -> Void) async throws -> FactoryStatusSnapshot    {        let candidates = [Self.apiBaseURL, self.baseURL]        var lastError: Error?        var preferredAuthError: FactoryStatusProbeError?        for baseURL in candidates {            if baseURL != Self.apiBaseURL {                logger("Trying Factory bearer base URL: \(baseURL.host ?? baseURL.absoluteString)")            }            do {                return try await self.fetchWithCookieHeader(                    "",                    bearerToken: bearerToken,                    baseURL: baseURL)            } catch {                if preferredAuthError == nil,                   let authError = Self.preferredBearerAuthError(from: error)                {                    preferredAuthError = authError                }                lastError = error            }        }        // Prefer 401/403 auth failures over later host noise (e.g. 404) so API-key Auto mode        // can map to unauthorizedAPIKey and fall back to cookies/WorkOS.        if let preferredAuthError { throw preferredAuthError }        if let lastError { throw lastError }        throw FactoryStatusProbeError.notLoggedIn    }     private static func preferredBearerAuthError(from error: Error) -> FactoryStatusProbeError? {        guard let factoryError = error as? FactoryStatusProbeError else { return nil }        switch factoryError {        case .notLoggedIn:            return factoryError        case let .networkError(message)            where message.contains("HTTP 401") || message.contains("HTTP 403"):            return factoryError        default:            return nil        }    }}