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 } }}
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
}
}
}