summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorEmīls <emils@mullvad.net>2026-04-02 16:19:46 +0200
committerEmīls <emils@mullvad.net>2026-04-02 16:19:46 +0200
commit2c89650600c76e82f7d6c820c0714ae77322eff9 (patch)
treebc2b3cad37d01a190a30e47ad04bd3e44f751007
parent5b95f1fd5542c5bd99fffc848ad055eb89811290 (diff)
parent0b8ea568016afc82da846fdc50dff42d9744492a (diff)
downloadmullvadvpn-2c89650600c76e82f7d6c820c0714ae77322eff9.tar.xz
mullvadvpn-2c89650600c76e82f7d6c820c0714ae77322eff9.zip
Merge branch 'ios-file-cache-eager-deserialization'
-rw-r--r--ios/MullvadREST/Relay/StoredRelays.swift18
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 {