diff options
| author | Emīls <emils@mullvad.net> | 2026-04-02 16:19:46 +0200 |
|---|---|---|
| committer | Emīls <emils@mullvad.net> | 2026-04-02 16:19:46 +0200 |
| commit | 2c89650600c76e82f7d6c820c0714ae77322eff9 (patch) | |
| tree | bc2b3cad37d01a190a30e47ad04bd3e44f751007 | |
| parent | 5b95f1fd5542c5bd99fffc848ad055eb89811290 (diff) | |
| parent | 0b8ea568016afc82da846fdc50dff42d9744492a (diff) | |
| download | mullvadvpn-2c89650600c76e82f7d6c820c0714ae77322eff9.tar.xz mullvadvpn-2c89650600c76e82f7d6c820c0714ae77322eff9.zip | |
Merge branch 'ios-file-cache-eager-deserialization'
| -rw-r--r-- | ios/MullvadREST/Relay/StoredRelays.swift | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/ios/MullvadREST/Relay/StoredRelays.swift b/ios/MullvadREST/Relay/StoredRelays.swift index f74a5e725a..310a2726c0 100644 --- a/ios/MullvadREST/Relay/StoredRelays.swift +++ b/ios/MullvadREST/Relay/StoredRelays.swift @@ -63,6 +63,24 @@ public struct StoredRelays: Codable, Equatable { case etag, rawData, updatedAt } + public init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + etag = try container.decodeIfPresent(String.self, forKey: .etag) + rawData = try container.decode(Data.self, forKey: .rawData) + updatedAt = try container.decode(Date.self, forKey: .updatedAt) + // Eagerly deserialize relay data so the result is cached before + // this value reaches the actor's cooperative thread. The + // DeserializationCache.get() NSLock + JSON parsing would otherwise + // block a cooperative thread during relay selection. + let result = Result { + try REST.Coding.makeJSONDecoder().decode( + REST.ServerRelaysResponse.self, + from: rawData + ) + }.map { CachedRelays(etag: etag, relays: $0, updatedAt: updatedAt) } + cache.set(result) + } + // MARK: - Equatable public static func == (lhs: StoredRelays, rhs: StoredRelays) -> Bool { |
