PHP WebShell
Текущая директория: /usr/lib/node_modules/bitgo/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react
Просмотр файла: ReactPackageTurboModuleManagerDelegate.kt
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
package com.facebook.react
import com.facebook.jni.HybridData
import com.facebook.react.bridge.CxxModuleWrapper
import com.facebook.react.bridge.ModuleSpec
import com.facebook.react.bridge.NativeModule
import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.internal.featureflags.ReactNativeNewArchitectureFeatureFlags
import com.facebook.react.internal.turbomodule.core.TurboModuleManagerDelegate
import com.facebook.react.module.annotations.ReactModule
import com.facebook.react.module.model.ReactModuleInfo
import com.facebook.react.turbomodule.core.interfaces.TurboModule
import javax.inject.Provider
public abstract class ReactPackageTurboModuleManagerDelegate : TurboModuleManagerDelegate {
internal fun interface ModuleProvider {
fun getModule(moduleName: String): NativeModule?
}
private val moduleProviders = mutableListOf<ModuleProvider>()
private val packageModuleInfos = mutableMapOf<ModuleProvider, Map<String, ReactModuleInfo>>()
private val shouldEnableLegacyModuleInterop =
ReactNativeNewArchitectureFeatureFlags.enableBridgelessArchitecture() &&
ReactNativeNewArchitectureFeatureFlags.useTurboModuleInterop()
protected constructor(
reactApplicationContext: ReactApplicationContext,
packages: List<ReactPackage>
) : super() {
initialize(reactApplicationContext, packages)
}
protected constructor(
reactApplicationContext: ReactApplicationContext,
packages: List<ReactPackage>,
hybridData: HybridData
) : super(hybridData) {
initialize(reactApplicationContext, packages)
}
private fun initialize(
reactApplicationContext: ReactApplicationContext,
packages: List<ReactPackage>
) {
val applicationContext: ReactApplicationContext = reactApplicationContext
for (reactPackage in packages) {
if (reactPackage is BaseReactPackage) {
val moduleProvider = ModuleProvider { moduleName: String ->
reactPackage.getModule(moduleName, applicationContext)
}
moduleProviders.add(moduleProvider)
packageModuleInfos[moduleProvider] =
reactPackage.getReactModuleInfoProvider().getReactModuleInfos()
continue
}
@Suppress("DEPRECATION")
if (shouldSupportLegacyPackages() && reactPackage is LazyReactPackage) {
// TODO(T145105887): Output warnings that LazyReactPackage was used
val lazyPkg = reactPackage
val moduleSpecs: List<ModuleSpec> =
lazyPkg.internal_getNativeModules(reactApplicationContext)
val moduleSpecProviderMap: MutableMap<String?, Provider<out NativeModule>> = mutableMapOf()
for (moduleSpec in moduleSpecs) {
moduleSpecProviderMap[moduleSpec.getName()] = moduleSpec.getProvider()
}
val moduleProvider = ModuleProvider { moduleName: String ->
moduleSpecProviderMap[moduleName]?.get()
}
moduleProviders.add(moduleProvider)
packageModuleInfos[moduleProvider] = lazyPkg.reactModuleInfoProvider.getReactModuleInfos()
continue
}
if (shouldSupportLegacyPackages()) {
// TODO(T145105887): Output warnings that ReactPackage was used
@Suppress("DEPRECATION")
val nativeModules = reactPackage.createNativeModules(reactApplicationContext)
val moduleMap: MutableMap<String, NativeModule> = mutableMapOf()
val reactModuleInfoMap: MutableMap<String, ReactModuleInfo> = mutableMapOf()
for (module in nativeModules) {
val moduleClass: Class<out NativeModule> = module.javaClass
val reactModule = moduleClass.getAnnotation(ReactModule::class.java)
val moduleName = reactModule?.name ?: module.name
@Suppress("DEPRECATION")
val moduleInfo: ReactModuleInfo =
if (reactModule != null)
ReactModuleInfo(
moduleName,
moduleClass.name,
reactModule.canOverrideExistingModule,
true,
reactModule.isCxxModule,
ReactModuleInfo.classIsTurboModule(moduleClass))
else
ReactModuleInfo(
moduleName,
moduleClass.name,
module.canOverrideExistingModule(),
true,
CxxModuleWrapper::class.java.isAssignableFrom(moduleClass),
ReactModuleInfo.classIsTurboModule(moduleClass))
reactModuleInfoMap[moduleName] = moduleInfo
moduleMap[moduleName] = module
}
val moduleProvider = ModuleProvider { module -> moduleMap[module] }
moduleProviders.add(moduleProvider)
packageModuleInfos[moduleProvider] = reactModuleInfoMap
}
}
}
override fun unstable_shouldEnableLegacyModuleInterop(): Boolean = shouldEnableLegacyModuleInterop
override fun getModule(moduleName: String): TurboModule? {
var resolvedModule: NativeModule? = null
for (moduleProvider in moduleProviders) {
val moduleInfo: ReactModuleInfo? = packageModuleInfos[moduleProvider]?.get(moduleName)
if (moduleInfo?.isTurboModule == true &&
(resolvedModule == null || moduleInfo.canOverrideExistingModule)) {
val module = moduleProvider.getModule(moduleName)
if (module != null) {
resolvedModule = module
}
}
}
// Skip TurboModule-incompatible modules
val isLegacyModule = resolvedModule !is TurboModule
if (isLegacyModule) {
return null
}
return resolvedModule as TurboModule
}
override fun unstable_isModuleRegistered(moduleName: String): Boolean {
for (moduleProvider in moduleProviders) {
val moduleInfo: ReactModuleInfo? = packageModuleInfos[moduleProvider]?.get(moduleName)
if (moduleInfo?.isTurboModule == true) {
return true
}
}
return false
}
override fun unstable_isLegacyModuleRegistered(moduleName: String): Boolean {
for (moduleProvider in moduleProviders) {
val moduleInfo: ReactModuleInfo? = packageModuleInfos[moduleProvider]?.get(moduleName)
if (moduleInfo?.isTurboModule == false) {
return true
}
}
return false
}
override fun getLegacyModule(moduleName: String): NativeModule? {
if (!unstable_shouldEnableLegacyModuleInterop()) {
return null
}
var resolvedModule: NativeModule? = null
for (moduleProvider in moduleProviders) {
val moduleInfo: ReactModuleInfo? = packageModuleInfos[moduleProvider]?.get(moduleName)
if (moduleInfo?.isTurboModule == false &&
(resolvedModule == null || moduleInfo.canOverrideExistingModule)) {
val module = moduleProvider.getModule(moduleName)
if (module != null) {
resolvedModule = module
}
}
}
// Skip TurboModule-compatible modules
val isLegacyModule = resolvedModule !is TurboModule
if (!isLegacyModule) {
return null
}
return resolvedModule
}
override fun getEagerInitModuleNames(): List<String> = buildList {
for (moduleProvider in moduleProviders) {
for (moduleInfo in packageModuleInfos[moduleProvider]?.values ?: emptyList()) {
if (moduleInfo.isTurboModule && moduleInfo.needsEagerInit) {
add(moduleInfo.name)
}
}
}
}
private fun shouldSupportLegacyPackages(): Boolean = unstable_shouldEnableLegacyModuleInterop()
public abstract class Builder {
private var packages: List<ReactPackage>? = null
private var context: ReactApplicationContext? = null
public fun setPackages(packages: List<ReactPackage>): Builder {
this.packages = packages.toList()
return this
}
public fun setReactApplicationContext(context: ReactApplicationContext?): Builder {
this.context = context
return this
}
protected abstract fun build(
context: ReactApplicationContext,
packages: List<ReactPackage>
): ReactPackageTurboModuleManagerDelegate
public fun build(): ReactPackageTurboModuleManagerDelegate {
val nonNullContext =
requireNotNull(context) {
"The ReactApplicationContext must be provided to create ReactPackageTurboModuleManagerDelegate"
}
val nonNullPackages =
requireNotNull(packages) {
"A set of ReactPackages must be provided to create ReactPackageTurboModuleManagerDelegate"
}
return build(nonNullContext, nonNullPackages)
}
}
}
Выполнить команду
Для локальной разработки. Не используйте в интернете!