@hexar/biometric-identity-sdk-core 1.0.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.
Files changed (59) hide show
  1. package/dist/BiometricIdentitySDK.d.ts +111 -0
  2. package/dist/BiometricIdentitySDK.js +395 -0
  3. package/dist/ai-models/FaceDetector.d.ts +59 -0
  4. package/dist/ai-models/FaceDetector.js +167 -0
  5. package/dist/ai-models/LivenessDetector.d.ts +61 -0
  6. package/dist/ai-models/LivenessDetector.js +218 -0
  7. package/dist/api/BackendClient.d.ts +178 -0
  8. package/dist/api/BackendClient.js +199 -0
  9. package/dist/api/index.d.ts +5 -0
  10. package/dist/api/index.js +8 -0
  11. package/dist/encryption/index.d.ts +38 -0
  12. package/dist/encryption/index.js +99 -0
  13. package/dist/i18n/index.d.ts +6 -0
  14. package/dist/i18n/index.js +47 -0
  15. package/dist/i18n/languages/en.d.ts +2 -0
  16. package/dist/i18n/languages/en.js +112 -0
  17. package/dist/i18n/languages/es-AR.d.ts +2 -0
  18. package/dist/i18n/languages/es-AR.js +112 -0
  19. package/dist/i18n/languages/es.d.ts +2 -0
  20. package/dist/i18n/languages/es.js +112 -0
  21. package/dist/i18n/languages/pt-BR.d.ts +2 -0
  22. package/dist/i18n/languages/pt-BR.js +112 -0
  23. package/dist/i18n/types.d.ts +110 -0
  24. package/dist/i18n/types.js +2 -0
  25. package/dist/index.d.ts +20 -0
  26. package/dist/index.js +64 -0
  27. package/dist/services/BackendValidationService.d.ts +84 -0
  28. package/dist/services/BackendValidationService.js +174 -0
  29. package/dist/services/IValidationService.d.ts +132 -0
  30. package/dist/services/IValidationService.js +8 -0
  31. package/dist/services/index.d.ts +8 -0
  32. package/dist/services/index.js +10 -0
  33. package/dist/types/index.d.ts +288 -0
  34. package/dist/types/index.js +34 -0
  35. package/dist/validation/DocumentValidator.d.ts +84 -0
  36. package/dist/validation/DocumentValidator.js +295 -0
  37. package/dist/validation/OCREngine.d.ts +75 -0
  38. package/dist/validation/OCREngine.js +225 -0
  39. package/package.json +24 -0
  40. package/src/BiometricIdentitySDK.ts +493 -0
  41. package/src/ai-models/FaceDetector.ts +200 -0
  42. package/src/ai-models/LivenessDetector.ts +274 -0
  43. package/src/api/BackendClient.ts +395 -0
  44. package/src/api/index.ts +15 -0
  45. package/src/encryption/index.ts +108 -0
  46. package/src/i18n/index.ts +35 -0
  47. package/src/i18n/languages/en.ts +121 -0
  48. package/src/i18n/languages/es-AR.ts +121 -0
  49. package/src/i18n/languages/es.ts +121 -0
  50. package/src/i18n/languages/pt-BR.ts +121 -0
  51. package/src/i18n/types.ts +121 -0
  52. package/src/index.ts +54 -0
  53. package/src/services/BackendValidationService.ts +228 -0
  54. package/src/services/IValidationService.ts +158 -0
  55. package/src/services/index.ts +17 -0
  56. package/src/types/index.ts +380 -0
  57. package/src/validation/DocumentValidator.ts +353 -0
  58. package/src/validation/OCREngine.ts +265 -0
  59. package/tsconfig.json +20 -0
