import com.ustadmobile.core.account.* import com.ustadmobile.core.db.RepSubscriptionInitListener import com.ustadmobile.core.db.UmAppDatabase import com.ustadmobile.core.impl.* import com.ustadmobile.core.impl.nav.UstadNavController import com.ustadmobile.core.schedule.ClazzLogCreatorManager import com.ustadmobile.core.schedule.ClazzLogCreatorManagerJs import com.ustadmobile.core.util.ContentEntryOpener import com.ustadmobile.core.util.DiTag import com.ustadmobile.core.view.ContainerMounter import com.ustadmobile.door.RepositoryConfig import com.ustadmobile.door.entities.NodeIdAndAuth import com.ustadmobile.door.ext.asRepository import com.ustadmobile.lib.db.entities.UmAccount import com.ustadmobile.core.navigation.NavControllerJs import com.ustadmobile.redux.ReduxAppStateManager import com.ustadmobile.redux.ReduxThemeState import com.ustadmobile.util.ContainerMounterJs import com.ustadmobile.xmlpullparserkmp.XmlPullParserFactory import com.ustadmobile.xmlpullparserkmp.XmlSerializer import io.ktor.client.* import io.ktor.client.engine.js.* import io.ktor.client.features.* import io.ktor.client.features.json.* import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.serialization.json.Json import org.kodein.di.* /** * KodeIn DI builder for JS/Browser. */ internal fun ustadJsDi( dbBuilt: UmAppDatabase, dbNodeIdAndAuth: NodeIdAndAuth, appConfigs: HashMap, apiUrl: String, defaultStringsXmlStr: String, displayLocaleStringsXmlStr: String?, ) = DI { bind() with singleton { UstadMobileSystemImpl(XmlPullParserFactory.newInstance(), instance(), defaultStringsXmlStr, displayLocaleStringsXmlStr ).also { impl -> appConfigs.forEach { val value = when(it.key){ AppConfig.KEY_API_URL -> apiUrl else -> it.value } impl.setAppPref(it.key, value, this) } } } bind() with singleton { UstadAccountManager(instance(), this, di) } bind() with scoped(EndpointScope.Default).singleton { dbNodeIdAndAuth } bind(DiTag.TAG_PRESENTER_COROUTINE_SCOPE) with provider { GlobalScope } bind(tag = UmAppDatabase.TAG_DB) with scoped(EndpointScope.Default).singleton { dbBuilt } bind(tag = UmAppDatabase.TAG_REPO) with scoped(EndpointScope.Default).singleton { val nodeIdAndAuth: NodeIdAndAuth = instance() val db = instance(tag = UmAppDatabase.TAG_DB) val repositoryConfig = RepositoryConfig.repositoryConfig( this,context.url+"UmAppDatabase/", nodeIdAndAuth.auth, nodeIdAndAuth.nodeId, instance(), instance() ){ replicationSubscriptionInitListener = RepSubscriptionInitListener() } db.asRepository(repositoryConfig) } constant(UstadMobileSystemCommon.TAG_DOWNLOAD_ENABLED) with false bind() with singleton{ ReduxThemeState(ReduxAppStateManager.getCurrentState().appTheme?.theme) } bind() with singleton { ContainerMounterJs() } bind(tag = DiTag.XPP_FACTORY_NSAWARE) with singleton { XmlPullParserFactory.newInstance().also { it.setNamespaceAware(true) } } bind(tag = DiTag.XPP_FACTORY_NSUNAWARE) with singleton { XmlPullParserFactory.newInstance() } bind() with provider { instance().newSerializer() } bind(tag = UstadMobileSystemCommon.TAG_MAIN_COROUTINE_CONTEXT) with singleton { Dispatchers.Main } bind() with scoped(EndpointScope.Default).singleton { ContentEntryOpener(di, context) } bind() with singleton { HttpClient(Js) { install(JsonFeature) install(HttpTimeout) } } bind() with singleton { NavControllerJs(json = instance()) } bind () with scoped(EndpointScope.Default).singleton{ ContainerStorageManager(context, di) } registerContextTranslator { account: UmAccount -> Endpoint(account.endpointUrl) } bind() with scoped(EndpointScope.Default).singleton { AuthManager(context, di) } bind() with singleton { val systemImpl: UstadMobileSystemImpl = instance() val numIterations = systemImpl.getAppConfigInt( AppConfig.KEY_PBKDF2_ITERATIONS, UstadMobileConstants.PBKDF2_ITERATIONS, this) val keyLength = systemImpl.getAppConfigInt( AppConfig.KEY_PBKDF2_KEYLENGTH, UstadMobileConstants.PBKDF2_KEYLENGTH, this) Pbkdf2Params(numIterations, keyLength) } bind() with singleton { ClazzLogCreatorManagerJs() } bind() with singleton { Json { encodeDefaults = true ignoreUnknownKeys = true } } }