@dynamic-labs-sdk/client 0.26.7 → 0.26.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/dist/{InvalidParamError-WXK434H2.esm.js → InvalidParamError-0lP4zZBe.esm.js} +2 -2
  2. package/dist/{InvalidParamError-WXK434H2.esm.js.map → InvalidParamError-0lP4zZBe.esm.js.map} +1 -1
  3. package/dist/{InvalidParamError-F90z0K5r.native.esm.js → InvalidParamError-CY4JGkjq.native.esm.js} +2 -2
  4. package/dist/{InvalidParamError-F90z0K5r.native.esm.js.map → InvalidParamError-CY4JGkjq.native.esm.js.map} +1 -1
  5. package/dist/{InvalidParamError-DFpM4bIX.cjs → InvalidParamError-Cu4kK02f.cjs} +3 -3
  6. package/dist/{InvalidParamError-DFpM4bIX.cjs.map → InvalidParamError-Cu4kK02f.cjs.map} +1 -1
  7. package/dist/{NotWaasWalletAccountError-D_qlVMCG.esm.js → NotWaasWalletAccountError-BAD01hkG.esm.js} +3 -3
  8. package/dist/{NotWaasWalletAccountError-D_qlVMCG.esm.js.map → NotWaasWalletAccountError-BAD01hkG.esm.js.map} +1 -1
  9. package/dist/{NotWaasWalletAccountError-DbzO2LzZ.cjs → NotWaasWalletAccountError-CWKsiVqV.cjs} +3 -3
  10. package/dist/{NotWaasWalletAccountError-DbzO2LzZ.cjs.map → NotWaasWalletAccountError-CWKsiVqV.cjs.map} +1 -1
  11. package/dist/{NotWaasWalletAccountError-QZZmjyhq.native.esm.js → NotWaasWalletAccountError-DYuQuYeI.native.esm.js} +3 -3
  12. package/dist/{NotWaasWalletAccountError-QZZmjyhq.native.esm.js.map → NotWaasWalletAccountError-DYuQuYeI.native.esm.js.map} +1 -1
  13. package/dist/core.cjs +5 -5
  14. package/dist/core.esm.js +5 -5
  15. package/dist/core.native.esm.js +5 -5
  16. package/dist/core.native.esm.js.map +1 -1
  17. package/dist/{getNetworkProviderFromNetworkId-DbR2qejA.native.esm.js → getNetworkProviderFromNetworkId-Cjj23n1Y.native.esm.js} +3 -3
  18. package/dist/getNetworkProviderFromNetworkId-Cjj23n1Y.native.esm.js.map +1 -0
  19. package/dist/{getNetworkProviderFromNetworkId-BVurb9VE.esm.js → getNetworkProviderFromNetworkId-D1mT7AfE.esm.js} +3 -3
  20. package/dist/{getNetworkProviderFromNetworkId-BVurb9VE.esm.js.map → getNetworkProviderFromNetworkId-D1mT7AfE.esm.js.map} +1 -1
  21. package/dist/{getNetworkProviderFromNetworkId-BV9lOcuP.cjs → getNetworkProviderFromNetworkId-VDuMPEtz.cjs} +3 -3
  22. package/dist/{getNetworkProviderFromNetworkId-BV9lOcuP.cjs.map → getNetworkProviderFromNetworkId-VDuMPEtz.cjs.map} +1 -1
  23. package/dist/{getSignedSessionId-DXtxIjxF.native.esm.js → getSignedSessionId-BGFoe3gh.native.esm.js} +3 -3
  24. package/dist/{getSignedSessionId-DXtxIjxF.native.esm.js.map → getSignedSessionId-BGFoe3gh.native.esm.js.map} +1 -1
  25. package/dist/{getSignedSessionId-DFiqF8_b.esm.js → getSignedSessionId-DQr-WJ3a.esm.js} +3 -3
  26. package/dist/{getSignedSessionId-DFiqF8_b.esm.js.map → getSignedSessionId-DQr-WJ3a.esm.js.map} +1 -1
  27. package/dist/{getSignedSessionId-CNkcX15D.cjs → getSignedSessionId-qeRsJErq.cjs} +3 -3
  28. package/dist/{getSignedSessionId-CNkcX15D.cjs.map → getSignedSessionId-qeRsJErq.cjs.map} +1 -1
  29. package/dist/{getVerifiedCredentialForWalletAccount-CHIZTYim.native.esm.js → getVerifiedCredentialForWalletAccount-BCPvaJ1V.native.esm.js} +2 -2
  30. package/dist/{getVerifiedCredentialForWalletAccount-CHIZTYim.native.esm.js.map → getVerifiedCredentialForWalletAccount-BCPvaJ1V.native.esm.js.map} +1 -1
  31. package/dist/{getVerifiedCredentialForWalletAccount-4eVkx2ZN.cjs → getVerifiedCredentialForWalletAccount-CjPzTFHz.cjs} +3 -3
  32. package/dist/{getVerifiedCredentialForWalletAccount-4eVkx2ZN.cjs.map → getVerifiedCredentialForWalletAccount-CjPzTFHz.cjs.map} +1 -1
  33. package/dist/{getVerifiedCredentialForWalletAccount-6di80gqF.esm.js → getVerifiedCredentialForWalletAccount-DEkVcH8j.esm.js} +2 -2
  34. package/dist/{getVerifiedCredentialForWalletAccount-6di80gqF.esm.js.map → getVerifiedCredentialForWalletAccount-DEkVcH8j.esm.js.map} +1 -1
  35. package/dist/index.cjs +5 -5
  36. package/dist/index.esm.js +5 -5
  37. package/dist/index.native.esm.js +5 -5
  38. package/dist/index.native.esm.js.map +1 -1
  39. package/dist/{isMfaRequiredForAction-DKSH9YEU.esm.js → isMfaRequiredForAction-CTghrtq8.esm.js} +2 -2
  40. package/dist/{isMfaRequiredForAction-DKSH9YEU.esm.js.map → isMfaRequiredForAction-CTghrtq8.esm.js.map} +1 -1
  41. package/dist/{isMfaRequiredForAction-cJ294BGH.native.esm.js → isMfaRequiredForAction-DaZoGOB-.native.esm.js} +2 -2
  42. package/dist/{isMfaRequiredForAction-cJ294BGH.native.esm.js.map → isMfaRequiredForAction-DaZoGOB-.native.esm.js.map} +1 -1
  43. package/dist/{isMfaRequiredForAction-ZwjmqVg-.cjs → isMfaRequiredForAction-qSv2yrfd.cjs} +2 -2
  44. package/dist/{isMfaRequiredForAction-ZwjmqVg-.cjs.map → isMfaRequiredForAction-qSv2yrfd.cjs.map} +1 -1
  45. package/dist/tsconfig.lib.tsbuildinfo +1 -1
  46. package/dist/waas.cjs +4 -4
  47. package/dist/waas.esm.js +3 -3
  48. package/dist/waas.native.esm.js +3 -3
  49. package/dist/waasCore.cjs +4 -4
  50. package/dist/waasCore.esm.js +3 -3
  51. package/dist/waasCore.native.esm.js +3 -3
  52. package/package.json +3 -43
  53. package/android/build.gradle +0 -71
  54. package/android/src/main/java/xyz/dynamic/client/DynamicClientPackage.kt +0 -42
  55. package/android/src/main/java/xyz/dynamic/client/keychain/KeyStoreKeyManager.kt +0 -147
  56. package/android/src/main/java/xyz/dynamic/client/keychain/KeychainModule.kt +0 -85
  57. package/android/src/main/java/xyz/dynamic/client/manifest/ReactNativeManifestModule.kt +0 -25
  58. package/dist/getNetworkProviderFromNetworkId-DbR2qejA.native.esm.js.map +0 -1
  59. package/dynamic-labs-sdk-client.podspec +0 -27
  60. package/ios/Keychain.h +0 -4
  61. package/ios/Keychain.mm +0 -101
  62. package/ios/ReactNativeManifest.h +0 -4
  63. package/ios/ReactNativeManifest.mm +0 -45
  64. package/ios/ReactNativeManifestImpl.swift +0 -20
  65. package/ios/SecureEnclaveKeyManager.swift +0 -180
  66. package/react-native.config.cjs +0 -14
  67. package/src/turboModules/NativeKeychain.native.spec.ts +0 -45
  68. package/src/turboModules/NativeKeychain.ts +0 -21
  69. package/src/turboModules/NativeReactNativeManifest.native.spec.ts +0 -55
  70. package/src/turboModules/NativeReactNativeManifest.ts +0 -29
