T-iOS-15: AppEnvironment production DI (real Keychain/probe/transports), EventFanOut (engine.events → TerminalVM + GateVM + activity bridge), scenePhase lifecycle (.background→close, suspend→rebuild+reopen reclaims size), privacy shade on != .active, spike screen deleted, cold-start routing Walkthrough proxies: hosted live-server smoke over the production DI graph (probe→store→ attach→echo→close) + real-Keychain kSecAttrAccessible assertion (closes T-iOS-7 deferral) Deviation closed: TerminalViewModel.lastSentDims (valid-only) + alive-engine .active → notifyForegrounded(dims:) (orchestrator fix on behalf of T-iOS-11 owner) Env finding: repo under ~/Documents → TCC blocks sim-spawned node; SimServerHarness dual-mode (self-bootstrap / WEBTERM_SERVER_URL via simctl launchctl setenv) Verified: 214 pkg + 76 app + 10 integration tests green; verify agent 8/8 PASS
27 lines
1.1 KiB
Swift
27 lines
1.1 KiB
Swift
import Foundation
|
|
import WireProtocol
|
|
|
|
/// T-iOS-15 · Production `HTTPTransport` (the WireProtocol seam's doc reserves
|
|
/// the URLSession wrapper for the production side; no package owns it, so the
|
|
/// assembly layer provides it). Deliberately logic-free: `APIClient` builds
|
|
/// every request — including the Origin-iff-G rule (plan §3.4 铁律) — and this
|
|
/// type only performs the exchange. Adding ANY header/URL logic here would
|
|
/// bypass that single audited point (review CRITICAL).
|
|
struct URLSessionHTTPTransport: HTTPTransport {
|
|
private let session: URLSession
|
|
|
|
init(session: URLSession = .shared) {
|
|
self.session = session
|
|
}
|
|
|
|
func send(_ request: URLRequest) async throws -> (Data, HTTPURLResponse) {
|
|
let (data, response) = try await session.data(for: request)
|
|
guard let httpResponse = response as? HTTPURLResponse else {
|
|
// http(s)-only endpoints (HostEndpoint validates) always produce
|
|
// an HTTPURLResponse; anything else is a transport-level anomaly.
|
|
throw URLError(.badServerResponse)
|
|
}
|
|
return (data, httpResponse)
|
|
}
|
|
}
|