@@ -0,0 +1,265 @@
1
+ /**
2
+ * OCR Engine for extracting data from ID documents
3
+ */
4
+
5
+ import { DocumentData } from '../types';
6
+
7
+ export interface OCRResult {
8
+ text: string;
9
+ confidence: number;
10
+ boundingBox?: {
11
+ x: number;
12
+ y: number;
13
+ width: number;
14
+ height: number;
15
+ };
16
+ }
17
+
18
+ export class OCREngine {
19
+ private tesseract: any;
20
+ private isInitialized: boolean = false;
21
+
22
+ constructor() {}
23
+
24
+ /**
25
+ * Initialize OCR engine
26
+ */
27
+ async initialize(): Promise<void> {
28
+ if (this.isInitialized) return;
29
+
30
+ try {
31
+ console.log('Initializing OCR engine...');
32
+
33
+ // In real implementation, would initialize Tesseract.js
34
+ // await createWorker();
35
+
36
+ await new Promise(resolve => setTimeout(resolve, 500));
37
+
38
+ this.isInitialized = true;
39
+ console.log('OCR engine initialized successfully');
40
+ } catch (error) {
41
+ throw new Error(`Failed to initialize OCR engine: ${error}`);
42
+ }
43
+ }
44
+
45
+ /**
46
+ * Extract text from document image
47
+ */
48
+ async extractText(imageData: string | Buffer): Promise<OCRResult[]> {
49
+ if (!this.isInitialized) {
50
+ await this.initialize();
51
+ }
52
+
53
+ try {
54
+ // In real implementation:
55
+ // const result = await this.tesseract.recognize(imageData);
56
+ // return result.data.words;
57
+
58
+ // Mock implementation
59
+ return this.mockOCRResults();
60
+ } catch (error) {
61
+ throw new Error(`OCR extraction failed: ${error}`);
62
+ }
63
+ }
64
+
65
+ /**
66
+ * Extract structured data from ID document
67
+ */
68
+ async extractDocumentData(
69
+ frontImage: string | Buffer,
70
+ backImage?: string | Buffer
71
+ ): Promise<DocumentData> {
72
+ if (!this.isInitialized) {
73
+ await this.initialize();
74
+ }
75
+
76
+ try {
77
+ // Extract text from front
78
+ const frontText = await this.extractText(frontImage);
79
+ const frontRawText = frontText.map(r => r.text).join(' ');
80
+
81
+ // Extract text from back (if provided)
82
+ let backRawText = '';
83
+ if (backImage) {
84
+ const backText = await this.extractText(backImage);
85
+ backRawText = backText.map(r => r.text).join(' ');
86
+ }
87
+
88
+ // Parse structured data
89
+ const documentData = this.parseDocumentData(frontRawText, backRawText);
90
+
91
+ return documentData;
92
+ } catch (error) {
93
+ throw new Error(`Document data extraction failed: ${error}`);
94
+ }
95
+ }
96
+
97
+ /**
98
+ * Parse raw OCR text into structured document data
99
+ */
100
+ private parseDocumentData(frontText: string, backText: string): DocumentData {
101
+ // In real implementation:
102
+ // 1. Use regex patterns for different document types
103
+ // 2. Apply NLP for field extraction
104
+ // 3. Validate extracted data format
105
+ // 4. Handle multiple languages
106
+
107
+ // Mock implementation with realistic patterns
108
+ const firstName = this.extractField(frontText, /(?:Given\s+Name|First\s+Name|Nombre)[:\s]+([A-Z][a-z]+)/i) || 'John';
109
+ const lastName = this.extractField(frontText, /(?:Surname|Last\s+Name|Apellido)[:\s]+([A-Z][a-z]+)/i) || 'Doe';
110
+ const documentNumber = this.extractField(frontText, /(?:ID|Document)\s*(?:No|Number|#)[:\s]*([A-Z0-9]{6,12})/i) || this.generateMockDocNumber();
111
+ const dateOfBirth = this.extractDate(frontText, /(?:Date\s+of\s+Birth|DOB|Fecha\s+de\s+Nacimiento)[:\s]*([\d\/\-\.]+)/i) || '1990-01-15';
112
+ const expirationDate = this.extractDate(frontText, /(?:Expir(?:y|ation)|Valid\s+Until)[:\s]*([\d\/\-\.]+)/i) || this.generateExpirationDate();
113
+ const nationality = this.extractField(frontText, /(?:Nationality|Nacionalidad)[:\s]+([A-Z]{2,20})/i) || 'USA';
114
+
115
+ return {
116
+ firstName,
117
+ lastName,
118
+ documentNumber,
119
+ dateOfBirth,
120
+ expirationDate,
121
+ nationality,
122
+ documentType: 'national_id',
123
+ gender: this.extractGender(frontText),
124
+ rawText: frontText + ' ' + backText,
125
+ };
126
+ }
127
+
128
+ /**
129
+ * Extract field from text using regex
130
+ */
131
+ private extractField(text: string, pattern: RegExp): string | null {
132
+ const match = text.match(pattern);
133
+ return match ? match[1].trim() : null;
134
+ }
135
+
136
+ /**
137
+ * Extract and format date from text
138
+ */
139
+ private extractDate(text: string, pattern: RegExp): string | null {
140
+ const match = text.match(pattern);
141
+ if (!match) return null;
142
+
143
+ const dateStr = match[1].trim();
144
+
145
+ // Try to parse date
146
+ try {
147
+ // Handle various date formats: DD/MM/YYYY, MM-DD-YYYY, DD.MM.YYYY, etc.
148
+ const parts = dateStr.split(/[\-\/\.]/);
149
+
150
+ if (parts.length === 3) {
151
+ // Assume DD/MM/YYYY or MM/DD/YYYY
152
+ let day, month, year;
153
+
154
+ if (parseInt(parts[0]) > 12) {
155
+ // DD/MM/YYYY
156
+ day = parts[0].padStart(2, '0');
157
+ month = parts[1].padStart(2, '0');
158
+ year = parts[2];
159
+ } else {
160
+ // MM/DD/YYYY
161
+ month = parts[0].padStart(2, '0');
162
+ day = parts[1].padStart(2, '0');
163
+ year = parts[2];
164
+ }
165
+
166
+ return `${year}-${month}-${day}`;
167
+ }
168
+ } catch {
169
+ return dateStr;
170
+ }
171
+
172
+ return dateStr;
173
+ }
174
+
175
+ /**
176
+ * Extract gender from text
177
+ */
178
+ private extractGender(text: string): string | undefined {
179
+ const match = text.match(/(?:Sex|Gender|Sexo)[:\s]*([MF])/i);
180
+ if (match) {
181
+ return match[1].toUpperCase() === 'M' ? 'Male' : 'Female';
182
+ }
183
+ return undefined;
184
+ }
185
+
186
+ /**
187
+ * Generate mock document number
188
+ */
189
+ private generateMockDocNumber(): string {
190
+ const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
191
+ let result = '';
192
+ for (let i = 0; i < 9; i++) {
193
+ result += chars.charAt(Math.floor(Math.random() * chars.length));
194
+ }
195
+ return result;
196
+ }
197
+
198
+ /**
199
+ * Generate mock expiration date (2-5 years from now)
200
+ */
201
+ private generateExpirationDate(): string {
202
+ const date = new Date();
203
+ date.setFullYear(date.getFullYear() + 2 + Math.floor(Math.random() * 3));
204
+ return date.toISOString().split('T')[0];
205
+ }
206
+
207
+ /**
208
+ * Mock OCR results
209
+ */
210
+ private mockOCRResults(): OCRResult[] {
211
+ return [
212
+ { text: 'UNITED STATES OF AMERICA', confidence: 0.95 },
213
+ { text: 'Driver License', confidence: 0.92 },
214
+ { text: 'First Name: JOHN', confidence: 0.88 },
215
+ { text: 'Last Name: DOE', confidence: 0.90 },
216
+ { text: 'DOB: 01/15/1990', confidence: 0.87 },
217
+ { text: 'Document No: DL123456789', confidence: 0.85 },
218
+ { text: 'Expiration: 12/31/2026', confidence: 0.89 },
219
+ { text: 'Nationality: USA', confidence: 0.93 },
220
+ ];
221
+ }
222
+
223
+ /**
224
+ * Validate extracted document number format
225
+ */
226
+ validateDocumentNumber(documentNumber: string, documentType: string): boolean {
227
+ // In real implementation, validate format based on document type and country
228
+
229
+ if (!documentNumber || documentNumber.length < 6) return false;
230
+
231
+ // Basic alphanumeric check
232
+ return /^[A-Z0-9]{6,15}$/i.test(documentNumber);
233
+ }
234
+
235
+ /**
236
+ * Clean up resources
237
+ */
238
+ async dispose(): Promise<void> {
239
+ if (this.tesseract) {
240
+ // await this.tesseract.terminate();
241
+ this.tesseract = null;
242
+ }
243
+ this.isInitialized = false;
244
+ }
245
+ }
246
+
247
+ /**
248
+ * Clean and normalize extracted text
249
+ */
250
+ export function cleanText(text: string): string {
251
+ return text
252
+ .replace(/[^\w\s\-\/\.\:]/g, '') // Remove special characters
253
+ .replace(/\s+/g, ' ') // Normalize whitespace
254
+ .trim();
255
+ }
256
+
257
+ /**
258
+ * Validate date format
259
+ */
260
+ export function isValidDate(dateString: string): boolean {
261
+ const date = new Date(dateString);
262
+ return date instanceof Date && !isNaN(date.getTime());
263
+ }
264
+
265
+
package/tsconfig.json ADDED
@@ -0,0 +1,20 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2020",
4
+ "module": "commonjs",
5
+ "lib": ["ES2020"],
6
+ "declaration": true,
7
+ "outDir": "./dist",
8
+ "rootDir": "./src",
9
+ "strict": true,
10
+ "esModuleInterop": true,
11
+ "skipLibCheck": true,
12
+ "forceConsistentCasingInFileNames": true,
13
+ "resolveJsonModule": true,
14
+ "moduleResolution": "node"
15
+ },
16
+ "include": ["src/**/*"],
17
+ "exclude": ["node_modules", "dist"]
18
+ }
19
+
20
+