From edf8b68aacf28ef139b0cbbb3177da228b669461 Mon Sep 17 00:00:00 2001
From: Dariusz Rybicki <dariusz@elixxir.io>
Date: Mon, 22 Aug 2022 21:33:09 +0100
Subject: [PATCH] Refactor

Remove MessengerContext
---
 .../Messenger/Functors/MessengerCMix.swift    | 17 +++++---
 .../Messenger/Functors/MessengerConnect.swift |  4 +-
 .../Messenger/Functors/MessengerE2E.swift     | 17 +++++---
 .../Functors/MessengerIsConnected.swift       |  2 +-
 .../Functors/MessengerIsLoaded.swift          |  2 +-
 .../Functors/MessengerIsLoggedIn.swift        |  2 +-
 .../Functors/MessengerIsRegistered.swift      |  2 +-
 .../Messenger/Functors/MessengerLoad.swift    |  2 +-
 .../Messenger/Functors/MessengerLogIn.swift   |  6 +--
 .../Functors/MessengerRegister.swift          |  6 +--
 .../Messenger/Functors/MessengerStart.swift   |  2 +-
 .../Messenger/Functors/MessengerUD.swift      | 17 +++++---
 .../Functors/MessengerWaitForNetwork.swift    |  2 +-
 .../Functors/MessengerWaitForNodes.swift      |  2 +-
 .../Messenger/Messenger.swift                 |  6 +--
 .../Messenger/MessengerContext.swift          | 42 -------------------
 .../Messenger/MessengerEnvironment.swift      | 12 ++++--
 .../Functors/MessengerCMixTests.swift         | 14 +++----
 .../Functors/MessengerConnectTests.swift      | 10 ++---
 .../Functors/MessengerE2ETests.swift          | 14 +++----
 .../Functors/MessengerIsConnectedTests.swift  |  4 +-
 .../Functors/MessengerIsLoadedTests.swift     |  4 +-
 .../Functors/MessengerIsLoggedInTests.swift   |  4 +-
 .../Functors/MessengerIsRegisteredTests.swift |  8 ++--
 .../Functors/MessengerLoadTests.swift         |  2 +-
 .../Functors/MessengerLogInTests.swift        | 26 ++++++------
 .../Functors/MessengerRegisterTests.swift     | 26 ++++++------
 .../Functors/MessengerStartTests.swift        |  8 ++--
 .../Messenger/Functors/MessengerUDTests.swift | 18 ++++----
 .../MessengerWaitForNetworkTests.swift        |  6 +--
 .../Functors/MessengerWaitForNodesTests.swift |  8 ++--
 31 files changed, 137 insertions(+), 158 deletions(-)
 delete mode 100644 Sources/XXMessengerClient/Messenger/MessengerContext.swift

