package com.xxhash import android.util.Log import com.facebook.react.bridge.ReactApplicationContext import com.facebook.react.common.annotations.FrameworkAPI // New Architecture / bridgeless module: extends the codegen-generated // NativeXxhashSpec so hash128/hash64 are real TurboModule methods, reachable // from JS via TurboModuleRegistry.getEnforcing('xxhash') as a synchronous // fallback. The faster JSI globals (__xxhash128/__xxhash64) are installed // eagerly in initialize(). class XxhashModule internal constructor(private val reactContext: ReactApplicationContext) : NativeXxhashSpec(reactContext) { companion object { const val NAME = "xxhash" init { System.loadLibrary("react-native-xxhash") } @OptIn(FrameworkAPI::class) @JvmStatic external fun nativeInstall(jsiRuntimePointer: Long) @JvmStatic external fun nativeHash128(input: String): String @JvmStatic external fun nativeHash64(input: String): String } override fun getName(): String = NAME // Install the JSI globals eagerly once the context is ready so // __xxhash128/__xxhash64 are available before the first hash. Guarded so a // null/zero javaScriptContextHolder (possible under bridgeless) can never NPE. override fun initialize() { super.initialize() tryInstall() } // Synchronous TurboModule fallback hashers (same xxhash::make_hash_* as the // JSI path) used when the JSI globals aren't installed yet. override fun hash128(input: String): String = nativeHash128(input) override fun hash64(input: String): String = nativeHash64(input) @OptIn(FrameworkAPI::class) private fun tryInstall(): Boolean { val pointer = reactContext.javaScriptContextHolder?.get() ?: 0L if (pointer == 0L) { Log.w("xxhash", "install skipped: no JSI runtime pointer (bridgeless?)") return false } nativeInstall(pointer) return true } }