Sources/MeshKit/MeshClient.swift +514 −84
@@ init — the relay is remembered, not lost @@
public init(
bridgeURL: URL,
+ fallbackURL: URL? = nil,
bearer: String, …
+ self.fallbackURL = fallbackURL // the relay from the same pairing
@@ performData — one honest retry over the relay @@
} catch {
+ if let fallback = fallbackRequest(from: request, baseURL: baseURL, after: error) {
+ // Wi-Fi path is dead — try the relay ONCE, remember it if it answers
+ let (raw, response) = try await session.data(for: fallback.request)
+ return BridgeDataResponse(raw: raw, response: response, baseURL: fallback.baseURL)
+ }
@@ ComposerView — "Sending…" is no longer allowed to lie @@
+private static let submitDeadline: Duration = .seconds(20)
+// on timeout: "Couldn't reach your Mac — not by Wi-Fi, not by relay."