package/dist/waas.cjs CHANGED
@@ -1,7 +1,7 @@
1
- const require_getNetworkProviderFromNetworkId = require('./getNetworkProviderFromNetworkId-BV9lOcuP.cjs');
2
- const require_InvalidParamError = require('./InvalidParamError-DFpM4bIX.cjs');
3
- const require_getVerifiedCredentialForWalletAccount = require('./getVerifiedCredentialForWalletAccount-4eVkx2ZN.cjs');
4
- const require_NotWaasWalletAccountError = require('./NotWaasWalletAccountError-DbzO2LzZ.cjs');
1
+ const require_getNetworkProviderFromNetworkId = require('./getNetworkProviderFromNetworkId-VDuMPEtz.cjs');
2
+ const require_InvalidParamError = require('./InvalidParamError-Cu4kK02f.cjs');
3
+ const require_getVerifiedCredentialForWalletAccount = require('./getVerifiedCredentialForWalletAccount-CjPzTFHz.cjs');
4
+ const require_NotWaasWalletAccountError = require('./NotWaasWalletAccountError-CWKsiVqV.cjs');
5
5
  let _dynamic_labs_sdk_assert_package_version = require("@dynamic-labs-sdk/assert-package-version");
6
6
  let _dynamic_labs_sdk_api_core = require("@dynamic-labs/sdk-api-core");
