@novastera-oss/nitro-metamask 0.6.2 → 0.7.0
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.
- package/NitroMetamask.podspec +12 -3
- package/android/build.gradle +10 -13
- package/android/cargo-ecies.gradle +59 -78
- package/android/src/main/aidl/io/metamask/nativesdk/IMessegeService.aidl +8 -0
- package/android/src/main/aidl/io/metamask/nativesdk/IMessegeServiceCallback.aidl +8 -0
- package/android/src/main/java/com/margelo/nitro/nitrometamask/HybridNitroMetamask.kt +101 -3
- package/android/src/main/java/io/metamask/androidsdk/AnyRequest.kt +8 -0
- package/android/src/main/java/io/metamask/androidsdk/ClientMessageServiceCallback.kt +12 -0
- package/android/src/main/java/io/metamask/androidsdk/ClientServiceConnection.kt +42 -0
- package/android/src/main/java/io/metamask/androidsdk/CommunicationClient.kt +525 -0
- package/android/src/main/java/io/metamask/androidsdk/CommunicationClientModule.kt +47 -0
- package/android/src/main/java/io/metamask/androidsdk/CommunicationClientModuleInterface.kt +11 -0
- package/android/src/main/java/io/metamask/androidsdk/Constants.kt +5 -0
- package/android/src/main/java/io/metamask/androidsdk/Crypto.kt +35 -0
- package/android/src/main/java/io/metamask/androidsdk/DappMetadata.kt +36 -0
- package/android/src/main/java/io/metamask/androidsdk/Encryption.kt +9 -0
- package/android/src/main/java/io/metamask/androidsdk/ErrorType.kt +41 -0
- package/android/src/main/java/io/metamask/androidsdk/Ethereum.kt +328 -0
- package/android/src/main/java/io/metamask/androidsdk/EthereumEventCallback.kt +6 -0
- package/android/src/main/java/io/metamask/androidsdk/EthereumMethod.kt +80 -0
- package/android/src/main/java/io/metamask/androidsdk/EthereumRequest.kt +7 -0
- package/android/src/main/java/io/metamask/androidsdk/EthereumState.kt +7 -0
- package/android/src/main/java/io/metamask/androidsdk/KeyExchange.kt +77 -0
- package/android/src/main/java/io/metamask/androidsdk/KeyExchangeMessageType.kt +20 -0
- package/android/src/main/java/io/metamask/androidsdk/KeyStorage.kt +122 -0
- package/android/src/main/java/io/metamask/androidsdk/Logger.kt +18 -0
- package/android/src/main/java/io/metamask/androidsdk/Message.kt +3 -0
- package/android/src/main/java/io/metamask/androidsdk/MessageType.kt +11 -0
- package/android/src/main/java/io/metamask/androidsdk/OriginatorInfo.kt +12 -0
- package/android/src/main/java/io/metamask/androidsdk/RequestError.kt +8 -0
- package/android/src/main/java/io/metamask/androidsdk/RequestInfo.kt +9 -0
- package/android/src/main/java/io/metamask/androidsdk/Result.kt +11 -0
- package/android/src/main/java/io/metamask/androidsdk/RpcRequest.kt +7 -0
- package/android/src/main/java/io/metamask/androidsdk/SDKInfo.kt +6 -0
- package/android/src/main/java/io/metamask/androidsdk/SDKOptions.kt +6 -0
- package/android/src/main/java/io/metamask/androidsdk/SecureStorage.kt +9 -0
- package/android/src/main/java/io/metamask/androidsdk/SessionConfig.kt +10 -0
- package/android/src/main/java/io/metamask/androidsdk/SessionManager.kt +92 -0
- package/android/src/main/java/io/metamask/androidsdk/SubmittedRequest.kt +8 -0
- package/android/src/main/java/io/metamask/androidsdk/TimeStampGenerator.kt +7 -0
- package/android/src/main/jniLibs/arm64-v8a/libecies.so +0 -0
- package/android/src/main/jniLibs/armeabi-v7a/libecies.so +0 -0
- package/android/src/main/jniLibs/x86/libecies.so +0 -0
- package/android/src/main/jniLibs/x86_64/libecies.so +0 -0
- package/android/src/test/java/com/margelo/nitro/nitrometamask/CancellationStateMachineTest.kt +128 -0
- package/android/src/test/java/com/margelo/nitro/nitrometamask/ChainIdParsingTest.kt +65 -0
- package/android/src/test/java/com/margelo/nitro/nitrometamask/ConfigureStateMachineTest.kt +140 -0
- package/android/src/test/java/com/margelo/nitro/nitrometamask/ConnectSignJsonTest.kt +76 -0
- package/android/src/test/java/com/margelo/nitro/nitrometamask/MetaMaskInstallationCheckTest.kt +42 -0
- package/android/src/test/java/com/margelo/nitro/nitrometamask/PersonalSignParamsTest.kt +75 -0
- package/ios/Frameworks/Ecies.xcframework/Info.plist +47 -0
- package/ios/Frameworks/Ecies.xcframework/ios-arm64/Headers/ecies.h +20 -0
- package/ios/Frameworks/Ecies.xcframework/ios-arm64/Headers/module.modulemap +4 -0
- package/ios/Frameworks/Ecies.xcframework/ios-arm64/libecies.a +0 -0
- package/ios/Frameworks/Ecies.xcframework/ios-arm64-simulator/Headers/ecies.h +20 -0
- package/ios/Frameworks/Ecies.xcframework/ios-arm64-simulator/Headers/module.modulemap +4 -0
- package/ios/Frameworks/Ecies.xcframework/ios-arm64-simulator/libecies.a +0 -0
- package/ios/HybridNitroMetamask.swift +119 -54
- package/ios/NitroMetamaskTests/CancellationStateMachineTests.swift +150 -0
- package/ios/NitroMetamaskTests/ChainIdParsingTests.swift +117 -0
- package/ios/NitroMetamaskTests/ConfigureStateMachineTests.swift +174 -0
- package/ios/NitroMetamaskTests/ConnectSignJsonTests.swift +168 -0
- package/ios/NitroMetamaskTests/DefaultDappUrlTests.swift +80 -0
- package/ios/NitroMetamaskTests/PersonalSignParamsTests.swift +101 -0
- package/ios/metamask-ios-sdk/CommunicationLayer/CommClient.swift +43 -0
- package/ios/metamask-ios-sdk/CommunicationLayer/CommClientFactory.swift +17 -0
- package/ios/metamask-ios-sdk/CommunicationLayer/CommLayer.swift +36 -0
- package/ios/metamask-ios-sdk/CommunicationLayer/DeeplinkCommLayer/Deeplink.swift +26 -0
- package/ios/metamask-ios-sdk/CommunicationLayer/DeeplinkCommLayer/DeeplinkClient.swift +199 -0
- package/ios/metamask-ios-sdk/CommunicationLayer/DeeplinkCommLayer/DeeplinkManager.swift +83 -0
- package/ios/metamask-ios-sdk/CommunicationLayer/DeeplinkCommLayer/String.swift +48 -0
- package/ios/metamask-ios-sdk/CommunicationLayer/DeeplinkCommLayer/URLOpener.swift +19 -0
- package/ios/metamask-ios-sdk/CommunicationLayer/SocketClient.swift +27 -0
- package/ios/metamask-ios-sdk/Crypto/Crypto.swift +72 -0
- package/ios/metamask-ios-sdk/Crypto/Encoding.swift +15 -0
- package/ios/metamask-ios-sdk/Crypto/KeyExchange.swift +236 -0
- package/ios/metamask-ios-sdk/DeviceInfo/DeviceInfo.swift +11 -0
- package/ios/metamask-ios-sdk/Ethereum/AppMetadata.swift +28 -0
- package/ios/metamask-ios-sdk/Ethereum/ErrorType.swift +62 -0
- package/ios/metamask-ios-sdk/Ethereum/Ethereum.swift +810 -0
- package/ios/metamask-ios-sdk/Ethereum/EthereumMethod.swift +111 -0
- package/ios/metamask-ios-sdk/Ethereum/EthereumRequest.swift +40 -0
- package/ios/metamask-ios-sdk/Ethereum/EthereumWrapper.swift +10 -0
- package/ios/metamask-ios-sdk/Ethereum/RPCRequest.swift +14 -0
- package/ios/metamask-ios-sdk/Ethereum/RequestError.swift +88 -0
- package/ios/metamask-ios-sdk/Ethereum/ResponseMethod.swift +22 -0
- package/ios/metamask-ios-sdk/Ethereum/SubmitRequest.swift +26 -0
- package/ios/metamask-ios-sdk/Ethereum/TimestampGenerator.swift +16 -0
- package/ios/metamask-ios-sdk/Extensions/NSRecursiveLock.swift +14 -0
- package/ios/metamask-ios-sdk/Extensions/Notification.swift +10 -0
- package/ios/metamask-ios-sdk/Logger/Logging.swift +27 -0
- package/ios/metamask-ios-sdk/Models/AddChainParameters.swift +35 -0
- package/ios/metamask-ios-sdk/Models/Event.swift +19 -0
- package/ios/metamask-ios-sdk/Models/Mappable.swift +40 -0
- package/ios/metamask-ios-sdk/Models/NativeCurrency.swift +25 -0
- package/ios/metamask-ios-sdk/Models/OriginatorInfo.swift +26 -0
- package/ios/metamask-ios-sdk/Models/RequestInfo.swift +18 -0
- package/ios/metamask-ios-sdk/Models/SignContract.swift +48 -0
- package/ios/metamask-ios-sdk/Models/Typealiases.swift +9 -0
- package/ios/metamask-ios-sdk/Persistence/SecureStore.swift +134 -0
- package/ios/metamask-ios-sdk/Persistence/SessionConfig.swift +24 -0
- package/ios/metamask-ios-sdk/Persistence/SessionManager.swift +56 -0
- package/ios/metamask-ios-sdk/SDK/Dependencies.swift +35 -0
- package/ios/metamask-ios-sdk/SDK/MetaMaskSDK.swift +215 -0
- package/ios/metamask-ios-sdk/SDK/SDKInfo.swift +37 -0
- package/ios/metamask-ios-sdk/SDK/SDKOptions.swift +16 -0
- package/lib/commonjs/index.js +50 -3
- package/lib/commonjs/index.js.map +1 -1
- package/lib/module/index.js +49 -3
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/src/__tests__/parseNitroError.test.d.ts +2 -0
- package/lib/typescript/src/__tests__/parseNitroError.test.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +43 -3
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/specs/nitro-metamask.nitro.d.ts +34 -6
- package/lib/typescript/src/specs/nitro-metamask.nitro.d.ts.map +1 -1
- package/nitro.json +8 -2
- package/nitrogen/generated/android/NitroMetamask+autolinking.cmake +1 -1
- package/nitrogen/generated/android/NitroMetamask+autolinking.gradle +1 -1
- package/nitrogen/generated/android/NitroMetamaskOnLoad.cpp +27 -17
- package/nitrogen/generated/android/NitroMetamaskOnLoad.hpp +14 -5
- package/nitrogen/generated/android/c++/JConnectResult.hpp +2 -2
- package/nitrogen/generated/android/c++/JConnectSignResult.hpp +2 -2
- package/nitrogen/generated/android/c++/JHybridNitroMetamaskSpec.cpp +26 -25
- package/nitrogen/generated/android/c++/JHybridNitroMetamaskSpec.hpp +20 -22
- package/nitrogen/generated/android/c++/JVariant_NullType_Long.cpp +1 -1
- package/nitrogen/generated/android/c++/JVariant_NullType_Long.hpp +4 -4
- package/nitrogen/generated/android/c++/JVariant_NullType_String.cpp +1 -1
- package/nitrogen/generated/android/c++/JVariant_NullType_String.hpp +4 -4
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrometamask/ConnectResult.kt +16 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrometamask/ConnectSignResult.kt +18 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrometamask/HybridNitroMetamaskSpec.kt +16 -19
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrometamask/NitroMetamaskOnLoad.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrometamask/Variant_NullType_Long.kt +15 -12
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrometamask/Variant_NullType_String.kt +15 -12
- package/nitrogen/generated/ios/NitroMetamask+autolinking.rb +3 -1
- package/nitrogen/generated/ios/NitroMetamask-Swift-Cxx-Bridge.cpp +1 -1
- package/nitrogen/generated/ios/NitroMetamask-Swift-Cxx-Bridge.hpp +2 -2
- package/nitrogen/generated/ios/NitroMetamask-Swift-Cxx-Umbrella.hpp +1 -1
- package/nitrogen/generated/ios/NitroMetamaskAutolinking.mm +1 -1
- package/nitrogen/generated/ios/NitroMetamaskAutolinking.swift +9 -8
- package/nitrogen/generated/ios/c++/HybridNitroMetamaskSpecSwift.cpp +1 -1
- package/nitrogen/generated/ios/c++/HybridNitroMetamaskSpecSwift.hpp +7 -1
- package/nitrogen/generated/ios/swift/ConnectResult.swift +1 -2
- package/nitrogen/generated/ios/swift/ConnectSignResult.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_void_ConnectResult.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_void_ConnectSignResult.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_void_std__string.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_void_std__variant_nitro__NullType__int64_t_.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_void_std__variant_nitro__NullType__std__string_.swift +1 -2
- package/nitrogen/generated/ios/swift/HybridNitroMetamaskSpec.swift +3 -4
- package/nitrogen/generated/ios/swift/HybridNitroMetamaskSpec_cxx.swift +9 -2
- package/nitrogen/generated/ios/swift/Variant_NullType_Int64.swift +14 -2
- package/nitrogen/generated/ios/swift/Variant_NullType_String.swift +13 -1
- package/nitrogen/generated/shared/c++/ConnectResult.hpp +1 -1
- package/nitrogen/generated/shared/c++/ConnectSignResult.hpp +1 -1
- package/nitrogen/generated/shared/c++/HybridNitroMetamaskSpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridNitroMetamaskSpec.hpp +1 -1
- package/package.json +18 -13
- package/rust/ecies-jni/Cargo.lock +50 -86
- package/rust/ecies-jni/Cargo.toml +1 -1
- package/rust/ecies-jni/src/lib.rs +164 -100
- package/src/__tests__/parseNitroError.test.ts +35 -0
- package/src/index.ts +53 -5
- package/src/specs/nitro-metamask.nitro.ts +34 -6
- package/scripts/verify-16k-page-alignment.py +0 -117
- package/scripts/verify-16k-page-alignment.sh +0 -5
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@novastera-oss/nitro-metamask",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"description": "Native mobile MetaMask wallet integration for React Native. Part of Novastera CRM/ERP platform ecosystem. Provides secure authentication and message signing for Web3 mobile applications.",
|
|
5
5
|
"main": "./lib/commonjs/index.js",
|
|
6
6
|
"module": "./lib/module/index.js",
|
|
@@ -12,8 +12,7 @@
|
|
|
12
12
|
"clean": "git clean -dfX",
|
|
13
13
|
"release": "semantic-release",
|
|
14
14
|
"build": "npm run typecheck && bob build",
|
|
15
|
-
"codegen": "nitrogen --logLevel=\"debug\" && npm run build"
|
|
16
|
-
"build:ecies:all-abis": "cd example/android && ./gradlew :app:assembleRelease -PreactNativeArchitectures=arm64-v8a,armeabi-v7a,x86_64,x86 -PNitroMetamask_buildEciesFromSource=true --no-daemon --stacktrace"
|
|
15
|
+
"codegen": "nitrogen --logLevel=\"debug\" && npm run build"
|
|
17
16
|
},
|
|
18
17
|
"keywords": [
|
|
19
18
|
"react-native",
|
|
@@ -49,6 +48,10 @@
|
|
|
49
48
|
"android/proguard-rules.pro",
|
|
50
49
|
"android/src",
|
|
51
50
|
"android/src/main/jniLibs",
|
|
51
|
+
"android/src/main/java/io/metamask/**",
|
|
52
|
+
"android/src/main/aidl/**",
|
|
53
|
+
"ios/metamask-ios-sdk/**",
|
|
54
|
+
"ios/Frameworks/**",
|
|
52
55
|
"ios/**/*.h",
|
|
53
56
|
"ios/**/*.m",
|
|
54
57
|
"ios/**/*.mm",
|
|
@@ -59,9 +62,7 @@
|
|
|
59
62
|
"README.md",
|
|
60
63
|
"rust/ecies-jni/Cargo.toml",
|
|
61
64
|
"rust/ecies-jni/src",
|
|
62
|
-
"rust/ecies-jni/Cargo.lock"
|
|
63
|
-
"scripts/verify-16k-page-alignment.sh",
|
|
64
|
-
"scripts/verify-16k-page-alignment.py"
|
|
65
|
+
"rust/ecies-jni/Cargo.lock"
|
|
65
66
|
],
|
|
66
67
|
"workspaces": [
|
|
67
68
|
"example"
|
|
@@ -79,25 +80,29 @@
|
|
|
79
80
|
"registry": "https://registry.npmjs.org/"
|
|
80
81
|
},
|
|
81
82
|
"devDependencies": {
|
|
82
|
-
"@
|
|
83
|
+
"@babel/core": "^7.29.0",
|
|
84
|
+
"@babel/preset-env": "^7.29.2",
|
|
85
|
+
"@babel/preset-typescript": "^7.28.5",
|
|
83
86
|
"@semantic-release/changelog": "^6.0.3",
|
|
84
87
|
"@semantic-release/git": "^10.0.1",
|
|
85
88
|
"@types/jest": "^29.5.12",
|
|
86
89
|
"@types/react": "19.2.0",
|
|
87
|
-
"
|
|
90
|
+
"babel-jest": "^30.3.0",
|
|
91
|
+
"conventional-changelog-conventionalcommits": "^9.1.0",
|
|
92
|
+
"jest": "^30.3.0",
|
|
93
|
+
"nitrogen": "^0.35.5",
|
|
88
94
|
"react": "19.2.0",
|
|
89
95
|
"react-native": "0.83",
|
|
90
|
-
"react-native-builder-bob": "^0.40.
|
|
91
|
-
"react-native-nitro-modules": "0.
|
|
92
|
-
"conventional-changelog-conventionalcommits": "^9.1.0",
|
|
96
|
+
"react-native-builder-bob": "^0.40.18",
|
|
97
|
+
"react-native-nitro-modules": "0.35.5",
|
|
93
98
|
"semantic-release": "^25.0.2",
|
|
94
99
|
"typescript": "^5.8.3"
|
|
95
100
|
},
|
|
96
101
|
"peerDependencies": {
|
|
102
|
+
"@expo/config-plugins": "*",
|
|
97
103
|
"react": "*",
|
|
98
104
|
"react-native": "*",
|
|
99
|
-
"react-native-nitro-modules": "*"
|
|
100
|
-
"@expo/config-plugins": "*"
|
|
105
|
+
"react-native-nitro-modules": "*"
|
|
101
106
|
},
|
|
102
107
|
"eslintConfig": {
|
|
103
108
|
"root": true,
|
|
@@ -82,12 +82,6 @@ version = "1.11.1"
|
|
|
82
82
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
83
83
|
checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33"
|
|
84
84
|
|
|
85
|
-
[[package]]
|
|
86
|
-
name = "cesu8"
|
|
87
|
-
version = "1.1.0"
|
|
88
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
89
|
-
checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c"
|
|
90
|
-
|
|
91
85
|
[[package]]
|
|
92
86
|
name = "cfg-if"
|
|
93
87
|
version = "1.0.4"
|
|
@@ -270,27 +264,32 @@ dependencies = [
|
|
|
270
264
|
|
|
271
265
|
[[package]]
|
|
272
266
|
name = "jni"
|
|
273
|
-
version = "0.
|
|
267
|
+
version = "0.22.4"
|
|
274
268
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
275
|
-
checksum = "
|
|
269
|
+
checksum = "5efd9a482cf3a427f00d6b35f14332adc7902ce91efb778580e180ff90fa3498"
|
|
276
270
|
dependencies = [
|
|
277
|
-
"cesu8",
|
|
278
271
|
"cfg-if",
|
|
279
272
|
"combine",
|
|
280
|
-
"jni-
|
|
273
|
+
"jni-macros",
|
|
274
|
+
"jni-sys",
|
|
281
275
|
"log",
|
|
276
|
+
"simd_cesu8",
|
|
282
277
|
"thiserror",
|
|
283
278
|
"walkdir",
|
|
284
|
-
"windows-
|
|
279
|
+
"windows-link",
|
|
285
280
|
]
|
|
286
281
|
|
|
287
282
|
[[package]]
|
|
288
|
-
name = "jni-
|
|
289
|
-
version = "0.
|
|
283
|
+
name = "jni-macros"
|
|
284
|
+
version = "0.22.4"
|
|
290
285
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
291
|
-
checksum = "
|
|
286
|
+
checksum = "a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3"
|
|
292
287
|
dependencies = [
|
|
293
|
-
"
|
|
288
|
+
"proc-macro2",
|
|
289
|
+
"quote",
|
|
290
|
+
"rustc_version",
|
|
291
|
+
"simd_cesu8",
|
|
292
|
+
"syn",
|
|
294
293
|
]
|
|
295
294
|
|
|
296
295
|
[[package]]
|
|
@@ -497,6 +496,15 @@ dependencies = [
|
|
|
497
496
|
"bitflags",
|
|
498
497
|
]
|
|
499
498
|
|
|
499
|
+
[[package]]
|
|
500
|
+
name = "rustc_version"
|
|
501
|
+
version = "0.4.1"
|
|
502
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
503
|
+
checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92"
|
|
504
|
+
dependencies = [
|
|
505
|
+
"semver",
|
|
506
|
+
]
|
|
507
|
+
|
|
500
508
|
[[package]]
|
|
501
509
|
name = "rustversion"
|
|
502
510
|
version = "1.0.22"
|
|
@@ -518,6 +526,12 @@ version = "1.2.0"
|
|
|
518
526
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
519
527
|
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
|
|
520
528
|
|
|
529
|
+
[[package]]
|
|
530
|
+
name = "semver"
|
|
531
|
+
version = "1.0.28"
|
|
532
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
533
|
+
checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd"
|
|
534
|
+
|
|
521
535
|
[[package]]
|
|
522
536
|
name = "serde"
|
|
523
537
|
version = "1.0.228"
|
|
@@ -559,6 +573,22 @@ dependencies = [
|
|
|
559
573
|
"digest 0.10.7",
|
|
560
574
|
]
|
|
561
575
|
|
|
576
|
+
[[package]]
|
|
577
|
+
name = "simd_cesu8"
|
|
578
|
+
version = "1.1.1"
|
|
579
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
580
|
+
checksum = "94f90157bb87cddf702797c5dadfa0be7d266cdf49e22da2fcaa32eff75b2c33"
|
|
581
|
+
dependencies = [
|
|
582
|
+
"rustc_version",
|
|
583
|
+
"simdutf8",
|
|
584
|
+
]
|
|
585
|
+
|
|
586
|
+
[[package]]
|
|
587
|
+
name = "simdutf8"
|
|
588
|
+
version = "0.1.5"
|
|
589
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
590
|
+
checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e"
|
|
591
|
+
|
|
562
592
|
[[package]]
|
|
563
593
|
name = "smallvec"
|
|
564
594
|
version = "1.15.1"
|
|
@@ -584,18 +614,18 @@ dependencies = [
|
|
|
584
614
|
|
|
585
615
|
[[package]]
|
|
586
616
|
name = "thiserror"
|
|
587
|
-
version = "
|
|
617
|
+
version = "2.0.18"
|
|
588
618
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
589
|
-
checksum = "
|
|
619
|
+
checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4"
|
|
590
620
|
dependencies = [
|
|
591
621
|
"thiserror-impl",
|
|
592
622
|
]
|
|
593
623
|
|
|
594
624
|
[[package]]
|
|
595
625
|
name = "thiserror-impl"
|
|
596
|
-
version = "
|
|
626
|
+
version = "2.0.18"
|
|
597
627
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
598
|
-
checksum = "
|
|
628
|
+
checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5"
|
|
599
629
|
dependencies = [
|
|
600
630
|
"proc-macro2",
|
|
601
631
|
"quote",
|
|
@@ -697,7 +727,7 @@ version = "0.1.11"
|
|
|
697
727
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
698
728
|
checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22"
|
|
699
729
|
dependencies = [
|
|
700
|
-
"windows-sys
|
|
730
|
+
"windows-sys",
|
|
701
731
|
]
|
|
702
732
|
|
|
703
733
|
[[package]]
|
|
@@ -706,15 +736,6 @@ version = "0.2.1"
|
|
|
706
736
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
707
737
|
checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
|
|
708
738
|
|
|
709
|
-
[[package]]
|
|
710
|
-
name = "windows-sys"
|
|
711
|
-
version = "0.45.0"
|
|
712
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
713
|
-
checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0"
|
|
714
|
-
dependencies = [
|
|
715
|
-
"windows-targets",
|
|
716
|
-
]
|
|
717
|
-
|
|
718
739
|
[[package]]
|
|
719
740
|
name = "windows-sys"
|
|
720
741
|
version = "0.61.2"
|
|
@@ -723,60 +744,3 @@ checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
|
|
|
723
744
|
dependencies = [
|
|
724
745
|
"windows-link",
|
|
725
746
|
]
|
|
726
|
-
|
|
727
|
-
[[package]]
|
|
728
|
-
name = "windows-targets"
|
|
729
|
-
version = "0.42.2"
|
|
730
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
731
|
-
checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071"
|
|
732
|
-
dependencies = [
|
|
733
|
-
"windows_aarch64_gnullvm",
|
|
734
|
-
"windows_aarch64_msvc",
|
|
735
|
-
"windows_i686_gnu",
|
|
736
|
-
"windows_i686_msvc",
|
|
737
|
-
"windows_x86_64_gnu",
|
|
738
|
-
"windows_x86_64_gnullvm",
|
|
739
|
-
"windows_x86_64_msvc",
|
|
740
|
-
]
|
|
741
|
-
|
|
742
|
-
[[package]]
|
|
743
|
-
name = "windows_aarch64_gnullvm"
|
|
744
|
-
version = "0.42.2"
|
|
745
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
746
|
-
checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8"
|
|
747
|
-
|
|
748
|
-
[[package]]
|
|
749
|
-
name = "windows_aarch64_msvc"
|
|
750
|
-
version = "0.42.2"
|
|
751
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
752
|
-
checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43"
|
|
753
|
-
|
|
754
|
-
[[package]]
|
|
755
|
-
name = "windows_i686_gnu"
|
|
756
|
-
version = "0.42.2"
|
|
757
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
758
|
-
checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f"
|
|
759
|
-
|
|
760
|
-
[[package]]
|
|
761
|
-
name = "windows_i686_msvc"
|
|
762
|
-
version = "0.42.2"
|
|
763
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
764
|
-
checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060"
|
|
765
|
-
|
|
766
|
-
[[package]]
|
|
767
|
-
name = "windows_x86_64_gnu"
|
|
768
|
-
version = "0.42.2"
|
|
769
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
770
|
-
checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36"
|
|
771
|
-
|
|
772
|
-
[[package]]
|
|
773
|
-
name = "windows_x86_64_gnullvm"
|
|
774
|
-
version = "0.42.2"
|
|
775
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
776
|
-
checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3"
|
|
777
|
-
|
|
778
|
-
[[package]]
|
|
779
|
-
name = "windows_x86_64_msvc"
|
|
780
|
-
version = "0.42.2"
|
|
781
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
782
|
-
checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0"
|
|
@@ -10,7 +10,7 @@ crate-type = ["cdylib"]
|
|
|
10
10
|
name = "ecies"
|
|
11
11
|
|
|
12
12
|
[dependencies]
|
|
13
|
-
jni = "0.
|
|
13
|
+
jni = "0.22"
|
|
14
14
|
# Match ecies.org / MetaMask stack (secp256k1, AES-256-GCM); pure Rust AES for simpler Android linking
|
|
15
15
|
ecies = { version = "0.2.10", default-features = false, features = ["std", "aes-rust"] }
|
|
16
16
|
hex = "0.4"
|
|
@@ -1,127 +1,191 @@
|
|
|
1
1
|
//! JNI bridge for `io.metamask.ecies.Ecies` (MetaMask Android SDK).
|
|
2
2
|
//! Rebuilt with NDK r28+ / 16 KB page-size compatible linking (see Gradle + cargo-ndk).
|
|
3
|
+
//!
|
|
4
|
+
//! Symbol naming: Kotlin `@JvmStatic` methods in a `companion object` are exposed
|
|
5
|
+
//! directly on the enclosing class by the JVM, so the JNI symbol is
|
|
6
|
+
//! `Java_io_metamask_ecies_Ecies_<method>` — NOT `..._00024Companion_<method>`.
|
|
7
|
+
//! Verified against upstream libecies.so exports via `nm -D`.
|
|
3
8
|
|
|
4
9
|
use ecies::{decrypt, encrypt, utils::generate_keypair};
|
|
10
|
+
use jni::errors::Result as JniResult;
|
|
11
|
+
use jni::errors::ThrowRuntimeExAndDefault;
|
|
12
|
+
use jni::objects::JClass;
|
|
5
13
|
use jni::objects::JString;
|
|
6
14
|
use jni::sys::jstring;
|
|
7
|
-
use jni::
|
|
15
|
+
use jni::{Env, EnvUnowned};
|
|
8
16
|
|
|
9
|
-
fn empty_jstring(env: &mut
|
|
10
|
-
env.new_string("")
|
|
11
|
-
.expect("empty jstring")
|
|
12
|
-
.into_raw()
|
|
17
|
+
fn empty_jstring<'local>(env: &mut Env<'local>) -> jstring {
|
|
18
|
+
env.new_string("").expect("empty jstring").into_raw()
|
|
13
19
|
}
|
|
14
20
|
|
|
15
|
-
fn jstring_to_string
|
|
16
|
-
|
|
21
|
+
fn jstring_to_string<'local>(
|
|
22
|
+
_env: &mut Env<'local>,
|
|
23
|
+
j: JString<'local>,
|
|
24
|
+
) -> Result<String, jni::errors::Error> {
|
|
25
|
+
Ok(j.to_string())
|
|
17
26
|
}
|
|
18
27
|
|
|
19
|
-
/// Kotlin: `Ecies.
|
|
28
|
+
/// Kotlin: `Ecies.generateSecretKey()` (@JvmStatic in companion object)
|
|
20
29
|
#[no_mangle]
|
|
21
|
-
pub extern "system" fn
|
|
22
|
-
mut
|
|
23
|
-
_class:
|
|
30
|
+
pub extern "system" fn Java_io_metamask_ecies_Ecies_generateSecretKey<'local>(
|
|
31
|
+
mut unowned_env: EnvUnowned<'local>,
|
|
32
|
+
_class: JClass<'local>,
|
|
24
33
|
) -> jstring {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
34
|
+
unowned_env
|
|
35
|
+
.with_env(|mut env| -> JniResult<jstring> {
|
|
36
|
+
let (sk, _pk) = generate_keypair();
|
|
37
|
+
let hex = hex::encode(sk.serialize());
|
|
38
|
+
match env.new_string(hex) {
|
|
39
|
+
Ok(s) => Ok(s.into_raw()),
|
|
40
|
+
Err(_) => Ok(empty_jstring(&mut env)),
|
|
41
|
+
}
|
|
42
|
+
})
|
|
43
|
+
.resolve::<ThrowRuntimeExAndDefault>()
|
|
31
44
|
}
|
|
32
45
|
|
|
33
|
-
/// Kotlin: `Ecies.
|
|
46
|
+
/// Kotlin: `Ecies.derivePublicKeyFrom(secret)` (@JvmStatic in companion object)
|
|
34
47
|
#[no_mangle]
|
|
35
|
-
pub extern "system" fn
|
|
36
|
-
mut
|
|
37
|
-
_class:
|
|
38
|
-
secret: JString
|
|
48
|
+
pub extern "system" fn Java_io_metamask_ecies_Ecies_derivePublicKeyFrom<'local>(
|
|
49
|
+
mut unowned_env: EnvUnowned<'local>,
|
|
50
|
+
_class: JClass<'local>,
|
|
51
|
+
secret: JString<'local>,
|
|
39
52
|
) -> jstring {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
53
|
+
unowned_env
|
|
54
|
+
.with_env(|mut env| -> JniResult<jstring> {
|
|
55
|
+
let secret_str = match jstring_to_string(&mut env, secret) {
|
|
56
|
+
Ok(s) => s,
|
|
57
|
+
Err(_) => return Ok(empty_jstring(&mut env)),
|
|
58
|
+
};
|
|
59
|
+
let sk_bytes = match hex::decode(secret_str.trim()) {
|
|
60
|
+
Ok(b) => b,
|
|
61
|
+
Err(_) => return Ok(empty_jstring(&mut env)),
|
|
62
|
+
};
|
|
63
|
+
let sk = match ecies::SecretKey::parse_slice(&sk_bytes) {
|
|
64
|
+
Ok(k) => k,
|
|
65
|
+
Err(_) => return Ok(empty_jstring(&mut env)),
|
|
66
|
+
};
|
|
67
|
+
let pk = ecies::PublicKey::from_secret_key(&sk);
|
|
68
|
+
let hex = hex::encode(pk.serialize());
|
|
69
|
+
match env.new_string(hex) {
|
|
70
|
+
Ok(s) => Ok(s.into_raw()),
|
|
71
|
+
Err(_) => Ok(empty_jstring(&mut env)),
|
|
72
|
+
}
|
|
73
|
+
})
|
|
74
|
+
.resolve::<ThrowRuntimeExAndDefault>()
|
|
58
75
|
}
|
|
59
76
|
|
|
60
|
-
/// Kotlin: `Ecies.
|
|
77
|
+
/// Kotlin: `Ecies.encryptMessage(public, message)` (@JvmStatic in companion object)
|
|
61
78
|
#[no_mangle]
|
|
62
|
-
pub extern "system" fn
|
|
63
|
-
mut
|
|
64
|
-
_class:
|
|
65
|
-
public: JString
|
|
66
|
-
message: JString
|
|
79
|
+
pub extern "system" fn Java_io_metamask_ecies_Ecies_encryptMessage<'local>(
|
|
80
|
+
mut unowned_env: EnvUnowned<'local>,
|
|
81
|
+
_class: JClass<'local>,
|
|
82
|
+
public: JString<'local>,
|
|
83
|
+
message: JString<'local>,
|
|
67
84
|
) -> jstring {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
85
|
+
unowned_env
|
|
86
|
+
.with_env(|mut env| -> JniResult<jstring> {
|
|
87
|
+
let pub_hex = match jstring_to_string(&mut env, public) {
|
|
88
|
+
Ok(s) => s,
|
|
89
|
+
Err(_) => return Ok(empty_jstring(&mut env)),
|
|
90
|
+
};
|
|
91
|
+
let msg_str = match jstring_to_string(&mut env, message) {
|
|
92
|
+
Ok(s) => s,
|
|
93
|
+
Err(_) => return Ok(empty_jstring(&mut env)),
|
|
94
|
+
};
|
|
95
|
+
let pk_bytes = match hex::decode(pub_hex.trim()) {
|
|
96
|
+
Ok(b) => b,
|
|
97
|
+
Err(_) => return Ok(empty_jstring(&mut env)),
|
|
98
|
+
};
|
|
99
|
+
let ct = match encrypt(&pk_bytes, msg_str.as_bytes()) {
|
|
100
|
+
Ok(c) => c,
|
|
101
|
+
Err(_) => return Ok(empty_jstring(&mut env)),
|
|
102
|
+
};
|
|
103
|
+
let hex = hex::encode(ct);
|
|
104
|
+
match env.new_string(hex) {
|
|
105
|
+
Ok(s) => Ok(s.into_raw()),
|
|
106
|
+
Err(_) => Ok(empty_jstring(&mut env)),
|
|
107
|
+
}
|
|
108
|
+
})
|
|
109
|
+
.resolve::<ThrowRuntimeExAndDefault>()
|
|
89
110
|
}
|
|
90
111
|
|
|
91
|
-
/// Kotlin: `Ecies.
|
|
112
|
+
/// Kotlin: `Ecies.decryptMessage(secret, message)` (@JvmStatic in companion object)
|
|
92
113
|
#[no_mangle]
|
|
93
|
-
pub extern "system" fn
|
|
94
|
-
mut
|
|
95
|
-
_class:
|
|
96
|
-
secret: JString
|
|
97
|
-
message: JString
|
|
114
|
+
pub extern "system" fn Java_io_metamask_ecies_Ecies_decryptMessage<'local>(
|
|
115
|
+
mut unowned_env: EnvUnowned<'local>,
|
|
116
|
+
_class: JClass<'local>,
|
|
117
|
+
secret: JString<'local>,
|
|
118
|
+
message: JString<'local>,
|
|
98
119
|
) -> jstring {
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
120
|
+
unowned_env
|
|
121
|
+
.with_env(|mut env| -> JniResult<jstring> {
|
|
122
|
+
let sec_hex = match jstring_to_string(&mut env, secret) {
|
|
123
|
+
Ok(s) => s,
|
|
124
|
+
Err(_) => return Ok(empty_jstring(&mut env)),
|
|
125
|
+
};
|
|
126
|
+
let ct_hex = match jstring_to_string(&mut env, message) {
|
|
127
|
+
Ok(s) => s,
|
|
128
|
+
Err(_) => return Ok(empty_jstring(&mut env)),
|
|
129
|
+
};
|
|
130
|
+
let sk_bytes = match hex::decode(sec_hex.trim()) {
|
|
131
|
+
Ok(b) => b,
|
|
132
|
+
Err(_) => return Ok(empty_jstring(&mut env)),
|
|
133
|
+
};
|
|
134
|
+
let ct_bytes = match hex::decode(ct_hex.trim()) {
|
|
135
|
+
Ok(b) => b,
|
|
136
|
+
Err(_) => return Ok(empty_jstring(&mut env)),
|
|
137
|
+
};
|
|
138
|
+
let plain = match decrypt(&sk_bytes, &ct_bytes) {
|
|
139
|
+
Ok(p) => p,
|
|
140
|
+
Err(_) => return Ok(empty_jstring(&mut env)),
|
|
141
|
+
};
|
|
142
|
+
let text = match String::from_utf8(plain) {
|
|
143
|
+
Ok(t) => t,
|
|
144
|
+
Err(_) => return Ok(empty_jstring(&mut env)),
|
|
145
|
+
};
|
|
146
|
+
match env.new_string(text) {
|
|
147
|
+
Ok(s) => Ok(s.into_raw()),
|
|
148
|
+
Err(_) => Ok(empty_jstring(&mut env)),
|
|
149
|
+
}
|
|
150
|
+
})
|
|
151
|
+
.resolve::<ThrowRuntimeExAndDefault>()
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
#[cfg(test)]
|
|
155
|
+
mod tests {
|
|
156
|
+
macro_rules! assert_jni_symbol {
|
|
157
|
+
($fn_name:ident) => {{
|
|
158
|
+
let name = stringify!($fn_name);
|
|
159
|
+
assert!(
|
|
160
|
+
!name.contains("_00024Companion_"),
|
|
161
|
+
"Symbol `{}` must NOT contain `_00024Companion_`",
|
|
162
|
+
name
|
|
163
|
+
);
|
|
164
|
+
assert!(
|
|
165
|
+
name.starts_with("Java_io_metamask_ecies_Ecies_"),
|
|
166
|
+
"Symbol `{}` must start with `Java_io_metamask_ecies_Ecies_`",
|
|
167
|
+
name
|
|
168
|
+
);
|
|
169
|
+
}};
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
#[test]
|
|
173
|
+
fn generate_secret_key_symbol_has_no_companion_mangling() {
|
|
174
|
+
assert_jni_symbol!(Java_io_metamask_ecies_Ecies_generateSecretKey);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
#[test]
|
|
178
|
+
fn derive_public_key_from_symbol_has_no_companion_mangling() {
|
|
179
|
+
assert_jni_symbol!(Java_io_metamask_ecies_Ecies_derivePublicKeyFrom);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
#[test]
|
|
183
|
+
fn encrypt_message_symbol_has_no_companion_mangling() {
|
|
184
|
+
assert_jni_symbol!(Java_io_metamask_ecies_Ecies_encryptMessage);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
#[test]
|
|
188
|
+
fn decrypt_message_symbol_has_no_companion_mangling() {
|
|
189
|
+
assert_jni_symbol!(Java_io_metamask_ecies_Ecies_decryptMessage);
|
|
126
190
|
}
|
|
127
191
|
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { parseNitroError } from '../index'
|
|
2
|
+
|
|
3
|
+
// Mock the NitroModules dependency so the module can be imported in a Node/Jest environment
|
|
4
|
+
jest.mock('react-native-nitro-modules', () => ({
|
|
5
|
+
NitroModules: {
|
|
6
|
+
createHybridObject: () => ({}),
|
|
7
|
+
},
|
|
8
|
+
}))
|
|
9
|
+
|
|
10
|
+
describe('parseNitroError', () => {
|
|
11
|
+
it('parses "[2] MetaMask is not installed" into code 2 and the message', () => {
|
|
12
|
+
const result = parseNitroError(new Error('[2] MetaMask is not installed'))
|
|
13
|
+
expect(result).toEqual({ code: 2, message: 'MetaMask is not installed' })
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
it('returns null for a plain error message with no [code] prefix', () => {
|
|
17
|
+
const result = parseNitroError(new Error('Something went wrong'))
|
|
18
|
+
expect(result).toBeNull()
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
it('parses "[0] some error" into code 0 and the message', () => {
|
|
22
|
+
const result = parseNitroError(new Error('[0] some error'))
|
|
23
|
+
expect(result).toEqual({ code: 0, message: 'some error' })
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
it('parses a string input with [code] prefix', () => {
|
|
27
|
+
const result = parseNitroError('[42] timeout')
|
|
28
|
+
expect(result).toEqual({ code: 42, message: 'timeout' })
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
it('returns null for a non-string, non-Error input', () => {
|
|
32
|
+
const result = parseNitroError(null)
|
|
33
|
+
expect(result).toBeNull()
|
|
34
|
+
})
|
|
35
|
+
})
|