ConnectionManagerFactory.kt

package chat.rocket.android.server.infrastructure

import chat.rocket.android.db.DatabaseManagerFactory
import timber.log.Timber
import javax.inject.Inject
import javax.inject.Singleton

@Singleton
class ConnectionManagerFactory @Inject constructor(
    private val factory: RocketChatClientFactory,
    private val dbFactory: DatabaseManagerFactory?
) {
    private val cache = HashMap<String, ConnectionManager>()

    fun create(url: String): ConnectionManager? {
        cache[url]?.let {
            Timber.d("Returning CACHED Manager for: $url")
            return it
        }

        dbFactory?.create(url)?.let { databaseManager ->
            ConnectionManager(factory.get(url), databaseManager).apply {
                cache[url] = this
                Timber.d("Returning FRESH Manager for: $url")
                return this
            }
        }

        return null
    }

    fun get(url: String) = cache[url]
}