7
7
 
package/dist/waas.esm.js CHANGED
@@ -1,6 +1,6 @@
1
- import { B as name, F as getDefaultClient, R as BaseError, V as version, i as DYNAMIC_WAAS_METADATA, s as __getChainFromVerifiedCredentialChain_wrapped, w as assertDefined } from "./InvalidParamError-WXK434H2.esm.js";
2
- import { c as findWaasWalletProviderByChain, h as __getWalletProviderFromWalletAccount_wrapped, l as isWaasWalletProvider, n as getWalletProviderByKey, s as isWaasWalletAccount, t as __getVerifiedCredentialForWalletAccount_wrapped, x as formatWalletProviderKey, y as NoWalletProviderFoundError } from "./getVerifiedCredentialForWalletAccount-6di80gqF.esm.js";
3
- import { n as __refreshAuth_wrapped, t as NotWaasWalletAccountError } from "./NotWaasWalletAccountError-D_qlVMCG.esm.js";
1
+ import { B as name, F as getDefaultClient, R as BaseError, V as version, i as DYNAMIC_WAAS_METADATA, s as __getChainFromVerifiedCredentialChain_wrapped, w as assertDefined } from "./InvalidParamError-0lP4zZBe.esm.js";
2
+ import { c as findWaasWalletProviderByChain, h as __getWalletProviderFromWalletAccount_wrapped, l as isWaasWalletProvider, n as getWalletProviderByKey, s as isWaasWalletAccount, t as __getVerifiedCredentialForWalletAccount_wrapped, x as formatWalletProviderKey, y as NoWalletProviderFoundError } from "./getVerifiedCredentialForWalletAccount-DEkVcH8j.esm.js";
3
+ import { n as __refreshAuth_wrapped, t as NotWaasWalletAccountError } from "./NotWaasWalletAccountError-BAD01hkG.esm.js";
4
4
  import { assertPackageVersion } from "@dynamic-labs-sdk/assert-package-version";
5
5
  import { EmbeddedWalletVersionEnum, JwtVerifiedCredentialFormatEnum, WalletProviderEnum } from "@dynamic-labs/sdk-api-core";
6
6
 
@@ -1,6 +1,6 @@
1
- import { B as name, F as getDefaultClient, R as BaseError, V as version, i as DYNAMIC_WAAS_METADATA, s as __getChainFromVerifiedCredentialChain_wrapped, w as assertDefined } from "./InvalidParamError-F90z0K5r.native.esm.js";
2
- import { c as findWaasWalletProviderByChain, h as __getWalletProviderFromWalletAccount_wrapped, l as isWaasWalletProvider, n as getWalletProviderByKey, s as isWaasWalletAccount, t as __getVerifiedCredentialForWalletAccount_wrapped, x as formatWalletProviderKey, y as NoWalletProviderFoundError } from "./getVerifiedCredentialForWalletAccount-CHIZTYim.native.esm.js";
3
- import { n as __refreshAuth_wrapped, t as NotWaasWalletAccountError } from "./NotWaasWalletAccountError-QZZmjyhq.native.esm.js";
1
+ import { B as name, F as getDefaultClient, R as BaseError, V as version, i as DYNAMIC_WAAS_METADATA, s as __getChainFromVerifiedCredentialChain_wrapped, w as assertDefined } from "./InvalidParamError-CY4JGkjq.native.esm.js";
2
+ import { c as findWaasWalletProviderByChain, h as __getWalletProviderFromWalletAccount_wrapped, l as isWaasWalletProvider, n as getWalletProviderByKey, s as isWaasWalletAccount, t as __getVerifiedCredentialForWalletAccount_wrapped, x as formatWalletProviderKey, y as NoWalletProviderFoundError } from "./getVerifiedCredentialForWalletAccount-BCPvaJ1V.native.esm.js";
3
+ import { n as __refreshAuth_wrapped, t as NotWaasWalletAccountError } from "./NotWaasWalletAccountError-DYuQuYeI.native.esm.js";
4
4
  import { assertPackageVersion } from "@dynamic-labs-sdk/assert-package-version";
