react-native-tediwave-biometric-verifier 0.1.3

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 (32) hide show
  1. package/LICENSE +9 -0
  2. package/README.md +85 -0
  3. package/TediwaveBiometricVerifier.podspec +20 -0
  4. package/android/build.gradle +67 -0
  5. package/android/src/main/AndroidManifest.xml +2 -0
  6. package/android/src/main/java/com/tediwavebiometricverifier/TediwaveBiometricVerifierModule.kt +15 -0
  7. package/android/src/main/java/com/tediwavebiometricverifier/TediwaveBiometricVerifierPackage.kt +31 -0
  8. package/ios/TediwaveBiometricVerifier.h +5 -0
  9. package/ios/TediwaveBiometricVerifier.mm +21 -0
  10. package/lib/module/BiometricCamera.js +30 -0
  11. package/lib/module/BiometricCamera.js.map +1 -0
  12. package/lib/module/index.js +6 -0
  13. package/lib/module/index.js.map +1 -0
  14. package/lib/module/logger.js +38 -0
  15. package/lib/module/logger.js.map +1 -0
  16. package/lib/module/package.json +1 -0
  17. package/lib/module/useBiometricEngine.js +458 -0
  18. package/lib/module/useBiometricEngine.js.map +1 -0
  19. package/lib/typescript/package.json +1 -0
  20. package/lib/typescript/src/BiometricCamera.d.ts +14 -0
  21. package/lib/typescript/src/BiometricCamera.d.ts.map +1 -0
  22. package/lib/typescript/src/index.d.ts +5 -0
  23. package/lib/typescript/src/index.d.ts.map +1 -0
  24. package/lib/typescript/src/logger.d.ts +10 -0
  25. package/lib/typescript/src/logger.d.ts.map +1 -0
  26. package/lib/typescript/src/useBiometricEngine.d.ts +99 -0
  27. package/lib/typescript/src/useBiometricEngine.d.ts.map +1 -0
  28. package/package.json +159 -0
  29. package/src/BiometricCamera.tsx +39 -0
  30. package/src/index.tsx +6 -0
  31. package/src/logger.ts +46 -0
  32. package/src/useBiometricEngine.ts +626 -0
