1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#if DEBUG
import Foundation
/// Artificial per-request latency so loading states can be eyeballed at
/// something other than fast-wifi speed. DEBUG-only and off unless
/// `GRAIN_NETWORK_DELAY` is set, either to a preset or to raw seconds:
///
/// SIMCTL_CHILD_GRAIN_NETWORK_DELAY=3g just sim
/// SIMCTL_CHILD_GRAIN_NETWORK_DELAY=0.4 just sim
///
/// or, in Xcode, Scheme → Run → Arguments → Environment Variables.
///
/// Applied inside `XRPCClient`, so every API call pays it independently and
/// concurrent requests still overlap — unlike a per-screen sleep, which
/// collapses the staggering that makes a slow connection look the way it
/// does. Image loads go through Nuke rather than XRPCClient, so thumbnails
/// stay at full speed.
enum DebugDelay {
/// Round-trip times roughly matching Network Link Conditioner's profiles.
private static let presets: [String: Double] = [
"wifi": 0.02,
"lte": 0.065,
"3g": 0.4,
"edge": 0.84,
"slow": 1.5,
]
static let seconds: Double = {
guard let raw = ProcessInfo.processInfo.environment["GRAIN_NETWORK_DELAY"]?
.trimmingCharacters(in: .whitespaces).lowercased(), !raw.isEmpty
else { return 0 }
if let preset = presets[raw] {
return preset
}
guard let value = Double(raw), value > 0 else { return 0 }
return value
}()
static func wait() async {
guard seconds > 0 else { return }
try? await Task.sleep(for: .seconds(seconds))
}
}
#endif