5
5
  import { EmbeddedWalletVersionEnum, JwtVerifiedCredentialFormatEnum, WalletProviderEnum } from "@dynamic-labs/sdk-api-core";
6
6
 
package/dist/waasCore.cjs CHANGED
@@ -1,7 +1,7 @@
1
- const require_getNetworkProviderFromNetworkId = require('./getNetworkProviderFromNetworkId-BV9lOcuP.cjs');
2
- const require_InvalidParamError = require('./InvalidParamError-DFpM4bIX.cjs');
3
- require('./isMfaRequiredForAction-ZwjmqVg-.cjs');
4
- const require_getSignedSessionId = require('./getSignedSessionId-CNkcX15D.cjs');
1
+ const require_getNetworkProviderFromNetworkId = require('./getNetworkProviderFromNetworkId-VDuMPEtz.cjs');
2
+ const require_InvalidParamError = require('./InvalidParamError-Cu4kK02f.cjs');
3
+ require('./isMfaRequiredForAction-qSv2yrfd.cjs');
4
+ const require_getSignedSessionId = require('./getSignedSessionId-qeRsJErq.cjs');
5
5
  let _dynamic_labs_sdk_assert_package_version = require("@dynamic-labs-sdk/assert-package-version");
6
6
  let _dynamic_labs_sdk_api_core = require("@dynamic-labs/sdk-api-core");
7
7
  let _dynamic_labs_wallet_browser_wallet_client = require("@dynamic-labs-wallet/browser-wallet-client");
@@ -1,6 +1,6 @@
1
- import { B as name, C as isCookieEnabled, M as CLIENT_SDK_NAME, V as version, c as CHAINS_INFO_MAP, i as DYNAMIC_WAAS_METADATA, n as DEFAULT_WAAS_BASE_API_URL, r as DEFAULT_WAAS_BASE_MPC_RELAY_API_URL, s as __getChainFromVerifiedCredentialChain_wrapped, t as InvalidParamError, z as getCore } from "./InvalidParamError-WXK434H2.esm.js";
2
- import "./isMfaRequiredForAction-DKSH9YEU.esm.js";
3
- import { n as __consumeMfaTokenIfRequiredForAction_wrapped, t as __getSignedSessionId_wrapped } from "./getSignedSessionId-DFiqF8_b.esm.js";
1
+ import { B as name, C as isCookieEnabled, M as CLIENT_SDK_NAME, V as version, c as CHAINS_INFO_MAP, i as DYNAMIC_WAAS_METADATA, n as DEFAULT_WAAS_BASE_API_URL, r as DEFAULT_WAAS_BASE_MPC_RELAY_API_URL, s as __getChainFromVerifiedCredentialChain_wrapped, t as InvalidParamError, z as getCore } from "./InvalidParamError-0lP4zZBe.esm.js";
2
+ import "./isMfaRequiredForAction-CTghrtq8.esm.js";
3
+ import { n as __consumeMfaTokenIfRequiredForAction_wrapped, t as __getSignedSessionId_wrapped } from "./getSignedSessionId-DQr-WJ3a.esm.js";
4
4
  import { assertPackageVersion } from "@dynamic-labs-sdk/assert-package-version";
5
5
  import { MFAAction, WalletProviderEnum } from "@dynamic-labs/sdk-api-core";
6
6
  import { DynamicWalletClient, ThresholdSignatureScheme, WalletOperation } from "@dynamic-labs-wallet/browser-wallet-client";
@@ -1,6 +1,6 @@
1
- import { B as name, C as isCookieEnabled, M as CLIENT_SDK_NAME, V as version, c as CHAINS_INFO_MAP, i as DYNAMIC_WAAS_METADATA, n as DEFAULT_WAAS_BASE_API_URL, r as DEFAULT_WAAS_BASE_MPC_RELAY_API_URL, s as __getChainFromVerifiedCredentialChain_wrapped, t as InvalidParamError, z as getCore } from "./InvalidParamError-F90z0K5r.native.esm.js";
2
- import "./isMfaRequiredForAction-cJ294BGH.native.esm.js";
3
- import { n as __consumeMfaTokenIfRequiredForAction_wrapped, t as __getSignedSessionId_wrapped } from "./getSignedSessionId-DXtxIjxF.native.esm.js";
1
+ import { B as name, C as isCookieEnabled, M as CLIENT_SDK_NAME, V as version, c as CHAINS_INFO_MAP, i as DYNAMIC_WAAS_METADATA, n as DEFAULT_WAAS_BASE_API_URL, r as DEFAULT_WAAS_BASE_MPC_RELAY_API_URL, s as __getChainFromVerifiedCredentialChain_wrapped, t as InvalidParamError, z as getCore } from "./InvalidParamError-CY4JGkjq.native.esm.js";
2
+ import "./isMfaRequiredForAction-DaZoGOB-.native.esm.js";
3
+ import { n as __consumeMfaTokenIfRequiredForAction_wrapped, t as __getSignedSessionId_wrapped } from "./getSignedSessionId-BGFoe3gh.native.esm.js";
4
4
  import { assertPackageVersion } from "@dynamic-labs-sdk/assert-package-version";
