package xyz.dynamic.keychain import expo.modules.kotlin.modules.Module import expo.modules.kotlin.modules.ModuleDefinition import expo.modules.kotlin.Promise class KeychainModule : Module() { private val keyManager = KeyStoreKeyManager() override fun definition() = ModuleDefinition { // NOSONAR (cognitive complexity — inherent to Expo module DSL pattern) Name("Keychain") AsyncFunction("isAvailable") { promise: Promise -> try { val context = appContext.reactContext promise.resolve(keyManager.isAvailable(context)) } catch (e: Exception) { promise.resolve(false) } } AsyncFunction("hasKey") { key: String, promise: Promise -> try { promise.resolve(keyManager.hasKey(key)) } catch (e: Exception) { promise.reject("ERR_KEYCHAIN", "Failed to check key: ${e.message}", e) } } AsyncFunction("generateKeyPair") { key: String, promise: Promise -> try { val publicKey = keyManager.generateKeyPair(key) promise.resolve(mapOf("publicKey" to publicKey)) } catch (e: Exception) { promise.reject("ERR_KEYCHAIN", "Failed to generate key pair: ${e.message}", e) } } AsyncFunction("getPublicKey") { key: String, promise: Promise -> try { val publicKey = keyManager.getPublicKey(key) if (publicKey == null) { promise.resolve(null) } else { promise.resolve(mapOf("publicKey" to publicKey)) } } catch (e: Exception) { promise.reject("ERR_KEYCHAIN", "Failed to get public key: ${e.message}", e) } } AsyncFunction("sign") { key: String, payload: String, promise: Promise -> try { val payloadData = KeyStoreKeyManager.base64urlDecode(payload) val signature = keyManager.sign(key, payloadData) promise.resolve(mapOf("signature" to signature)) } catch (e: Exception) { promise.reject("ERR_KEYCHAIN", "Failed to sign: ${e.message}", e) } } AsyncFunction("deleteKey") { key: String, promise: Promise -> try { keyManager.deleteKey(key) promise.resolve(null) } catch (e: Exception) { promise.reject("ERR_KEYCHAIN", "Failed to delete key: ${e.message}", e) } } } }