From 9bff6778b9c7a2fe14b0c88547ab37829204691c Mon Sep 17 00:00:00 2001
From: William Walker <wnwalker@ucsc.edu>
Date: Sun, 8 Dec 2024 19:14:15 -0800
Subject: [PATCH] Move dispatcher definition back to common code

---
 .../its/temerity/di/PlatformModule.android.kt     |  5 -----
 .../kotlin/edu/ucsc/its/temerity/core/Temerity.kt | 15 ++++++++-------
 .../kotlin/edu/ucsc/its/temerity/di/LibModule.kt  |  6 +++++-
 .../temerity/extensions/log/WrappingFormatter.kt  |  0
 .../ucsc/its/temerity/di/PlatformModule.jvm.kt    |  5 -----
 5 files changed, 13 insertions(+), 18 deletions(-)
 rename temerity/src/{jvmMain => commonMain}/kotlin/edu/ucsc/its/temerity/extensions/log/WrappingFormatter.kt (100%)

diff --git a/temerity/src/androidMain/kotlin/edu/ucsc/its/temerity/di/PlatformModule.android.kt b/temerity/src/androidMain/kotlin/edu/ucsc/its/temerity/di/PlatformModule.android.kt
index 36750b7..1f39948 100644
--- a/temerity/src/androidMain/kotlin/edu/ucsc/its/temerity/di/PlatformModule.android.kt
+++ b/temerity/src/androidMain/kotlin/edu/ucsc/its/temerity/di/PlatformModule.android.kt
@@ -17,17 +17,12 @@
  */
 package edu.ucsc.its.temerity.di
 
-import edu.ucsc.its.temerity.extensions.coroutines.createDispatcher
 import io.ktor.client.engine.android.Android
 import kotlinx.coroutines.CoroutineDispatcher