5
5
  import { MFAAction, WalletProviderEnum } from "@dynamic-labs/sdk-api-core";
6
6
  import { DynamicWalletClient, ThresholdSignatureScheme, WalletOperation } from "@dynamic-labs-wallet/browser-wallet-client";
package/package.json CHANGED
@@ -1,40 +1,31 @@
1
1
  {
2
2
  "name": "@dynamic-labs-sdk/client",
3
- "version": "0.26.7",
3
+ "version": "0.26.9",
4
4
  "type": "module",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.esm.js",
7
7
  "types": "./dist/exports/index.d.ts",
8
8
  "files": [
9
- "dist",
10
- "ios",
11
- "android",
12
- "dynamic-labs-sdk-client.podspec",
13
- "react-native.config.cjs",
14
- "src/turboModules"
9
+ "dist"
15
10
  ],
16
11
  "exports": {
17
12
  "./package.json": "./package.json",
18
13
  ".": {
19
- "react-native": "./dist/index.native.esm.js",
20
14
  "types": "./dist/exports/index.d.ts",
21
15
  "import": "./dist/index.esm.js",
22
16
  "default": "./dist/index.cjs"
23
17
  },
24
18
  "./core": {
25
- "react-native": "./dist/core.native.esm.js",
26
19
  "types": "./dist/exports/core.d.ts",
27
20
  "import": "./dist/core.esm.js",
28
21
  "default": "./dist/core.cjs"
29
22
  },
30
23
  "./waas": {
31
- "react-native": "./dist/waas.native.esm.js",
32
24
  "types": "./dist/exports/waas.d.ts",
33
25
  "import": "./dist/waas.esm.js",
34
26
  "default": "./dist/waas.cjs"
35
27
  },
36
28
  "./waas/core": {
37
- "react-native": "./dist/waasCore.native.esm.js",
38
29
  "types": "./dist/exports/waasCore.d.ts",
39
30
  "import": "./dist/waasCore.esm.js",
40
31
  "default": "./dist/waasCore.cjs"
@@ -48,43 +39,12 @@
48
39
  "buffer": "6.0.3",
49
40
  "eventemitter3": "5.0.1",
50
41
  "zod": "4.0.5",
51
- "@dynamic-labs-sdk/assert-package-version": "0.26.7"
42
+ "@dynamic-labs-sdk/assert-package-version": "0.26.9"
52
43
  },
53
44
  "devDependencies": {
54
45
  "@inrupt/jest-jsdom-polyfills": "4.0.5",
55
- "@react-native-async-storage/async-storage": "2.2.0",
56
- "react-native-keychain": "10.0.0",
57
- "react-native-passkey": "3.3.2",
58
46
  "vitest": "1.6.1"
59
47
  },
60
- "codegenConfig": {
61
- "name": "DynamicClientSpec",
62
- "type": "modules",
63
- "jsSrcsDir": "src/turboModules",
64
- "android": {
65
- "javaPackageName": "xyz.dynamic.client"
66
- }
67
- },
68
- "peerDependencies": {
69
- "@react-native-async-storage/async-storage": "^2.2.0",
70
- "react-native": ">=0.73.6",
71
- "react-native-keychain": "^10.0.0",
72
- "react-native-passkey": ">=3.3.2"
73
- },
74
- "peerDependenciesMeta": {
75
- "@react-native-async-storage/async-storage": {
76
- "optional": true
77
- },
78
- "react-native-keychain": {
79
- "optional": true
80
- },
81
- "react-native": {
82
- "optional": true
83
- },
84
- "react-native-passkey": {
85
- "optional": true
86
- }
87
- },
88
48
  "scripts": {
89
49
  "build": "rm -rf dist && tsdown && pnpm exec tsc --emitDeclarationOnly -p ./tsconfig.lib.json && pnpm exec tsc --noEmit -p ./tsconfig.lib.native.json",
90
50
  "lint": "eslint .",
@@ -1,71 +0,0 @@
1
- buildscript {
2
- repositories {
3
- google()
4
- mavenCentral()
5
- }
6
- dependencies {
7
- classpath "com.android.tools.build:gradle:8.7.2"
8
- }
9
- }
10
-
11
- apply plugin: "com.android.library"
12
- apply plugin: "com.facebook.react"
13
- apply plugin: "org.jetbrains.kotlin.android"
14
-
15
- import groovy.json.JsonSlurper
16
-
17
- def packageJson = new JsonSlurper().parseText(file("../package.json").text)
18
- def sdkVersion = packageJson.version
19
-
20
- def safeExtGet(prop, fallback) {
21
- return rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback
22
- }
23
-
24
- android {
25
- namespace "xyz.dynamic.client"
26
-
27
- compileSdkVersion safeExtGet("compileSdkVersion", 35)
28
-
29
- defaultConfig {
30
- minSdkVersion safeExtGet("minSdkVersion", 24)
31
- targetSdkVersion safeExtGet("targetSdkVersion", 35)
32
- buildConfigField "String", "DYNAMIC_SDK_VERSION", "\"${sdkVersion}\""
33
- }
34
-
35
- buildFeatures {
36
- buildConfig true
37
- }
38
-
39
- buildTypes {
40
- release {
41
- minifyEnabled false
42
- }
43
- }
44
-
45
- compileOptions {
46
- sourceCompatibility JavaVersion.VERSION_17
47
- targetCompatibility JavaVersion.VERSION_17
48
- }
49
-
50
- kotlinOptions {
51
- jvmTarget = "17"
52
- }
53
-
54
- sourceSets {
55
- main {
56
- java.srcDirs += [
57
- "generated/java",
58
- "generated/jni"
59
- ]
60
- }
61
- }
62
- }
63
-
64
- repositories {
65
- mavenCentral()
66
- google()
67
- }
68
-
69
- dependencies {
70
- implementation "com.facebook.react:react-android"
71
- }
@@ -1,42 +0,0 @@
1
- package xyz.dynamic.client
2
-
3
- import com.facebook.react.BaseReactPackage
4
- import com.facebook.react.bridge.NativeModule
5
- import com.facebook.react.bridge.ReactApplicationContext
6
- import com.facebook.react.module.model.ReactModuleInfo
7
- import com.facebook.react.module.model.ReactModuleInfoProvider
8
- import xyz.dynamic.client.keychain.KeychainModule
9
- import xyz.dynamic.client.manifest.ReactNativeManifestModule
10
-
11
- class DynamicClientPackage : BaseReactPackage() {
12
- override fun getModule(name: String, reactContext: ReactApplicationContext): NativeModule? {
13
- return when (name) {
14
- KeychainModule.NAME -> KeychainModule(reactContext)
15
- ReactNativeManifestModule.NAME -> ReactNativeManifestModule(reactContext)
16
- else -> null
17
- }
18
- }
19
-
20
- override fun getReactModuleInfoProvider(): ReactModuleInfoProvider {
21
- return ReactModuleInfoProvider {
22
- mapOf(
23
- KeychainModule.NAME to ReactModuleInfo(
24
- KeychainModule.NAME,
25
- KeychainModule.NAME,
26
- false,
27
- false,
28
- false,
29
- true
30
- ),
31
- ReactNativeManifestModule.NAME to ReactModuleInfo(
32
- ReactNativeManifestModule.NAME,
33
- ReactNativeManifestModule.NAME,
34
- false,
35
- false,
36
- false,
37
- true
38
- )
39
- )
40
- }
41
- }
42
- }
@@ -1,147 +0,0 @@
1
- package xyz.dynamic.client.keychain
2
-
3
- import android.content.Context
4
- import android.content.pm.PackageManager
5
- import android.os.Build
6
- import android.security.keystore.KeyGenParameterSpec
7
- import android.security.keystore.KeyProperties
8
- import android.security.keystore.StrongBoxUnavailableException
9
- import java.security.KeyPairGenerator
10
- import java.security.KeyStore
11
- import java.security.Signature
12
- import java.security.spec.ECGenParameterSpec
13
-
14
- /**
15
- * Android KeyStore key manager backed by hardware TEE/StrongBox.
16
- * Provides P-256 key generation, signing, and management.
17
- * All public keys are returned in uncompressed SEC1 format (65 bytes: 04 || x || y).
18
- * All binary data uses base64url encoding (RFC 4648 S5, no padding).
19
- */
20
- class KeyStoreKeyManager {
21
-
22
- fun isAvailable(context: Context?): Boolean {
23
- return try {
24
- val keyStore = KeyStore.getInstance(ANDROID_KEYSTORE)
25
- keyStore.load(null)
26
- val hasStrongBox = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P && context != null) {
27
- context.packageManager.hasSystemFeature(PackageManager.FEATURE_STRONGBOX_KEYSTORE)
28
- } else {
29
- false
30
- }
31
- // Even without StrongBox, Android KeyStore provides TEE-backed keys on most devices
32
- hasStrongBox || Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
33
- } catch (e: Exception) {
34
- false
35
- }
36
- }
37
-
38
- fun hasKey(alias: String): Boolean {
39
- val keyStore = loadKeyStore()
40
- return keyStore.containsAlias(alias)
41
- }
42
-
43
- fun generateKeyPair(alias: String): String {
44
- require(!hasKey(alias)) { "Key already exists for alias: $alias" }
45
-
46
- val specBuilder = KeyGenParameterSpec.Builder(
47
- alias,
48
- KeyProperties.PURPOSE_SIGN or KeyProperties.PURPOSE_VERIFY
49
- )
50
- .setAlgorithmParameterSpec(ECGenParameterSpec("secp256r1"))
51
- .setDigests(KeyProperties.DIGEST_SHA256)
52
-
53
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
54
- specBuilder.setIsStrongBoxBacked(true)
55
- }
56
-
57
- val keyPair = try {
58
- val kpg = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_EC, ANDROID_KEYSTORE)
59
- kpg.initialize(specBuilder.build())
60
- kpg.generateKeyPair()
61
- } catch (e: Exception) {
62
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P && e is StrongBoxUnavailableException) {
63
- // Fallback: retry without StrongBox on TEE
64
- specBuilder.setIsStrongBoxBacked(false)
65
- val kpg = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_EC, ANDROID_KEYSTORE)
66
- kpg.initialize(specBuilder.build())
67
- kpg.generateKeyPair()
68
- } else {
69
- throw e
70
- }
71
- }
72
-
73
- val publicKeyBytes = extractUncompressedPublicKey(keyPair.public.encoded)
74
- return base64urlEncode(publicKeyBytes)
75
- }
76
-
77
- fun getPublicKey(alias: String): String? {
78
- val keyStore = loadKeyStore()
79
- val entry = keyStore.getEntry(alias, null)
80
-
81
- if (entry == null || entry !is KeyStore.PrivateKeyEntry) {
82
- return null
83
- }
84
-
85
- val publicKeyBytes = extractUncompressedPublicKey(entry.certificate.publicKey.encoded)
86
- return base64urlEncode(publicKeyBytes)
87
- }
88
-
89
- fun sign(alias: String, payload: ByteArray): String {
90
- val keyStore = loadKeyStore()
91
- val entry = keyStore.getEntry(alias, null)
92
-
93
- require(entry != null && entry is KeyStore.PrivateKeyEntry) { "Key not found: $alias" }
94
-
95
- val signature = Signature.getInstance("SHA256withECDSA")
96
- signature.initSign(entry.privateKey)
97
- signature.update(payload)
98
- val signatureBytes = signature.sign()
99
-
100
- return base64urlEncode(signatureBytes)
101
- }
102
-
103
- fun deleteKey(alias: String) {
104
- val keyStore = loadKeyStore()
105
- keyStore.deleteEntry(alias)
106
- }
107
-
108
- // region Private helpers
109
-
110
- private fun loadKeyStore(): KeyStore {
111
- val keyStore = KeyStore.getInstance(ANDROID_KEYSTORE)
112
- keyStore.load(null)
113
- return keyStore
114
- }
115
-
116
- /**
117
- * Extract uncompressed SEC1 public key (65 bytes: 04 || x || y)
118
- * from X.509 SubjectPublicKeyInfo DER encoding.
119
- */
120
- private fun extractUncompressedPublicKey(x509Encoded: ByteArray): ByteArray {
121
- val uncompressedPointLength = 65
122
- return x509Encoded.copyOfRange(
123
- x509Encoded.size - uncompressedPointLength,
124
- x509Encoded.size
125
- )
126
- }
127
-
128
- private fun base64urlEncode(data: ByteArray): String {
129
- return android.util.Base64.encodeToString(
130
- data,
131
- android.util.Base64.URL_SAFE or android.util.Base64.NO_WRAP or android.util.Base64.NO_PADDING
132
- )
133
- }
134
-
135
- companion object {
136
- private const val ANDROID_KEYSTORE = "AndroidKeyStore"
137
-
138
- fun base64urlDecode(input: String): ByteArray {
139
- return android.util.Base64.decode(
140
- input,
141
- android.util.Base64.URL_SAFE or android.util.Base64.NO_WRAP or android.util.Base64.NO_PADDING
142
- )
143
- }
144
- }
145
-
146
- // endregion
147
- }
@@ -1,85 +0,0 @@
1
- package xyz.dynamic.client.keychain
2
-
3
- import com.facebook.react.bridge.Arguments
4
- import com.facebook.react.bridge.Promise
5
- import com.facebook.react.bridge.ReactApplicationContext
6
- import com.facebook.react.bridge.WritableMap
7
- import com.facebook.react.module.annotations.ReactModule
8
- import xyz.dynamic.client.NativeKeychainSpec
9
-
10
- @ReactModule(name = KeychainModule.NAME)
11
- class KeychainModule(reactContext: ReactApplicationContext) :
12
- NativeKeychainSpec(reactContext) {
13
-
14
- private val keyManager = KeyStoreKeyManager()
15
-
16
- companion object {
17
- const val NAME = "Keychain"
18
- }
19
-
20
- override fun getName(): String = NAME
21
-
22
- override fun isAvailable(promise: Promise) {
23
- try {
24
- val context = reactApplicationContext
25
- promise.resolve(keyManager.isAvailable(context))
26
- } catch (e: Exception) {
27
- promise.resolve(false)
28
- }
29
- }
30
-
31
- override fun hasKey(key: String, promise: Promise) {
32
- try {
33
- promise.resolve(keyManager.hasKey(key))
34
- } catch (e: Exception) {
35
- promise.reject("ERR_KEYCHAIN", "Failed to check key: ${e.message}", e)
36
- }
37
- }
38
-
39
- override fun generateKeyPair(key: String, promise: Promise) {
40
- try {
41
- val publicKey = keyManager.generateKeyPair(key)
42
- val result: WritableMap = Arguments.createMap()
43
- result.putString("publicKey", publicKey)
44
- promise.resolve(result)
45
- } catch (e: Exception) {
46
- promise.reject("ERR_KEYCHAIN", "Failed to generate key pair: ${e.message}", e)
47
- }
48
- }
49
-
50
- override fun getPublicKey(key: String, promise: Promise) {
51
- try {
52
- val publicKey = keyManager.getPublicKey(key)
53
- if (publicKey == null) {
54
- promise.resolve(null)
55
- } else {
56
- val result: WritableMap = Arguments.createMap()
57
- result.putString("publicKey", publicKey)
58
- promise.resolve(result)
59
- }
60
- } catch (e: Exception) {
61
- promise.reject("ERR_KEYCHAIN", "Failed to get public key: ${e.message}", e)
62
- }
63
- }
64
-
65
- override fun sign(key: String, payload: String, promise: Promise) {
66
- try {
67
- val payloadData = KeyStoreKeyManager.base64urlDecode(payload)
68
- val signature = keyManager.sign(key, payloadData)
69
- val result: WritableMap = Arguments.createMap()
70
- result.putString("signature", signature)
71
- promise.resolve(result)
72
- } catch (e: Exception) {
73
- promise.reject("ERR_KEYCHAIN", "Failed to sign: ${e.message}", e)
74
- }
75
- }
76
-
77
- override fun deleteKey(key: String, promise: Promise) {
78
- try {
79
- keyManager.deleteKey(key)
80
- promise.resolve(null)
81
- } catch (e: Exception) {
82
- promise.reject("ERR_KEYCHAIN", "Failed to delete key: ${e.message}", e)
83
- }
84
- }
85
- }
@@ -1,25 +0,0 @@
1
- package xyz.dynamic.client.manifest
2
-
3
- import com.facebook.react.bridge.Arguments
4
- import com.facebook.react.bridge.ReactApplicationContext
5
- import com.facebook.react.bridge.WritableMap
6
- import com.facebook.react.module.annotations.ReactModule
7
- import xyz.dynamic.client.BuildConfig
8
- import xyz.dynamic.client.NativeReactNativeManifestSpec
9
-
10
- @ReactModule(name = ReactNativeManifestModule.NAME)
11
- class ReactNativeManifestModule(reactContext: ReactApplicationContext) :
12
- NativeReactNativeManifestSpec(reactContext) {
13
-
14
- companion object {
15
- const val NAME = "ReactNativeManifest"
16
- }
17
-
18
- override fun getName(): String = NAME
19
-
20
- override fun getManifest(): WritableMap {
21
- val manifest = Arguments.createMap()
22
- manifest.putString("sdkVersion", BuildConfig.DYNAMIC_SDK_VERSION)
23
- return manifest
24
- }
25
- }