package/LICENSE ADDED
@@ -0,0 +1,9 @@
1
+ Proprietary Code License
2
+
3
+ Copyright (c) 2026 Tediwave, all rights reserved
4
+
5
+ This software and all associated documentation files, hereinafter referred to as the "Software", are the exclusive, proprietary intellectual property of Tediwave, meaning that no license, permission, or right of use is granted to any person, company, or third-party entity obtaining a copy of this material
6
+
7
+ You are strictly prohibited from copying, modifying, merging, publishing, distributing, sublicensing, selling, or reverse-engineering any part of this software workspace, as all ownership, exploitation, and distribution privileges remain entirely, unconditionally reserved by the authors
8
+
9
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT, MEANING THAT IN NO EVENT SHALL THE AUTHORS, COPYRIGHT HOLDERS, OR NATIVE OWNERS BE LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT, OR OTHERWISE, ARISING FROM, OUT OF, OR IN CONNECTION WITH THE SOFTWARE OR THE USE OF THIS REPOSITORY
package/README.md ADDED
@@ -0,0 +1,85 @@
1
+ ## Tediwave Biometric Verifier (Headless SDK)
2
+
3
+ This SDK provides headless biometric verification capabilities for React Native apps. It focuses on processing, liveness and optional identity verification, and session management — without imposing any UI. Your application is responsible for rendering camera views, overlays, instructions, progress bars, and retry flows.
4
+
5
+ Key responsibilities:
6
+
7
+ - Camera processing (frame processor to wire into your camera)
8
+ - Face detection and face quality metrics
9
+ - Challenge generation and validation
10
+ - Liveness verification
11
+ - Optional identity verification (when a reference image is provided)
12
+ - Anti-spoofing checks
13
+ - Voice guidance (configurable)
14
+ - Session management and result payloads
15
+
16
+ Installation
17
+
18
+ ```sh
19
+ npm install react-native-tediwave-biometric-verifier
20
+ ```
21
+
22
+ Quick Start (headless)
23
+
24
+ ```tsx
25
+ import React from 'react';
26
+ import { Camera, useCameraDevice } from 'react-native-vision-camera';
27
+ import {
28
+ BiometricCamera,
29
+ useBiometricEngine,
30
+ } from 'react-native-tediwave-biometric-verifier';
31
+
32
+ export default function MyVerifierScreen() {
33
+ const device = useCameraDevice('front');
34
+ const {
35
+ frameProcessor,
36
+ frameProcessorFps,
37
+ status,
38
+ verificationStatus,
39
+ currentChallenge,
40
+ progress,
41
+ startVerification,
42
+ pauseVerification,
43
+ resumeVerification,
44
+ finishVerification,
45
+ faceQuality,
46
+ completedChallenges,
47
+ totalChallenges,
48
+ setLiveImage,
49
+ onResult,
50
+ } = useBiometricEngine({ apiKey: 'MY_KEY', autoStart: false });
51
+
52
+ React.useEffect(() => {
53
+ startVerification();
54
+ }, [startVerification]);
55
+
56
+ return (
57
+ <BiometricCamera
58
+ device={device}
59
+ isActive
60
+ frameProcessor={frameProcessor}
61
+ frameProcessorFps={frameProcessorFps ?? 1}
62
+ style={{ flex: 1 }}
63
+ >
64
+ {/* Render your custom UI overlays here using the headless state above */}
65
+ </BiometricCamera>
66
+ );
67
+ }
68
+ ```
69
+
70
+ Primary exports
71
+
72
+ - `useBiometricEngine(config)`: Headless hook returning state, control methods, frameProcessor and results.
73
+ - `BiometricCamera`: Lightweight camera wrapper that forwards props to `react-native-vision-camera` and accepts a `frameProcessor`.
74
+
75
+ Documentation
76
+
77
+ - See the `example/` folder for full integration examples demonstrating custom UIs, retries and identity mode.
78
+
79
+ Migration notes
80
+
81
+ - The SDK removed built-in UI components. Move any in-app UI into your application and consume the headless hook and camera component to drive UI state.
82
+
83
+ License
84
+
85
+ MIT
@@ -0,0 +1,20 @@
1
+ require "json"
2
+
3
+ package = JSON.parse(File.read(File.join(__dir__, "package.json")))
4
+
5
+ Pod::Spec.new do |s|
6
+ s.name = "TediwaveBiometricVerifier"
7
+ s.version = package["version"]
8
+ s.summary = package["description"]
9
+ s.homepage = package["homepage"]
10
+ s.license = package["license"]
11
+ s.authors = package["author"]
12
+
13
+ s.platforms = { :ios => min_ios_version_supported }
14
+ s.source = { :git => "https://github.com/Tediwave/tediwave-biometric-verifier.git", :tag => "#{s.version}" }
15
+
16
+ s.source_files = "ios/**/*.{h,m,mm,swift,cpp}"
17
+ s.private_header_files = "ios/**/*.h"
18
+
19
+ install_modules_dependencies(s)
20
+ end
@@ -0,0 +1,67 @@
1
+ buildscript {
2
+ ext.TediwaveBiometricVerifier = [
3
+ kotlinVersion: "2.0.21",
4
+ minSdkVersion: 24,
5
+ compileSdkVersion: 36,
6
+ targetSdkVersion: 36
7
+ ]
8
+
9
+ ext.getExtOrDefault = { prop ->
10
+ if (rootProject.ext.has(prop)) {
11
+ return rootProject.ext.get(prop)
12
+ }
13
+
14
+ return TediwaveBiometricVerifier[prop]
15
+ }
16
+
17
+ repositories {
18
+ google()
19
+ mavenCentral()
20
+ }
21
+
22
+ dependencies {
23
+ classpath "com.android.tools.build:gradle:8.7.2"
24
+ // noinspection DifferentKotlinGradleVersion
25
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${getExtOrDefault('kotlinVersion')}"
26
+ }
27
+ }
28
+
29
+
30
+ apply plugin: "com.android.library"
31
+ apply plugin: "kotlin-android"
32
+
33
+ apply plugin: "com.facebook.react"
34
+
35
+ android {
36
+ namespace "com.tediwavebiometricverifier"
37
+
38
+ compileSdkVersion getExtOrDefault("compileSdkVersion")
39
+
40
+ defaultConfig {
41
+ minSdkVersion getExtOrDefault("minSdkVersion")
42
+ targetSdkVersion getExtOrDefault("targetSdkVersion")
43
+ }
44
+
45
+ buildFeatures {
46
+ buildConfig true
47
+ }
48
+
49
+ buildTypes {
50
+ release {
51
+ minifyEnabled false
52
+ }
53
+ }
54
+
55
+ lint {
56
+ disable "GradleCompatible"
57
+ }
58
+
59
+ compileOptions {
60
+ sourceCompatibility JavaVersion.VERSION_1_8
61
+ targetCompatibility JavaVersion.VERSION_1_8
62
+ }
63
+ }
64
+
65
+ dependencies {
66
+ implementation "com.facebook.react:react-android"
67
+ }
@@ -0,0 +1,2 @@
1
+ <manifest xmlns:android="http://schemas.android.com/apk/res/android">
2
+ </manifest>
@@ -0,0 +1,15 @@
1
+ package com.tediwavebiometricverifier
2
+
3
+ import com.facebook.react.bridge.ReactApplicationContext
4
+
5
+ class TediwaveBiometricVerifierModule(reactContext: ReactApplicationContext) :
6
+ NativeTediwaveBiometricVerifierSpec(reactContext) {
7
+
8
+ override fun multiply(a: Double, b: Double): Double {
9
+ return a * b
10
+ }
11
+
12
+ companion object {
13
+ const val NAME = NativeTediwaveBiometricVerifierSpec.NAME
14
+ }
15
+ }
@@ -0,0 +1,31 @@
1
+ package com.tediwavebiometricverifier
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 java.util.HashMap
9
+
10
+ class TediwaveBiometricVerifierPackage : BaseReactPackage() {
11
+ override fun getModule(name: String, reactContext: ReactApplicationContext): NativeModule? {
12
+ return if (name == TediwaveBiometricVerifierModule.NAME) {
13
+ TediwaveBiometricVerifierModule(reactContext)
14
+ } else {
15
+ null
16
+ }
17
+ }
18
+
19
+ override fun getReactModuleInfoProvider() = ReactModuleInfoProvider {
20
+ mapOf(
21
+ TediwaveBiometricVerifierModule.NAME to ReactModuleInfo(
22
+ name = TediwaveBiometricVerifierModule.NAME,
23
+ className = TediwaveBiometricVerifierModule.NAME,
24
+ canOverrideExistingModule = false,
25
+ needsEagerInit = false,
26
+ isCxxModule = false,
27
+ isTurboModule = true
28
+ )
29
+ )
30
+ }
31
+ }
@@ -0,0 +1,5 @@
1
+ #import <TediwaveBiometricVerifierSpec/TediwaveBiometricVerifierSpec.h>
2
+
3
+ @interface TediwaveBiometricVerifier : NSObject <NativeTediwaveBiometricVerifierSpec>
4
+
5
+ @end
@@ -0,0 +1,21 @@
1
+ #import "TediwaveBiometricVerifier.h"
2
+
3
+ @implementation TediwaveBiometricVerifier
4
+ - (NSNumber *)multiply:(double)a b:(double)b {
5
+ NSNumber *result = @(a * b);
6
+
7
+ return result;
8
+ }
9
+
10
+ - (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:
11
+ (const facebook::react::ObjCTurboModule::InitParams &)params
12
+ {
13
+ return std::make_shared<facebook::react::NativeTediwaveBiometricVerifierSpecJSI>(params);
14
+ }
15
+
16
+ + (NSString *)moduleName
17
+ {
18
+ return @"TediwaveBiometricVerifier";
19
+ }
20
+
21
+ @end
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+
3
+ import React from 'react';
4
+ import { View } from 'react-native';
5
+ import { Camera } from 'react-native-vision-camera';
6
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
7
+ export function BiometricCamera({
8
+ style,
9
+ isActive = true,
10
+ frameProcessor,
11
+ frameProcessorFps = 1,
12
+ children,
13
+ ...cameraProps
14
+ }) {
15
+ const CameraAny = Camera;
16
+ return /*#__PURE__*/_jsxs(View, {
17
+ style: style,
18
+ children: [/*#__PURE__*/_jsx(CameraAny, {
19
+ ...cameraProps,
20
+ isActive: isActive,
21
+ frameProcessor: frameProcessor,
22
+ frameProcessorFps: frameProcessorFps,
23
+ style: {
24
+ flex: 1
25
+ }
26
+ }), children]
27
+ });
28
+ }
29
+ export default BiometricCamera;
30
+ //# sourceMappingURL=BiometricCamera.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","View","Camera","jsx","_jsx","jsxs","_jsxs","BiometricCamera","style","isActive","frameProcessor","frameProcessorFps","children","cameraProps","CameraAny","flex"],"sourceRoot":"..\\..\\src","sources":["BiometricCamera.tsx"],"mappings":";;AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,IAAI,QAAQ,cAAc;AAEnC,SAASC,MAAM,QAAQ,4BAA4B;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAYpD,OAAO,SAASC,eAAeA,CAAC;EAC9BC,KAAK;EACLC,QAAQ,GAAG,IAAI;EACfC,cAAc;EACdC,iBAAiB,GAAG,CAAC;EACrBC,QAAQ;EACR,GAAGC;AACiB,CAAC,EAAE;EACvB,MAAMC,SAAc,GAAGZ,MAAM;EAC7B,oBACEI,KAAA,CAACL,IAAI;IAACO,KAAK,EAAEA,KAAM;IAAAI,QAAA,gBACjBR,IAAA,CAACU,SAAS;MAAA,GACJD,WAAW;MACfJ,QAAQ,EAAEA,QAAS;MACnBC,cAAc,EAAEA,cAAe;MAC/BC,iBAAiB,EAAEA,iBAAkB;MACrCH,KAAK,EAAE;QAAEO,IAAI,EAAE;MAAE;IAAE,CACpB,CAAC,EACDH,QAAQ;EAAA,CACL,CAAC;AAEX;AAEA,eAAeL,eAAe","ignoreList":[]}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+
3
+ import { useBiometricEngine } from "./useBiometricEngine.js";
4
+ import { BiometricCamera } from "./BiometricCamera.js";
5
+ export { useBiometricEngine, BiometricCamera };
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useBiometricEngine","BiometricCamera"],"sourceRoot":"..\\..\\src","sources":["index.tsx"],"mappings":";;AAAA,SAASA,kBAAkB,QAAQ,yBAAyB;AAC5D,SAASC,eAAe,QAAQ,sBAAuB;AAEvD,SAASD,kBAAkB,EAAEC,eAAe","ignoreList":[]}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+
3
+ const LEVEL_ORDER = {
4
+ debug: 0,
5
+ info: 1,
6
+ warn: 2,
7
+ error: 3
8
+ };
9
+
10
+ // Use globalThis to avoid depending on Node's `process` type in the build
11
+ let CURRENT_LEVEL = globalThis.process?.env?.LOG_LEVEL || 'debug';
12
+ function shouldLog(level) {
13
+ return LEVEL_ORDER[level] >= LEVEL_ORDER[CURRENT_LEVEL] || CURRENT_LEVEL === 'debug';
14
+ }
15
+ function formatMessage(level, tag, message) {
16
+ const ts = new Date().toISOString();
17
+ const payload = typeof message === 'string' ? message : JSON.stringify(message);
18
+ return `[${ts}] [${level.toUpperCase()}] [${tag}] ${payload}`;
19
+ }
20
+ export const logger = {
21
+ setLevel(l) {
22
+ CURRENT_LEVEL = l;
23
+ },
24
+ debug(tag, msg) {
25
+ if (shouldLog('debug')) console.debug(formatMessage('debug', tag, msg));
26
+ },
27
+ info(tag, msg) {
28
+ if (shouldLog('info')) console.info(formatMessage('info', tag, msg));
29
+ },
30
+ warn(tag, msg) {
31
+ if (shouldLog('warn')) console.warn(formatMessage('warn', tag, msg));
32
+ },
33
+ error(tag, msg) {
34
+ if (shouldLog('error')) console.error(formatMessage('error', tag, msg));
35
+ }
36
+ };
37
+ export default logger;
38
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["LEVEL_ORDER","debug","info","warn","error","CURRENT_LEVEL","globalThis","process","env","LOG_LEVEL","shouldLog","level","formatMessage","tag","message","ts","Date","toISOString","payload","JSON","stringify","toUpperCase","logger","setLevel","l","msg","console"],"sourceRoot":"..\\..\\src","sources":["logger.ts"],"mappings":";;AAEA,MAAMA,WAAqC,GAAG;EAC5CC,KAAK,EAAE,CAAC;EACRC,IAAI,EAAE,CAAC;EACPC,IAAI,EAAE,CAAC;EACPC,KAAK,EAAE;AACT,CAAC;;AAED;AACA,IAAIC,aAAuB,GACvBC,UAAU,CAASC,OAAO,EAAEC,GAAG,EAAEC,SAAS,IAAiB,OAAO;AAEtE,SAASC,SAASA,CAACC,KAAe,EAAE;EAClC,OACEX,WAAW,CAACW,KAAK,CAAC,IAAIX,WAAW,CAACK,aAAa,CAAC,IAChDA,aAAa,KAAK,OAAO;AAE7B;AAEA,SAASO,aAAaA,CAACD,KAAe,EAAEE,GAAW,EAAEC,OAAgB,EAAE;EACrE,MAAMC,EAAE,GAAG,IAAIC,IAAI,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;EACnC,MAAMC,OAAO,GACX,OAAOJ,OAAO,KAAK,QAAQ,GAAGA,OAAO,GAAGK,IAAI,CAACC,SAAS,CAACN,OAAO,CAAC;EACjE,OAAO,IAAIC,EAAE,MAAMJ,KAAK,CAACU,WAAW,CAAC,CAAC,MAAMR,GAAG,KAAKK,OAAO,EAAE;AAC/D;AAEA,OAAO,MAAMI,MAAM,GAAG;EACpBC,QAAQA,CAACC,CAAW,EAAE;IACpBnB,aAAa,GAAGmB,CAAC;EACnB,CAAC;EACDvB,KAAKA,CAACY,GAAW,EAAEY,GAAY,EAAE;IAC/B,IAAIf,SAAS,CAAC,OAAO,CAAC,EAAEgB,OAAO,CAACzB,KAAK,CAACW,aAAa,CAAC,OAAO,EAAEC,GAAG,EAAEY,GAAG,CAAC,CAAC;EACzE,CAAC;EACDvB,IAAIA,CAACW,GAAW,EAAEY,GAAY,EAAE;IAC9B,IAAIf,SAAS,CAAC,MAAM,CAAC,EAAEgB,OAAO,CAACxB,IAAI,CAACU,aAAa,CAAC,MAAM,EAAEC,GAAG,EAAEY,GAAG,CAAC,CAAC;EACtE,CAAC;EACDtB,IAAIA,CAACU,GAAW,EAAEY,GAAY,EAAE;IAC9B,IAAIf,SAAS,CAAC,MAAM,CAAC,EAAEgB,OAAO,CAACvB,IAAI,CAACS,aAAa,CAAC,MAAM,EAAEC,GAAG,EAAEY,GAAG,CAAC,CAAC;EACtE,CAAC;EACDrB,KAAKA,CAACS,GAAW,EAAEY,GAAY,EAAE;IAC/B,IAAIf,SAAS,CAAC,OAAO,CAAC,EAAEgB,OAAO,CAACtB,KAAK,CAACQ,aAAa,CAAC,OAAO,EAAEC,GAAG,EAAEY,GAAG,CAAC,CAAC;EACzE;AACF,CAAC;AAED,eAAeH,MAAM","ignoreList":[]}
@@ -0,0 +1 @@
1
+ {"type":"module"}