diff --git a/Sources/XXMessengerClient/Messenger/Functors/MessengerCMix.swift b/Sources/XXMessengerClient/Messenger/Functors/MessengerCMix.swift
index 5543c048..d3e062d2 100644
--- a/Sources/XXMessengerClient/Messenger/Functors/MessengerCMix.swift
+++ b/Sources/XXMessengerClient/Messenger/Functors/MessengerCMix.swift
@@ -2,21 +2,28 @@ import XXClient
 import XCTestDynamicOverlay
 
 public struct MessengerCMix {
-  public var run: () -> CMix?
+  public var get: () -> CMix?
+  public var set: (CMix?) -> Void
 
   public func callAsFunction() -> CMix? {
-    run()
+    get()
   }
 }
 
 extension MessengerCMix {
-  public static func live(_ env: MessengerEnvironment) -> MessengerCMix {
-    MessengerCMix(run: env.ctx.getCMix)
+  public static func live() -> MessengerCMix {
+    class Storage { var value: CMix? }
+    let storage = Storage()
+    return MessengerCMix(
+      get: { storage.value },
+      set: { storage.value = $0 }
+    )
   }
 }
 
 extension MessengerCMix {
   public static let unimplemented = MessengerCMix(
-    run: XCTUnimplemented("\(Self.self)", placeholder: nil)
+    get: XCTUnimplemented("\(Self.self).get", placeholder: nil),
+    set: XCTUnimplemented("\(Self.self).set")
   )
 }
diff --git a/Sources/XXMessengerClient/Messenger/Functors/MessengerConnect.swift b/Sources/XXMessengerClient/Messenger/Functors/MessengerConnect.swift
index 97e399ab..8cebb73a 100644
--- a/Sources/XXMessengerClient/Messenger/Functors/MessengerConnect.swift
+++ b/Sources/XXMessengerClient/Messenger/Functors/MessengerConnect.swift
@@ -16,10 +16,10 @@ public struct MessengerConnect {
 extension MessengerConnect {
   public static func live(_ env: MessengerEnvironment) -> MessengerConnect {
     MessengerConnect {
-      guard let cMix = env.ctx.getCMix() else {
+      guard let cMix = env.cMix() else {
         throw Error.notLoaded
       }
-      env.ctx.setE2E(try env.login(
+      env.e2e.set(try env.login(
         cMixId: cMix.getId(),
         identity: try cMix.makeLegacyReceptionIdentity(),
         e2eParamsJSON: env.getE2EParams()
diff --git a/Sources/XXMessengerClient/Messenger/Functors/MessengerE2E.swift b/Sources/XXMessengerClient/Messenger/Functors/MessengerE2E.swift
index cc1f8def..070a6b70 100644
--- a/Sources/XXMessengerClient/Messenger/Functors/MessengerE2E.swift
+++ b/Sources/XXMessengerClient/Messenger/Functors/MessengerE2E.swift
@@ -2,21 +2,28 @@ import XXClient
 import XCTestDynamicOverlay
 
 public struct MessengerE2E {
-  public var run: () -> E2E?
+  public var get: () -> E2E?
+  public var set: (E2E?) -> Void
 
   public func callAsFunction() -> E2E? {
-    run()
+    get()
   }
 }
 
 extension MessengerE2E {
-  public static func live(_ env: MessengerEnvironment) -> MessengerE2E {
-    MessengerE2E(run: env.ctx.getE2E)
+  public static func live() -> MessengerE2E {
+    class Storage { var value: E2E? }
+    let storage = Storage()
+    return MessengerE2E(
+      get: { storage.value },
+      set: { storage.value = $0 }
+    )
   }
 }
 
 extension MessengerE2E {
   public static let unimplemented = MessengerE2E(
-    run: XCTUnimplemented("\(Self.self)", placeholder: nil)
+    get: XCTUnimplemented("\(Self.self).get", placeholder: nil),
+    set: XCTUnimplemented("\(Self.self).set")
   )
 }
diff --git a/Sources/XXMessengerClient/Messenger/Functors/MessengerIsConnected.swift b/Sources/XXMessengerClient/Messenger/Functors/MessengerIsConnected.swift
index 81017429..c30437fa 100644
--- a/Sources/XXMessengerClient/Messenger/Functors/MessengerIsConnected.swift
+++ b/Sources/XXMessengerClient/Messenger/Functors/MessengerIsConnected.swift
@@ -12,7 +12,7 @@ public struct MessengerIsConnected {
 extension MessengerIsConnected {
   public static func live(_ env: MessengerEnvironment) -> MessengerIsConnected {
     MessengerIsConnected {
-      env.ctx.getE2E() != nil
+      env.e2e() != nil
     }
   }
 }
diff --git a/Sources/XXMessengerClient/Messenger/Functors/MessengerIsLoaded.swift b/Sources/XXMessengerClient/Messenger/Functors/MessengerIsLoaded.swift
index 8931d2b4..dc0b4216 100644
--- a/Sources/XXMessengerClient/Messenger/Functors/MessengerIsLoaded.swift
+++ b/Sources/XXMessengerClient/Messenger/Functors/MessengerIsLoaded.swift
@@ -12,7 +12,7 @@ public struct MessengerIsLoaded {
 extension MessengerIsLoaded {
   public static func live(_ env: MessengerEnvironment) -> MessengerIsLoaded {
     MessengerIsLoaded {
-      env.ctx.getCMix() != nil
+      env.cMix() != nil
     }
   }
 }
diff --git a/Sources/XXMessengerClient/Messenger/Functors/MessengerIsLoggedIn.swift b/Sources/XXMessengerClient/Messenger/Functors/MessengerIsLoggedIn.swift
index 04aaa338..7c54c578 100644
--- a/Sources/XXMessengerClient/Messenger/Functors/MessengerIsLoggedIn.swift
+++ b/Sources/XXMessengerClient/Messenger/Functors/MessengerIsLoggedIn.swift
@@ -12,7 +12,7 @@ public struct MessengerIsLoggedIn {
 extension MessengerIsLoggedIn {
   public static func live(_ env: MessengerEnvironment) -> MessengerIsLoggedIn {
     MessengerIsLoggedIn {
-      env.ctx.getUD() != nil
+      env.ud() != nil
     }
   }
 }
diff --git a/Sources/XXMessengerClient/Messenger/Functors/MessengerIsRegistered.swift b/Sources/XXMessengerClient/Messenger/Functors/MessengerIsRegistered.swift
index cbf02c8a..bf3cafa5 100644
--- a/Sources/XXMessengerClient/Messenger/Functors/MessengerIsRegistered.swift
+++ b/Sources/XXMessengerClient/Messenger/Functors/MessengerIsRegistered.swift
@@ -16,7 +16,7 @@ public struct MessengerIsRegistered {
 extension MessengerIsRegistered {
   public static func live(_ env: MessengerEnvironment) -> MessengerIsRegistered {
     MessengerIsRegistered {
-      guard let e2e = env.ctx.getE2E() else {
+      guard let e2e = env.e2e() else {
         throw Error.notConnected
       }
       return try env.isRegisteredWithUD(e2eId: e2e.getId())
diff --git a/Sources/XXMessengerClient/Messenger/Functors/MessengerLoad.swift b/Sources/XXMessengerClient/Messenger/Functors/MessengerLoad.swift
index c57d7a5a..29f28168 100644
--- a/Sources/XXMessengerClient/Messenger/Functors/MessengerLoad.swift
+++ b/Sources/XXMessengerClient/Messenger/Functors/MessengerLoad.swift
@@ -12,7 +12,7 @@ public struct MessengerLoad {
 extension MessengerLoad {
   public static func live(_ env: MessengerEnvironment) -> MessengerLoad {
     MessengerLoad {
-      env.ctx.setCMix(try env.loadCMix(
+      env.cMix.set(try env.loadCMix(
         storageDir: env.storageDir,
         password: try env.passwordStorage.load(),
         cMixParamsJSON: env.getCMixParams()
diff --git a/Sources/XXMessengerClient/Messenger/Functors/MessengerLogIn.swift b/Sources/XXMessengerClient/Messenger/Functors/MessengerLogIn.swift
index 51e970d5..d0f86d8b 100644
--- a/Sources/XXMessengerClient/Messenger/Functors/MessengerLogIn.swift
+++ b/Sources/XXMessengerClient/Messenger/Functors/MessengerLogIn.swift
@@ -17,13 +17,13 @@ public struct MessengerLogIn {
 extension MessengerLogIn {
   public static func live(_ env: MessengerEnvironment) -> MessengerLogIn {
     MessengerLogIn {
-      guard let cMix = env.ctx.getCMix() else {
+      guard let cMix = env.cMix() else {
         throw Error.notLoaded
       }
-      guard let e2e = env.ctx.getE2E() else {
+      guard let e2e = env.e2e() else {
         throw Error.notConnected
       }
-      env.ctx.setUD(try env.newOrLoadUd(
+      env.ud.set(try env.newOrLoadUd(
         params: .init(
           e2eId: e2e.getId(),
           username: nil,
diff --git a/Sources/XXMessengerClient/Messenger/Functors/MessengerRegister.swift b/Sources/XXMessengerClient/Messenger/Functors/MessengerRegister.swift
index 35450762..6f429631 100644
--- a/Sources/XXMessengerClient/Messenger/Functors/MessengerRegister.swift
+++ b/Sources/XXMessengerClient/Messenger/Functors/MessengerRegister.swift
@@ -19,13 +19,13 @@ public struct MessengerRegister {
 extension MessengerRegister {
   public static func live(_ env: MessengerEnvironment) -> MessengerRegister {
     MessengerRegister { username in
-      guard let cMix = env.ctx.getCMix() else {
+      guard let cMix = env.cMix() else {
         throw Error.notLoaded
       }
-      guard let e2e = env.ctx.getE2E() else {
+      guard let e2e = env.e2e() else {
         throw Error.notConnected
       }
-      env.ctx.setUD(try env.newOrLoadUd(
+      env.ud.set(try env.newOrLoadUd(
         params: .init(
           e2eId: e2e.getId(),
           username: username,
diff --git a/Sources/XXMessengerClient/Messenger/Functors/MessengerStart.swift b/Sources/XXMessengerClient/Messenger/Functors/MessengerStart.swift
index 224702b7..cc3363ec 100644
--- a/Sources/XXMessengerClient/Messenger/Functors/MessengerStart.swift
+++ b/Sources/XXMessengerClient/Messenger/Functors/MessengerStart.swift
@@ -18,7 +18,7 @@ public struct MessengerStart {
 extension MessengerStart {
   public static func live(_ env: MessengerEnvironment) -> MessengerStart {
     MessengerStart { timeoutMS in
-      guard let cMix = env.ctx.getCMix() else {
+      guard let cMix = env.cMix() else {
         throw Error.notLoaded
       }
       guard cMix.networkFollowerStatus() != .running else {
diff --git a/Sources/XXMessengerClient/Messenger/Functors/MessengerUD.swift b/Sources/XXMessengerClient/Messenger/Functors/MessengerUD.swift
index c64ee6cf..c871f6e0 100644
--- a/Sources/XXMessengerClient/Messenger/Functors/MessengerUD.swift
+++ b/Sources/XXMessengerClient/Messenger/Functors/MessengerUD.swift
@@ -2,21 +2,28 @@ import XXClient
 import XCTestDynamicOverlay
 
 public struct MessengerUD {
-  public var run: () -> UserDiscovery?
+  public var get: () -> UserDiscovery?
+  public var set: (UserDiscovery?) -> Void
 
   public func callAsFunction() -> UserDiscovery? {
-    run()
+    get()
   }
 }
 
 extension MessengerUD {
-  public static func live(_ env: MessengerEnvironment) -> MessengerUD {
-    MessengerUD(run: env.ctx.getUD)
+  public static func live() -> MessengerUD {
+    class Storage { var value: UserDiscovery? }
+    let storage = Storage()
+    return MessengerUD(
+      get: { storage.value },
+      set: { storage.value = $0 }
+    )
   }
 }
 
 extension MessengerUD {
   public static let unimplemented = MessengerUD(
-    run: XCTUnimplemented("\(Self.self)", placeholder: nil)
+    get: XCTUnimplemented("\(Self.self).get", placeholder: nil),
+    set: XCTUnimplemented("\(Self.self).set")
   )
 }
diff --git a/Sources/XXMessengerClient/Messenger/Functors/MessengerWaitForNetwork.swift b/Sources/XXMessengerClient/Messenger/Functors/MessengerWaitForNetwork.swift
index df8fea18..8fe8cf3e 100644
--- a/Sources/XXMessengerClient/Messenger/Functors/MessengerWaitForNetwork.swift
+++ b/Sources/XXMessengerClient/Messenger/Functors/MessengerWaitForNetwork.swift
@@ -19,7 +19,7 @@ public struct MessengerWaitForNetwork {
 extension MessengerWaitForNetwork {
   public static func live(_ env: MessengerEnvironment) -> MessengerWaitForNetwork {
     MessengerWaitForNetwork { timeoutMS in
-      guard let cMix = env.ctx.getCMix() else {
+      guard let cMix = env.cMix() else {
         throw Error.notLoaded
       }
       guard cMix.waitForNetwork(timeoutMS: timeoutMS) else {
diff --git a/Sources/XXMessengerClient/Messenger/Functors/MessengerWaitForNodes.swift b/Sources/XXMessengerClient/Messenger/Functors/MessengerWaitForNodes.swift
index 8fc11899..b87acc2f 100644
--- a/Sources/XXMessengerClient/Messenger/Functors/MessengerWaitForNodes.swift
+++ b/Sources/XXMessengerClient/Messenger/Functors/MessengerWaitForNodes.swift
@@ -24,7 +24,7 @@ public struct MessengerWaitForNodes {
 extension MessengerWaitForNodes {
   public static func live(_ env: MessengerEnvironment) -> MessengerWaitForNodes {
     MessengerWaitForNodes { targetRatio, sleepMS, retries, onProgress in
-      guard let cMix = env.ctx.getCMix() else {
+      guard let cMix = env.cMix() else {
         throw Error.notLoaded
       }
 
diff --git a/Sources/XXMessengerClient/Messenger/Messenger.swift b/Sources/XXMessengerClient/Messenger/Messenger.swift
index 5a442ac9..397c8e84 100644
--- a/Sources/XXMessengerClient/Messenger/Messenger.swift
+++ b/Sources/XXMessengerClient/Messenger/Messenger.swift
@@ -22,9 +22,9 @@ public struct Messenger {
 extension Messenger {
   public static func live(_ env: MessengerEnvironment) -> Messenger {
     Messenger(
-      cMix: .live(env),
-      e2e: .live(env),
-      ud: .live(env),
+      cMix: env.cMix,
+      e2e: env.e2e,
+      ud: env.ud,
       isCreated: .live(env),
       create: .live(env),
       isLoaded: .live(env),
diff --git a/Sources/XXMessengerClient/Messenger/MessengerContext.swift b/Sources/XXMessengerClient/Messenger/MessengerContext.swift
deleted file mode 100644
index c98523f2..00000000
--- a/Sources/XXMessengerClient/Messenger/MessengerContext.swift
+++ /dev/null
@@ -1,42 +0,0 @@
-import XXClient
-import XCTestDynamicOverlay
-
-public struct MessengerContext {
-  public var getCMix: () -> CMix?
-  public var setCMix: (CMix?) -> Void
-  public var getE2E: () -> E2E?
-  public var setE2E: (E2E?) -> Void
-  public var getUD: () -> UserDiscovery?
-  public var setUD: (UserDiscovery?) -> Void
-}
-
-extension MessengerContext {
-  public static func live() -> MessengerContext {
-    class Container {
-      var cMix: CMix?
-      var e2e: E2E?
-      var ud: UserDiscovery?
-    }
-    let container = Container()
-
-    return MessengerContext(
-      getCMix: { container.cMix },
-      setCMix: { container.cMix = $0 },
-      getE2E: { container.e2e },
-      setE2E: { container.e2e = $0 },
-      getUD: { container.ud },
-      setUD: { container.ud = $0 }
-    )
-  }
-}
-
-extension MessengerContext {
-  public static let unimplemented = MessengerContext(
-    getCMix: XCTUnimplemented("\(Self.self).getCMix"),
-    setCMix: XCTUnimplemented("\(Self.self).setCMix"),
-    getE2E: XCTUnimplemented("\(Self.self).getE2E"),
-    setE2E: XCTUnimplemented("\(Self.self).setE2E"),
-    getUD: XCTUnimplemented("\(Self.self).getUD"),
-    setUD: XCTUnimplemented("\(Self.self).setUD")
-  )
-}
diff --git a/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift b/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift
index eb7646f3..a84a1e87 100644
--- a/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift
+++ b/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift
@@ -3,8 +3,9 @@ import XXClient
 import XCTestDynamicOverlay
 
 public struct MessengerEnvironment {
-  public var ctx: MessengerContext
+  public var cMix: MessengerCMix
   public var downloadNDF: DownloadAndVerifySignedNdf
+  public var e2e: MessengerE2E
   public var fileManager: MessengerFileManager
   public var generateSecret: GenerateSecret
   public var getCMixParams: GetCMixParams
@@ -18,6 +19,7 @@ public struct MessengerEnvironment {
   public var passwordStorage: PasswordStorage
   public var sleep: (Int) -> Void
   public var storageDir: String
+  public var ud: MessengerUD
   public var udAddress: String?
   public var udCert: Data?
   public var udContact: Data?
@@ -32,8 +34,9 @@ extension MessengerEnvironment {
 
   public static func live() -> MessengerEnvironment {
     MessengerEnvironment(
-      ctx: .live(),
+      cMix: .live(),
       downloadNDF: .live,
+      e2e: .live(),
       fileManager: .live(),
       generateSecret: .live,
       getCMixParams: .liveDefault,
@@ -47,6 +50,7 @@ extension MessengerEnvironment {
       passwordStorage: .keychain,
       sleep: { Foundation.sleep(UInt32($0)) },
       storageDir: MessengerEnvironment.defaultStorageDir,
+      ud: .live(),
       udAddress: nil,
       udCert: nil,
       udContact: nil
@@ -56,8 +60,9 @@ extension MessengerEnvironment {
 
 extension MessengerEnvironment {
   public static let unimplemented = MessengerEnvironment(
-    ctx: .unimplemented,
+    cMix: .unimplemented,
     downloadNDF: .unimplemented,
+    e2e: .unimplemented,
     fileManager: .unimplemented,
     generateSecret: .unimplemented,
     getCMixParams: .unimplemented,
@@ -71,6 +76,7 @@ extension MessengerEnvironment {
     passwordStorage: .unimplemented,
     sleep: XCTUnimplemented("\(Self.self).sleep"),
     storageDir: "unimplemented",
+    ud: .unimplemented,
     udAddress: nil,
     udCert: nil,
     udContact: nil
diff --git a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerCMixTests.swift b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerCMixTests.swift
index f4327a08..668983f5 100644
--- a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerCMixTests.swift
+++ b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerCMixTests.swift
@@ -4,17 +4,15 @@ import XXClient
 
 final class MessengerCMixTests: XCTestCase {
   func testCMix() throws {
-    var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = { .unimplemented }
-    let cMix: MessengerCMix = .live(env)
+    let cMix: MessengerCMix = .live()
+
+    XCTAssertNil(cMix())
+
+    cMix.set(.unimplemented)
 
     XCTAssertNotNil(cMix())
-  }
 
-  func testCMixWhenNotSet() throws {
-    var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = { nil }
-    let cMix: MessengerCMix = .live(env)
+    cMix.set(nil)
 
     XCTAssertNil(cMix())
   }
diff --git a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerConnectTests.swift b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerConnectTests.swift
index c93e403e..fb780353 100644
--- a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerConnectTests.swift
+++ b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerConnectTests.swift
@@ -21,13 +21,13 @@ final class MessengerConnectTests: XCTestCase {
     let e2eParams = "e2e-params".data(using: .utf8)!
 
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = {
+    env.cMix.get = {
       var cMix: CMix = .unimplemented
       cMix.getId.run = { cMixId }
       cMix.makeLegacyReceptionIdentity.run = { receptionId }
       return cMix
     }
-    env.ctx.setE2E = { didSetE2E.append($0) }
+    env.e2e.set = { didSetE2E.append($0) }
     env.getE2EParams.run = { e2eParams }
     env.login.run = { ephemeral, cMixId, authCallbacks, identity, e2eParamsJSON in
       didLogIn.append(.init(
@@ -57,7 +57,7 @@ final class MessengerConnectTests: XCTestCase {
 
   func testConnectWithoutCMix() {
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = { nil }
+    env.cMix.get = { nil }
     let connect: MessengerConnect = .live(env)
 
     XCTAssertThrowsError(try connect()) { error in
@@ -73,7 +73,7 @@ final class MessengerConnectTests: XCTestCase {
     let error = Error()
 
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = {
+    env.cMix.get = {
       var cMix: CMix = .unimplemented
       cMix.getId.run = { 1234 }
       cMix.makeLegacyReceptionIdentity.run = { throw error }
@@ -91,7 +91,7 @@ final class MessengerConnectTests: XCTestCase {
     let error = Error()
 
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = {
+    env.cMix.get = {
       var cMix: CMix = .unimplemented
       cMix.getId.run = { 1234 }
       cMix.makeLegacyReceptionIdentity.run = { .stub }
diff --git a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerE2ETests.swift b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerE2ETests.swift
index bb54fb78..63b9f585 100644
--- a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerE2ETests.swift
+++ b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerE2ETests.swift
@@ -4,17 +4,15 @@ import XXClient
 
 final class MessengerE2ETests: XCTestCase {
   func testE2E() throws {
-    var env: MessengerEnvironment = .unimplemented
-    env.ctx.getE2E = { .unimplemented }
-    let e2e: MessengerE2E = .live(env)
+    let e2e: MessengerE2E = .live()
+
+    XCTAssertNil(e2e())
+
+    e2e.set(.unimplemented)
 
     XCTAssertNotNil(e2e())
-  }
 
-  func testE2EWhenNotSet() throws {
-    var env: MessengerEnvironment = .unimplemented
-    env.ctx.getE2E = { nil }
-    let e2e: MessengerE2E = .live(env)
+    e2e.set(nil)
 
     XCTAssertNil(e2e())
   }
diff --git a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerIsConnectedTests.swift b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerIsConnectedTests.swift
index b361170c..c7c5de8b 100644
--- a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerIsConnectedTests.swift
+++ b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerIsConnectedTests.swift
@@ -4,7 +4,7 @@ import XCTest
 final class MessengerIsConnectedTests: XCTestCase {
   func testWithE2E() {
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getE2E = { .unimplemented }
+    env.e2e.get = { .unimplemented }
     let isConnected: MessengerIsConnected = .live(env)
 
     XCTAssertTrue(isConnected())
@@ -12,7 +12,7 @@ final class MessengerIsConnectedTests: XCTestCase {
 
   func testWithoutE2E() {
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getE2E = { nil }
+    env.e2e.get = { nil }
     let isConnected: MessengerIsConnected = .live(env)
 
     XCTAssertFalse(isConnected())
diff --git a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerIsLoadedTests.swift b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerIsLoadedTests.swift
index a88a1148..6f0591e2 100644
--- a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerIsLoadedTests.swift
+++ b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerIsLoadedTests.swift
@@ -4,7 +4,7 @@ import XCTest
 final class MessengerIsLoadedTests: XCTestCase {
   func testWithCMix() {
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = { .unimplemented }
+    env.cMix.get = { .unimplemented }
     let isLoaded: MessengerIsLoaded = .live(env)
 
     XCTAssertTrue(isLoaded())
@@ -12,7 +12,7 @@ final class MessengerIsLoadedTests: XCTestCase {
 
   func testWithoutCMix() {
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = { nil }
+    env.cMix.get = { nil }
     let isLoaded: MessengerIsLoaded = .live(env)
 
     XCTAssertFalse(isLoaded())
diff --git a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerIsLoggedInTests.swift b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerIsLoggedInTests.swift
index 0bbd8867..c6ea87e6 100644
--- a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerIsLoggedInTests.swift
+++ b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerIsLoggedInTests.swift
@@ -4,7 +4,7 @@ import XCTest
 final class MessengerIsLoggedInTests: XCTestCase {
   func testWithUD() {
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getUD = { .unimplemented }
+    env.ud.get = { .unimplemented }
     let isLoggedIn: MessengerIsLoggedIn = .live(env)
 
     XCTAssertTrue(isLoggedIn())
@@ -12,7 +12,7 @@ final class MessengerIsLoggedInTests: XCTestCase {
 
   func testWithoutUD() {
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getUD = { nil }
+    env.ud.get = { nil }
     let isLoggedIn: MessengerIsLoggedIn = .live(env)
 
     XCTAssertFalse(isLoggedIn())
diff --git a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerIsRegisteredTests.swift b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerIsRegisteredTests.swift
index b11bfbc6..b6dca3e9 100644
--- a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerIsRegisteredTests.swift
+++ b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerIsRegisteredTests.swift
@@ -7,7 +7,7 @@ final class MessengerIsRegisteredTests: XCTestCase {
     var didIsRegisteredWithUD: [Int] = []
 
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getE2E = {
+    env.e2e.get = {
       var e2e: E2E = .unimplemented
       e2e.getId.run = { 1234 }
       return e2e
@@ -24,7 +24,7 @@ final class MessengerIsRegisteredTests: XCTestCase {
 
   func testNotRegistered() throws {
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getE2E = {
+    env.e2e.get = {
       var e2e: E2E = .unimplemented
       e2e.getId.run = { 1234 }
       return e2e
@@ -37,7 +37,7 @@ final class MessengerIsRegisteredTests: XCTestCase {
 
   func testWithoutE2E() {
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getE2E = { nil }
+    env.e2e.get = { nil }
     let isRegistered: MessengerIsRegistered = .live(env)
 
     XCTAssertThrowsError(try isRegistered()) { err in
@@ -53,7 +53,7 @@ final class MessengerIsRegisteredTests: XCTestCase {
     let error = Error()
 
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getE2E = {
+    env.e2e.get = {
       var e2e: E2E = .unimplemented
       e2e.getId.run = { 1234 }
       return e2e
diff --git a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerLoadTests.swift b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerLoadTests.swift
index eecdca12..5eb90e3a 100644
--- a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerLoadTests.swift
+++ b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerLoadTests.swift
@@ -18,7 +18,7 @@ final class MessengerLoadTests: XCTestCase {
     let cMixParams = "cmix-params".data(using: .utf8)!
 
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.setCMix = { didSetCMix.append($0) }
+    env.cMix.set = { didSetCMix.append($0) }
     env.storageDir = storageDir
     env.passwordStorage.load = { password }
     env.getCMixParams.run = { cMixParams }
diff --git a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerLogInTests.swift b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerLogInTests.swift
index 3186d0ac..83dd2cd0 100644
--- a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerLogInTests.swift
+++ b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerLogInTests.swift
@@ -16,12 +16,12 @@ final class MessengerLogInTests: XCTestCase {
     let udAddressFromNDF = "ndf-ud-address"
 
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = {
+    env.cMix.get = {
       var cMix: CMix = .unimplemented
       cMix.networkFollowerStatus.run = { networkFollowerStatus }
       return cMix
     }
-    env.ctx.getE2E = {
+    env.e2e.get = {
       var e2e: E2E = .unimplemented
       e2e.getId.run = { e2eId }
       e2e.getUdCertFromNdf.run = { udCertFromNDF }
@@ -29,7 +29,7 @@ final class MessengerLogInTests: XCTestCase {
       e2e.getUdAddressFromNdf.run = { udAddressFromNDF }
       return e2e
     }
-    env.ctx.setUD = { didSetUD.append($0) }
+    env.ud.set = { didSetUD.append($0) }
     env.udCert = nil
     env.udContact = nil
     env.udAddress = nil
@@ -67,17 +67,17 @@ final class MessengerLogInTests: XCTestCase {
     let altUdAddress = "alt-ud-address"
 
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = {
+    env.cMix.get = {
       var cMix: CMix = .unimplemented
       cMix.networkFollowerStatus.run = { .running }
       return cMix
     }
-    env.ctx.getE2E = {
+    env.e2e.get = {
       var e2e: E2E = .unimplemented
       e2e.getId.run = { e2eId }
       return e2e
     }
-    env.ctx.setUD = { didSetUD.append($0) }
+    env.ud.set = { didSetUD.append($0) }
     env.udCert = altUdCert
     env.udContact = altUdContact
     env.udAddress = altUdAddress
@@ -101,7 +101,7 @@ final class MessengerLogInTests: XCTestCase {
 
   func testLoginWithoutCMix() {
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = { nil }
+    env.cMix.get = { nil }
     let logIn: MessengerLogIn = .live(env)
 
     XCTAssertThrowsError(try logIn()) { error in
@@ -114,8 +114,8 @@ final class MessengerLogInTests: XCTestCase {
 
   func testLoginWithoutE2E() {
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = { .unimplemented }
-    env.ctx.getE2E = { nil }
+    env.cMix.get = { .unimplemented }
+    env.e2e.get = { nil }
     let logIn: MessengerLogIn = .live(env)
 
     XCTAssertThrowsError(try logIn()) { error in
@@ -131,12 +131,12 @@ final class MessengerLogInTests: XCTestCase {
     let error = Error()
 
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = {
+    env.cMix.get = {
       var cMix: CMix = .unimplemented
       cMix.networkFollowerStatus.run = { .running }
       return cMix
     }
-    env.ctx.getE2E = {
+    env.e2e.get = {
       var e2e: E2E = .unimplemented
       e2e.getId.run = { 1234 }
       e2e.getUdCertFromNdf.run = { "ndf-ud-cert".data(using: .utf8)! }
@@ -157,12 +157,12 @@ final class MessengerLogInTests: XCTestCase {
     let error = Error()
 
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = {
+    env.cMix.get = {
       var cMix: CMix = .unimplemented
       cMix.networkFollowerStatus.run = { .running }
       return cMix
     }
-    env.ctx.getE2E = {
+    env.e2e.get = {
       var e2e: E2E = .unimplemented
       e2e.getId.run = { 1234 }
       return e2e
diff --git a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerRegisterTests.swift b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerRegisterTests.swift
index 82f2527b..ef96b251 100644
--- a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerRegisterTests.swift
+++ b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerRegisterTests.swift
@@ -18,7 +18,7 @@ final class MessengerRegisterTests: XCTestCase {
     let username = "new-user-name"
 
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = {
+    env.cMix.get = {
       var cMix: CMix = .unimplemented
       cMix.networkFollowerStatus.run = { networkFollowerStatus }
       cMix.getReceptionRegistrationValidationSignature.run = {
@@ -26,7 +26,7 @@ final class MessengerRegisterTests: XCTestCase {
       }
       return cMix
     }
-    env.ctx.getE2E = {
+    env.e2e.get = {
       var e2e: E2E = .unimplemented
       e2e.getId.run = { e2eId }
       e2e.getUdCertFromNdf.run = { udCertFromNDF }
@@ -34,7 +34,7 @@ final class MessengerRegisterTests: XCTestCase {
       e2e.getUdAddressFromNdf.run = { udAddressFromNDF }
       return e2e
     }
-    env.ctx.setUD = { didSetUD.append($0) }
+    env.ud.set = { didSetUD.append($0) }
     env.udCert = nil
     env.udContact = nil
     env.udAddress = nil
@@ -74,7 +74,7 @@ final class MessengerRegisterTests: XCTestCase {
     let username = "new-user-name"
 
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = {
+    env.cMix.get = {
       var cMix: CMix = .unimplemented
       cMix.networkFollowerStatus.run = { .running }
       cMix.getReceptionRegistrationValidationSignature.run = {
@@ -82,12 +82,12 @@ final class MessengerRegisterTests: XCTestCase {
       }
       return cMix
     }
-    env.ctx.getE2E = {
+    env.e2e.get = {
       var e2e: E2E = .unimplemented
       e2e.getId.run = { e2eId }
       return e2e
     }
-    env.ctx.setUD = { didSetUD.append($0) }
+    env.ud.set = { didSetUD.append($0) }
     env.udCert = altUdCert
     env.udContact = altUdContact
     env.udAddress = altUdAddress
@@ -111,7 +111,7 @@ final class MessengerRegisterTests: XCTestCase {
 
   func testRegisterWithoutCMix() {
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = { nil }
+    env.cMix.get = { nil }
     let register: MessengerRegister = .live(env)
 
     XCTAssertThrowsError(try register(username: "new-user-name")) { error in
@@ -124,8 +124,8 @@ final class MessengerRegisterTests: XCTestCase {
 
   func testRegisterWithoutE2E() {
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = { .unimplemented }
-    env.ctx.getE2E = { nil }
+    env.cMix.get = { .unimplemented }
+    env.e2e.get = { nil }
     let register: MessengerRegister = .live(env)
 
     XCTAssertThrowsError(try register(username: "new-user-name")) { error in
@@ -141,7 +141,7 @@ final class MessengerRegisterTests: XCTestCase {
     let error = Error()
 
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = {
+    env.cMix.get = {
       var cMix: CMix = .unimplemented
       cMix.networkFollowerStatus.run = { .running }
       cMix.getReceptionRegistrationValidationSignature.run = {
@@ -149,7 +149,7 @@ final class MessengerRegisterTests: XCTestCase {
       }
       return cMix
     }
-    env.ctx.getE2E = {
+    env.e2e.get = {
       var e2e: E2E = .unimplemented
       e2e.getId.run = { 1234 }
       e2e.getUdCertFromNdf.run = { "ndf-ud-cert".data(using: .utf8)! }
@@ -170,7 +170,7 @@ final class MessengerRegisterTests: XCTestCase {
     let error = Error()
 
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = {
+    env.cMix.get = {
       var cMix: CMix = .unimplemented
       cMix.networkFollowerStatus.run = { .running }
       cMix.getReceptionRegistrationValidationSignature.run = {
@@ -178,7 +178,7 @@ final class MessengerRegisterTests: XCTestCase {
       }
       return cMix
     }
-    env.ctx.getE2E = {
+    env.e2e.get = {
       var e2e: E2E = .unimplemented
       e2e.getId.run = { 1234 }
       return e2e
diff --git a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerStartTests.swift b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerStartTests.swift
index 1b0f11b4..7b3e33af 100644
--- a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerStartTests.swift
+++ b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerStartTests.swift
@@ -8,7 +8,7 @@ final class MessengerStartTests: XCTestCase {
     var didStartNetworkFollower: [Int] = []
 
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = {
+    env.cMix.get = {
       var cMix: CMix = .unimplemented
       cMix.networkFollowerStatus.run = { .stopped }
       cMix.startNetworkFollower.run = { timeoutMS in
@@ -25,7 +25,7 @@ final class MessengerStartTests: XCTestCase {
 
   func testStartWhenNotLoaded() {
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = { nil }
+    env.cMix.get = { nil }
     let start: MessengerStart = .live(env)
 
     XCTAssertThrowsError(try start()) { error in
@@ -38,7 +38,7 @@ final class MessengerStartTests: XCTestCase {
 
   func testStartWhenRunning() throws {
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = {
+    env.cMix.get = {
       var cMix: CMix = .unimplemented
       cMix.networkFollowerStatus.run = { .running }
       return cMix
@@ -53,7 +53,7 @@ final class MessengerStartTests: XCTestCase {
     let error = Error()
 
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = {
+    env.cMix.get = {
       var cMix: CMix = .unimplemented
       cMix.networkFollowerStatus.run = { .stopped }
       cMix.startNetworkFollower.run = { _ in throw error }
diff --git a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerUDTests.swift b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerUDTests.swift
index 0166a8bb..73f2092c 100644
--- a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerUDTests.swift
+++ b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerUDTests.swift
@@ -4,18 +4,16 @@ import XXClient
 
 final class MessengerUDTests: XCTestCase {
   func testUD() throws {
-    var env: MessengerEnvironment = .unimplemented
-    env.ctx.getE2E = { .unimplemented }
-    let e2e: MessengerE2E = .live(env)
+    let ud: MessengerUD = .live()
 
-    XCTAssertNotNil(e2e())
-  }
+    XCTAssertNil(ud())
+
+    ud.set(.unimplemented)
+
+    XCTAssertNotNil(ud())
 
-  func testE2EWhenNotSet() throws {
-    var env: MessengerEnvironment = .unimplemented
-    env.ctx.getE2E = { nil }
-    let e2e: MessengerE2E = .live(env)
+    ud.set(nil)
 
-    XCTAssertNil(e2e())
+    XCTAssertNil(ud())
   }
 }
diff --git a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerWaitForNetworkTests.swift b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerWaitForNetworkTests.swift
index 9e489226..1dbae735 100644
--- a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerWaitForNetworkTests.swift
+++ b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerWaitForNetworkTests.swift
@@ -8,7 +8,7 @@ final class MessengerWaitForNetworkTests: XCTestCase {
     var didWaitForNetwork: [Int] = []
 
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = {
+    env.cMix.get = {
       var cMix: CMix = .unimplemented
       cMix.waitForNetwork.run = { timeoutMS in
         didWaitForNetwork.append(timeoutMS)
@@ -25,7 +25,7 @@ final class MessengerWaitForNetworkTests: XCTestCase {
 
   func testWaitWhenNotLoaded() {
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = { nil }
+    env.cMix.get = { nil }
     let waitForNetwork: MessengerWaitForNetwork = .live(env)
 
     XCTAssertThrowsError(try waitForNetwork()) { error in
@@ -38,7 +38,7 @@ final class MessengerWaitForNetworkTests: XCTestCase {
 
   func testWaitTimeout() {
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = {
+    env.cMix.get = {
       var cMix: CMix = .unimplemented
       cMix.waitForNetwork.run = { _ in false }
       return cMix
diff --git a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerWaitForNodesTests.swift b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerWaitForNodesTests.swift
index ba1fd941..bc23afb5 100644
--- a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerWaitForNodesTests.swift
+++ b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerWaitForNodesTests.swift
@@ -6,7 +6,7 @@ import XXClient
 final class MessengerWaitForNodesTests: XCTestCase {
   func testWaitWhenNotLoaded() {
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = { nil }
+    env.cMix.get = { nil }
     let waitForNodes: MessengerWaitForNodes = .live(env)
 
     XCTAssertThrowsError(try waitForNodes()) { error in
@@ -21,7 +21,7 @@ final class MessengerWaitForNodesTests: XCTestCase {
     var didProgress: [NodeRegistrationReport] = []
 
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = {
+    env.cMix.get = {
       var cMix: CMix = .unimplemented
       cMix.getNodeRegistrationStatus.run = {
         NodeRegistrationReport(registered: 8, total: 10)
@@ -53,7 +53,7 @@ final class MessengerWaitForNodesTests: XCTestCase {
     ]
 
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = {
+    env.cMix.get = {
       var cMix: CMix = .unimplemented
       cMix.getNodeRegistrationStatus.run = { reports.removeFirst() }
       return cMix
@@ -88,7 +88,7 @@ final class MessengerWaitForNodesTests: XCTestCase {
     ]
 
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = {
+    env.cMix.get = {
       var cMix: CMix = .unimplemented
       cMix.getNodeRegistrationStatus.run = { reports.removeFirst() }
       return cMix
-- 
GitLab