-import kotlinx.coroutines.Dispatchers
 import org.koin.core.qualifier.named
 import org.koin.dsl.module
 
 internal actual fun platformModule() = module {
-  single(named("libraryCoroutineDispatcher")) { (threadCount: Int, dispatcherName: String) ->
-    createDispatcher(Dispatchers.IO, threadCount, dispatcherName)
-  }
   single(named("httpClientEngine")) { (libraryCoroutineDispatcher: CoroutineDispatcher) ->
     Android.create {
       dispatcher = libraryCoroutineDispatcher
diff --git a/temerity/src/commonMain/kotlin/edu/ucsc/its/temerity/core/Temerity.kt b/temerity/src/commonMain/kotlin/edu/ucsc/its/temerity/core/Temerity.kt
index 5c7e2c5..6fedf33 100644
--- a/temerity/src/commonMain/kotlin/edu/ucsc/its/temerity/core/Temerity.kt
+++ b/temerity/src/commonMain/kotlin/edu/ucsc/its/temerity/core/Temerity.kt
@@ -69,6 +69,7 @@ import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.async
 import kotlinx.coroutines.awaitAll
 import kotlinx.coroutines.delay
+import kotlinx.coroutines.withContext
 import kotlinx.datetime.DateTimeUnit
 import kotlinx.datetime.LocalDate
 import kotlinx.datetime.LocalTime
@@ -89,11 +90,11 @@ import org.koin.core.logger.Level.WARNING
 import org.koin.core.logger.Logger
 import org.koin.core.logger.MESSAGE
 import org.koin.core.parameter.parametersOf
+import org.koin.core.qualifier.named
 import org.koin.dsl.koinApplication
 import kotlin.time.Duration
 import kotlin.time.Duration.Companion.minutes
 import kotlin.time.DurationUnit.MILLISECONDS
-import org.koin.core.qualifier.named
 import co.touchlab.kermit.Logger as KermitLogger
 import io.ktor.client.plugins.logging.Logger as KtorLogger
 
@@ -115,16 +116,16 @@ public class Temerity internal constructor(
     // TODO: Use this as cache4k expiration time
     public val DEFAULT_CACHE_EXPIRATION: Duration = 15.minutes
     internal const val DEFAULT_MINIMUM_THREAD_COUNT: Int = 2
-    
+
     @JvmStatic
     internal fun createLogger(
       tag: String?,
       config: TemClientConfig?,
-      supportKtxNotebook: Boolean
+      supportKtxNotebook: Boolean,
     ): KermitLogger = LoggerFactory.createLogger(
       tag = tag,
       config = config,
-      supportKtxNotebook = supportKtxNotebook
+      supportKtxNotebook = supportKtxNotebook,
     )
 
     @JvmStatic
@@ -170,7 +171,7 @@ public class Temerity internal constructor(
   }
 
   override val version: String = BuildConfig.LIB_VERSION
-  
+
   /**
    * Kotlinx-serialization [Json] encoder/decoder object used for serializing/deserializing JSON object responses
    */
@@ -253,9 +254,9 @@ public class Temerity internal constructor(
     }
   }
 
-  public override suspend fun getUsers(): List<User> {
+  public override suspend fun getUsers(): List<User> = withContext(libraryCoroutineDispatcher) {
     val userRequest = platformApi.getUsers()
-    return decodeResponseCatching(userRequest.executeApiResponse<String>())
+    decodeResponseCatching(userRequest.executeApiResponse<String>())
   }
 
   public override suspend fun getUser(userId: Long): User =
diff --git a/temerity/src/commonMain/kotlin/edu/ucsc/its/temerity/di/LibModule.kt b/temerity/src/commonMain/kotlin/edu/ucsc/its/temerity/di/LibModule.kt
index d27f07b..95de7e1 100644
--- a/temerity/src/commonMain/kotlin/edu/ucsc/its/temerity/di/LibModule.kt
+++ b/temerity/src/commonMain/kotlin/edu/ucsc/its/temerity/di/LibModule.kt
@@ -24,16 +24,17 @@ import edu.ucsc.its.temerity.api.PlatformApi
 import edu.ucsc.its.temerity.api.createPlatformApi
 import edu.ucsc.its.temerity.core.buildHttpClient
 import edu.ucsc.its.temerity.core.createCommonLogger
+import edu.ucsc.its.temerity.extensions.coroutines.createDispatcher
 import edu.ucsc.its.temerity.extensions.coroutines.createLibraryScope
 import io.ktor.client.HttpClient
 import io.ktor.client.engine.HttpClientEngine
 import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.Dispatchers
 import org.koin.core.parameter.parametersOf
 import org.koin.core.qualifier.named
 import org.koin.dsl.module
 import co.touchlab.kermit.Logger as KermitLogger
 
-
 internal object LibModule {
   /**
    * This function provides the Koin module for the Temerity library.
@@ -43,6 +44,9 @@ internal object LibModule {
     single(named("libraryLogger")) { (tag: String?, config: TemClientConfig?) ->
       createCommonLogger(tag = tag, config = config)
     }
+    single(named("libraryCoroutineDispatcher")) { (threadCount: Int, dispatcherName: String) ->
+      createDispatcher(Dispatchers.IO, threadCount, dispatcherName)
+    }
     single(named("libraryCoroutineScope")) { (dispatcher: CoroutineDispatcher) ->
       createLibraryScope(dispatcher)
     }
diff --git a/temerity/src/jvmMain/kotlin/edu/ucsc/its/temerity/extensions/log/WrappingFormatter.kt b/temerity/src/commonMain/kotlin/edu/ucsc/its/temerity/extensions/log/WrappingFormatter.kt
similarity index 100%
rename from temerity/src/jvmMain/kotlin/edu/ucsc/its/temerity/extensions/log/WrappingFormatter.kt
rename to temerity/src/commonMain/kotlin/edu/ucsc/its/temerity/extensions/log/WrappingFormatter.kt
diff --git a/temerity/src/jvmMain/kotlin/edu/ucsc/its/temerity/di/PlatformModule.jvm.kt b/temerity/src/jvmMain/kotlin/edu/ucsc/its/temerity/di/PlatformModule.jvm.kt
index 31a96ac..a9845de 100644
--- a/temerity/src/jvmMain/kotlin/edu/ucsc/its/temerity/di/PlatformModule.jvm.kt
+++ b/temerity/src/jvmMain/kotlin/edu/ucsc/its/temerity/di/PlatformModule.jvm.kt
@@ -17,17 +17,12 @@
  */
 package edu.ucsc.its.temerity.di
 
-import edu.ucsc.its.temerity.extensions.coroutines.createDispatcher
 import io.ktor.client.engine.java.Java
 import kotlinx.coroutines.CoroutineDispatcher
-import kotlinx.coroutines.Dispatchers
 import org.koin.core.qualifier.named
 import org.koin.dsl.module
 
 internal actual fun platformModule() = module {
-  single(named("libraryCoroutineDispatcher")) { (threadCount: Int, dispatcherName: String) ->
-    createDispatcher(Dispatchers.IO, threadCount, dispatcherName)
-  }
   factory(named("httpClientEngine")) { (libraryCoroutineDispatcher: CoroutineDispatcher) ->
     Java.create {
       dispatcher = libraryCoroutineDispatcher
-- 
GitLab