react-native-mfa-trustbuilder 0.1.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 (38) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +202 -0
  3. package/Trustbuilder.podspec +29 -0
  4. package/android/build.gradle +74 -0
  5. package/android/libs/iwlib-mac-0.2.17.jar +0 -0
  6. package/android/proguard-rules.pro +2 -0
  7. package/android/src/main/AndroidManifest.xml +2 -0
  8. package/android/src/main/java/com/trustbuilder/SimpleWebServiceCall.kt +40 -0
  9. package/android/src/main/java/com/trustbuilder/TrustbuilderModule.kt +590 -0
  10. package/android/src/main/java/com/trustbuilder/TrustbuilderPackage.kt +32 -0
  11. package/ios/RNTrustbuilder.h +5 -0
  12. package/ios/RNTrustbuilder.mm +433 -0
  13. package/ios/iw.h +785 -0
  14. package/ios/libs/libmaccess-0.2.19-ios-arm64_armv7.a +0 -0
  15. package/ios/libs/libmaccess-0.2.19-ios-arm64_i386_x86_64-simulator.a +0 -0
  16. package/lib/module/NativeRNTrustbuilder.js +5 -0
  17. package/lib/module/NativeRNTrustbuilder.js.map +1 -0
  18. package/lib/module/errors.js +64 -0
  19. package/lib/module/errors.js.map +1 -0
  20. package/lib/module/index.js +309 -0
  21. package/lib/module/index.js.map +1 -0
  22. package/lib/module/package.json +1 -0
  23. package/lib/module/types.js +2 -0
  24. package/lib/module/types.js.map +1 -0
  25. package/lib/typescript/package.json +1 -0
  26. package/lib/typescript/src/NativeRNTrustbuilder.d.ts +89 -0
  27. package/lib/typescript/src/NativeRNTrustbuilder.d.ts.map +1 -0
  28. package/lib/typescript/src/errors.d.ts +29 -0
  29. package/lib/typescript/src/errors.d.ts.map +1 -0
  30. package/lib/typescript/src/index.d.ts +68 -0
  31. package/lib/typescript/src/index.d.ts.map +1 -0
  32. package/lib/typescript/src/types.d.ts +45 -0
  33. package/lib/typescript/src/types.d.ts.map +1 -0
  34. package/package.json +184 -0
  35. package/src/NativeRNTrustbuilder.ts +117 -0
  36. package/src/errors.ts +72 -0
  37. package/src/index.ts +461 -0
  38. package/src/types.ts +54 -0
@@ -0,0 +1,590 @@
1
+ package com.trustbuilder
2
+
3
+ import android.content.Context
4
+ import android.provider.Settings
5
+ import android.util.Log
6
+ import androidx.security.crypto.EncryptedSharedPreferences
7
+ import androidx.security.crypto.MasterKey
8
+ import com.facebook.react.bridge.ReactApplicationContext
9
+ import com.inwebo.iwlib.IW
10
+ import org.json.JSONObject
11
+
12
+ class TrustbuilderModule(reactContext: ReactApplicationContext) :
13
+ NativeRNTrustbuilderSpec(reactContext) {
14
+
15
+ private val context: ReactApplicationContext = reactContext
16
+ private var iw: IW? = null
17
+ private var isInitialized = false
18
+
19
+ companion object {
20
+ const val NAME = "RNTrustbuilder"
21
+ private const val STORAGE_KEY = "trustbuilder_storage_data"
22
+ private const val PREFS_NAME = "trustbuilder_encrypted_prefs"
23
+ private const val TAG = "TrustbuilderModule"
24
+ }
25
+
26
+ private fun getAndroidId(): String {
27
+ return Settings.Secure.getString(
28
+ context.contentResolver,
29
+ Settings.Secure.ANDROID_ID
30
+ ) ?: ""
31
+ }
32
+
33
+ private fun getEncryptedPrefs(): EncryptedSharedPreferences {
34
+ val masterKey = MasterKey.Builder(context)
35
+ .setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
36
+ .build()
37
+
38
+ return EncryptedSharedPreferences.create(
39
+ context,
40
+ PREFS_NAME,
41
+ masterKey,
42
+ EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
43
+ EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
44
+ ) as EncryptedSharedPreferences
45
+ }
46
+
47
+ private fun requireIW(): IW {
48
+ val instance = iw
49
+ if (instance == null) {
50
+ throw IllegalStateException("Trustbuilder not initialized. Call initialize() first.")
51
+ }
52
+ return instance
53
+ }
54
+
55
+ private fun initIW(config: JSONObject) {
56
+ if (isInitialized) return
57
+
58
+ val macId = config.getString("macId")
59
+ val server = config.getString("server")
60
+ val hostVersion = config.getString("hostVersion")
61
+ val timeout = config.getLong("timeout")
62
+ val lang = config.getString("lang")
63
+
64
+ val sn = getAndroidId()
65
+ val appData = "_"
66
+
67
+ Log.d(TAG, "Initializing IW: SN=$sn, server=$server, macId=$macId, hostVersion=$hostVersion")
68
+
69
+ try {
70
+ iw = IW()
71
+
72
+ Log.d(TAG, "Calling Init(sn=$sn, appData=$appData)")
73
+ iw!!.Init(sn, appData)
74
+
75
+ Log.d(TAG, "Setting WsServer: $server")
76
+ iw!!.WsServerSet(server)
77
+
78
+ Log.d(TAG, "Setting HostVersion: $hostVersion")
79
+ iw!!.HostVersionSet(hostVersion)
80
+
81
+ Log.d(TAG, "Setting WsTimeout: $timeout")
82
+ iw!!.WsTimeoutSet(timeout)
83
+
84
+ Log.d(TAG, "Setting Maccess: $macId")
85
+ iw!!.MaccessSet(macId)
86
+
87
+ Log.d(TAG, "Setting Lang: $lang")
88
+ iw!!.LangSet(lang)
89
+
90
+ val storedData = getEncryptedPrefs().getString(STORAGE_KEY, "") ?: ""
91
+ Log.d(TAG, "Setting storage data (${storedData.length} chars)")
92
+ iw!!.StorageDataSet(storedData)
93
+
94
+ Log.d(TAG, "Init completed, log=${iw!!.log}")
95
+
96
+ isInitialized = true
97
+ Log.d(TAG, "IW initialized successfully")
98
+ } catch (e: Exception) {
99
+ Log.e(TAG, "Failed to initialize IW: ${e.message}", e)
100
+ iw = null
101
+ isInitialized = false
102
+ throw e
103
+ }
104
+ }
105
+
106
+ private fun saveStorage() {
107
+ val instance = iw ?: return
108
+ try {
109
+ if (instance.StorageDataChanged() != 0L) {
110
+ val data = instance.StorageDataGet()
111
+ if (data != null) {
112
+ getEncryptedPrefs().edit().putString(STORAGE_KEY, data).apply()
113
+ Log.d(TAG, "Storage saved (${data.length} chars)")
114
+ }
115
+ }
116
+ } catch (e: Exception) {
117
+ Log.e(TAG, "Failed to save storage: ${e.message}", e)
118
+ }
119
+ }
120
+
121
+ override fun initialize(config: String): String {
122
+ try {
123
+ val configJson = JSONObject(config)
124
+ initIW(configJson)
125
+
126
+ val instance = requireIW()
127
+ val result = JSONObject()
128
+
129
+ val activated = try {
130
+ instance.IsActivated() == 1L
131
+ } catch (e: NullPointerException) {
132
+ Log.w(TAG, "IsActivated failed (data not initialized): ${e.message}")
133
+ false
134
+ }
135
+
136
+ val blocked = try {
137
+ instance.IsBlocked() == 1L
138
+ } catch (e: NullPointerException) {
139
+ Log.w(TAG, "IsBlocked failed (data not initialized): ${e.message}")
140
+ false
141
+ }
142
+
143
+ result.put("isActivated", activated)
144
+ result.put("isBlocked", blocked)
145
+ return result.toString()
146
+ } catch (e: Exception) {
147
+ Log.e(TAG, "Init error: ${e.message}", e)
148
+ val result = JSONObject()
149
+ result.put("isActivated", false)
150
+ result.put("isBlocked", false)
151
+ result.put("error", e.message ?: "Unknown error")
152
+ return result.toString()
153
+ }
154
+ }
155
+
156
+ override fun setStorageData(data: String): Boolean {
157
+ getEncryptedPrefs().edit().putString(STORAGE_KEY, data).apply()
158
+ return try {
159
+ iw?.StorageDataSet(data) == 0L
160
+ } catch (e: Exception) {
161
+ Log.e(TAG, "setStorageData error: ${e.message}", e)
162
+ false
163
+ }
164
+ }
165
+
166
+ override fun getStorageData(): String {
167
+ return getEncryptedPrefs().getString(STORAGE_KEY, "") ?: ""
168
+ }
169
+
170
+ override fun storageDataChanged(): Boolean {
171
+ return try {
172
+ iw?.StorageDataChanged() != 0L
173
+ } catch (e: Exception) {
174
+ false
175
+ }
176
+ }
177
+
178
+ override fun isActivated(): Boolean {
179
+ return try {
180
+ iw?.IsActivated() == 1L
181
+ } catch (e: Exception) {
182
+ false
183
+ }
184
+ }
185
+
186
+ override fun isBlocked(): Boolean {
187
+ return try {
188
+ iw?.IsBlocked() == 1L
189
+ } catch (e: Exception) {
190
+ false
191
+ }
192
+ }
193
+
194
+ override fun mustUpgrade(): Boolean {
195
+ return try {
196
+ iw?.MustUpgrade() == 1L
197
+ } catch (e: Exception) {
198
+ false
199
+ }
200
+ }
201
+
202
+ override fun activationStart(code: String): String {
203
+ return try {
204
+ requireIW().ActivationStart(code).toString()
205
+ } catch (e: Exception) {
206
+ Log.e(TAG, "activationStart error: ${e.message}", e)
207
+ "-1"
208
+ }
209
+ }
210
+
211
+ override fun activationFinalize(code: String, pin: String, name: String): String {
212
+ return try {
213
+ val result = requireIW().ActivationFinalize(code, pin, name)
214
+ saveStorage()
215
+ result.toString()
216
+ } catch (e: Exception) {
217
+ Log.e(TAG, "activationFinalize error: ${e.message}", e)
218
+ "-1"
219
+ }
220
+ }
221
+
222
+ override fun resetStart(code: String): String {
223
+ return try {
224
+ requireIW().ResetStart(code).toString()
225
+ } catch (e: Exception) {
226
+ Log.e(TAG, "resetStart error: ${e.message}", e)
227
+ "-1"
228
+ }
229
+ }
230
+
231
+ override fun resetFinalize(code: String, pin: String): String {
232
+ return try {
233
+ val result = requireIW().ResetFinalize(code, pin)
234
+ saveStorage()
235
+ result.toString()
236
+ } catch (e: Exception) {
237
+ Log.e(TAG, "resetFinalize error: ${e.message}", e)
238
+ "-1"
239
+ }
240
+ }
241
+
242
+ override fun synchronizeStart(): String {
243
+ return try {
244
+ requireIW().SynchronizeStart().toString()
245
+ } catch (e: Exception) {
246
+ Log.e(TAG, "synchronizeStart error: ${e.message}", e)
247
+ "-1"
248
+ }
249
+ }
250
+
251
+ override fun synchronizeFinalize(pin: String): String {
252
+ return try {
253
+ val result = requireIW().SynchronizeFinalize(pin)
254
+ saveStorage()
255
+ result.toString()
256
+ } catch (e: Exception) {
257
+ Log.e(TAG, "synchronizeFinalize error: ${e.message}", e)
258
+ "-1"
259
+ }
260
+ }
261
+
262
+ override fun pwdUpdateStart(): String {
263
+ return try {
264
+ requireIW().PwdUpdateStart().toString()
265
+ } catch (e: Exception) {
266
+ Log.e(TAG, "pwdUpdateStart error: ${e.message}", e)
267
+ "-1"
268
+ }
269
+ }
270
+
271
+ override fun pwdUpdateFinalize(newPin: String, currentPin: String): String {
272
+ return try {
273
+ val result = requireIW().PwdUpdateFinalize(newPin, currentPin)
274
+ saveStorage()
275
+ result.toString()
276
+ } catch (e: Exception) {
277
+ Log.e(TAG, "pwdUpdateFinalize error: ${e.message}", e)
278
+ "-1"
279
+ }
280
+ }
281
+
282
+ override fun setBiokeyStart(): String {
283
+ return try {
284
+ requireIW().SetBiokeyStart().toString()
285
+ } catch (e: Exception) {
286
+ Log.e(TAG, "setBiokeyStart error: ${e.message}", e)
287
+ "-1"
288
+ }
289
+ }
290
+
291
+ override fun setBiokeyFinalize(biokey: String, pin: String): String {
292
+ return try {
293
+ val result = requireIW().SetBiokeyFinalize(biokey, pin)
294
+ saveStorage()
295
+ result.toString()
296
+ } catch (e: Exception) {
297
+ Log.e(TAG, "setBiokeyFinalize error: ${e.message}", e)
298
+ "-1"
299
+ }
300
+ }
301
+
302
+ override fun unsetBiokeysStart(): String {
303
+ return try {
304
+ requireIW().UnsetBiokeysStart().toString()
305
+ } catch (e: Exception) {
306
+ Log.e(TAG, "unsetBiokeysStart error: ${e.message}", e)
307
+ "-1"
308
+ }
309
+ }
310
+
311
+ override fun unsetBiokeysFinalize(pin: String): String {
312
+ return try {
313
+ val result = requireIW().UnsetBiokeysFinalize(pin)
314
+ saveStorage()
315
+ result.toString()
316
+ } catch (e: Exception) {
317
+ Log.e(TAG, "unsetBiokeysFinalize error: ${e.message}", e)
318
+ "-1"
319
+ }
320
+ }
321
+
322
+ override fun onlineOtpStart(serviceIndex: Double): String {
323
+ return try {
324
+ requireIW().OnlineOtpStart(serviceIndex.toInt()).toString()
325
+ } catch (e: Exception) {
326
+ Log.e(TAG, "onlineOtpStart error: ${e.message}", e)
327
+ "-1"
328
+ }
329
+ }
330
+
331
+ override fun onlineOtpFinalize(serviceIndex: Double, pin: String, keyType: Double): String {
332
+ return try {
333
+ val result = requireIW().OnlineOtpFinalizeExt(
334
+ serviceIndex.toInt(),
335
+ pin,
336
+ keyType.toLong()
337
+ )
338
+ saveStorage()
339
+ result.toString()
340
+ } catch (e: Exception) {
341
+ Log.e(TAG, "onlineOtpFinalize error: ${e.message}", e)
342
+ "-1"
343
+ }
344
+ }
345
+
346
+ override fun otpAnswerOtp(): String {
347
+ return try {
348
+ requireIW().OtpAnswerOtp() ?: ""
349
+ } catch (e: Exception) {
350
+ Log.e(TAG, "otpAnswerOtp error: ${e.message}", e)
351
+ ""
352
+ }
353
+ }
354
+
355
+ override fun otpShouldSynchronize(serviceId: Double): Boolean {
356
+ return try {
357
+ requireIW().OtpShouldSynchronize(serviceId.toInt()) == 1L
358
+ } catch (e: Exception) {
359
+ Log.e(TAG, "otpShouldSynchronize error: ${e.message}", e)
360
+ false
361
+ }
362
+ }
363
+
364
+ override fun otpModeQuery(serviceId: Double): Boolean {
365
+ return try {
366
+ requireIW().OtpModeQuery(serviceId.toInt()) == 1L
367
+ } catch (e: Exception) {
368
+ Log.e(TAG, "otpModeQuery error: ${e.message}", e)
369
+ false
370
+ }
371
+ }
372
+
373
+ override fun otpGenerate(pin: String): String {
374
+ return try {
375
+ val result = requireIW().OtpGenerate(pin)
376
+ saveStorage()
377
+ result ?: ""
378
+ } catch (e: Exception) {
379
+ Log.e(TAG, "otpGenerate error: ${e.message}", e)
380
+ ""
381
+ }
382
+ }
383
+
384
+ override fun displayTime(): Double {
385
+ return try {
386
+ requireIW().DisplayTime().toDouble()
387
+ } catch (e: Exception) {
388
+ Log.e(TAG, "displayTime error: ${e.message}", e)
389
+ 0.0
390
+ }
391
+ }
392
+
393
+ override fun setDeviceOS(deviceOS: String) {
394
+ try {
395
+ requireIW().SetDeviceOS(deviceOS)
396
+ } catch (e: Exception) {
397
+ Log.e(TAG, "setDeviceOS error: ${e.message}", e)
398
+ }
399
+ }
400
+
401
+ override fun pushRegistrationStart(): String {
402
+ return try {
403
+ requireIW().PushRegistrationStart().toString()
404
+ } catch (e: Exception) {
405
+ Log.e(TAG, "pushRegistrationStart error: ${e.message}", e)
406
+ "-1"
407
+ }
408
+ }
409
+
410
+ override fun pushRegistrationFinalize(pushId: String): String {
411
+ return try {
412
+ val result = requireIW().PushRegistrationFinalize(pushId)
413
+ saveStorage()
414
+ result.toString()
415
+ } catch (e: Exception) {
416
+ Log.e(TAG, "pushRegistrationFinalize error: ${e.message}", e)
417
+ "-1"
418
+ }
419
+ }
420
+
421
+ override fun checkPush(): String {
422
+ return try {
423
+ requireIW().CheckPush().toString()
424
+ } catch (e: Exception) {
425
+ Log.e(TAG, "checkPush error: ${e.message}", e)
426
+ "-1"
427
+ }
428
+ }
429
+
430
+ override fun pushAlias(): String {
431
+ return try {
432
+ requireIW().PushAlias() ?: ""
433
+ } catch (e: Exception) {
434
+ Log.e(TAG, "pushAlias error: ${e.message}", e)
435
+ ""
436
+ }
437
+ }
438
+
439
+ override fun pushAction(): String {
440
+ return try {
441
+ requireIW().PushAction() ?: ""
442
+ } catch (e: Exception) {
443
+ Log.e(TAG, "pushAction error: ${e.message}", e)
444
+ ""
445
+ }
446
+ }
447
+
448
+ override fun pushContext(): String {
449
+ return try {
450
+ requireIW().PushContext() ?: ""
451
+ } catch (e: Exception) {
452
+ Log.e(TAG, "pushContext error: ${e.message}", e)
453
+ ""
454
+ }
455
+ }
456
+
457
+ override fun onlineSealStart(serviceIndex: Double): String {
458
+ return try {
459
+ requireIW().OnlineSealStart(serviceIndex.toInt()).toString()
460
+ } catch (e: Exception) {
461
+ Log.e(TAG, "onlineSealStart error: ${e.message}", e)
462
+ "-1"
463
+ }
464
+ }
465
+
466
+ override fun onlineSealFinalize(
467
+ serviceIndex: Double,
468
+ pin: String,
469
+ keyType: Double,
470
+ sealData: String
471
+ ): String {
472
+ return try {
473
+ val result = requireIW().OnlineSealFinalizeExt(
474
+ serviceIndex.toInt(),
475
+ pin,
476
+ keyType.toLong(),
477
+ sealData
478
+ )
479
+ saveStorage()
480
+ result.toString()
481
+ } catch (e: Exception) {
482
+ Log.e(TAG, "onlineSealFinalize error: ${e.message}", e)
483
+ "-1"
484
+ }
485
+ }
486
+
487
+ override fun sealAnswerOtp(): String {
488
+ return try {
489
+ requireIW().SealAnswerOtp() ?: ""
490
+ } catch (e: Exception) {
491
+ Log.e(TAG, "sealAnswerOtp error: ${e.message}", e)
492
+ ""
493
+ }
494
+ }
495
+
496
+ override fun sealShouldSynchronize(serviceId: Double): Boolean {
497
+ return try {
498
+ requireIW().SealShouldSynchronize(serviceId.toInt()) == 1L
499
+ } catch (e: Exception) {
500
+ Log.e(TAG, "sealShouldSynchronize error: ${e.message}", e)
501
+ false
502
+ }
503
+ }
504
+
505
+ override fun sealModeQuery(serviceId: Double): Boolean {
506
+ return try {
507
+ requireIW().SealModeQuery(serviceId.toInt()) == 1L
508
+ } catch (e: Exception) {
509
+ Log.e(TAG, "sealModeQuery error: ${e.message}", e)
510
+ false
511
+ }
512
+ }
513
+
514
+ override fun sealGenerate(pin: String, sealData: String): String {
515
+ return try {
516
+ val result = requireIW().SealGenerate(pin, sealData)
517
+ saveStorage()
518
+ result ?: ""
519
+ } catch (e: Exception) {
520
+ Log.e(TAG, "sealGenerate error: ${e.message}", e)
521
+ ""
522
+ }
523
+ }
524
+
525
+ override fun serviceNb(): Double {
526
+ return try {
527
+ requireIW().ServiceNb().toDouble()
528
+ } catch (e: Exception) {
529
+ Log.e(TAG, "serviceNb error: ${e.message}", e)
530
+ 0.0
531
+ }
532
+ }
533
+
534
+ override fun serviceName(index: Double): String {
535
+ return try {
536
+ requireIW().ServiceName(index.toInt()) ?: ""
537
+ } catch (e: Exception) {
538
+ Log.e(TAG, "serviceName error: ${e.message}", e)
539
+ ""
540
+ }
541
+ }
542
+
543
+ override fun serviceLogo(index: Double): String {
544
+ return try {
545
+ requireIW().ServiceLogo(index.toInt()) ?: ""
546
+ } catch (e: Exception) {
547
+ Log.e(TAG, "serviceLogo error: ${e.message}", e)
548
+ ""
549
+ }
550
+ }
551
+
552
+ override fun serviceDisabled(index: Double): Boolean {
553
+ return try {
554
+ requireIW().ServiceDisabled(index.toInt()) == 1L
555
+ } catch (e: Exception) {
556
+ Log.e(TAG, "serviceDisabled error: ${e.message}", e)
557
+ false
558
+ }
559
+ }
560
+
561
+ override fun getVersionInfo(): String {
562
+ return try {
563
+ val result = JSONObject()
564
+ result.put("libraryVersion", IW.VersionGet() ?: "")
565
+ val instance = iw
566
+ result.put("newVersionAvailable", instance?.NewVersionAvailable() ?: "")
567
+ result.put("newVersionUrl", instance?.NewVersionURL() ?: "")
568
+ result.put("majorVersionRequired", instance?.MajorVersionRequired() == 1L)
569
+ result.put("shouldAskForMinorUpdate", instance?.ShouldAskForMinorUpdate() == 1L)
570
+ result.toString()
571
+ } catch (e: Exception) {
572
+ Log.e(TAG, "getVersionInfo error: ${e.message}", e)
573
+ "{}"
574
+ }
575
+ }
576
+
577
+ override fun getConstants(): Map<String, Any> {
578
+ return mapOf(
579
+ "NAME" to NAME
580
+ )
581
+ }
582
+
583
+ override fun addListener(event: String) {
584
+ // Required for NativeEventEmitter support
585
+ }
586
+
587
+ override fun removeListeners(count: Double) {
588
+ // Required for NativeEventEmitter support
589
+ }
590
+ }
@@ -0,0 +1,32 @@
1
+ package com.trustbuilder
2
+
3
+ import com.facebook.react.TurboReactPackage
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
+
9
+ class TrustbuilderPackage : TurboReactPackage() {
10
+ override fun getModule(name: String, reactContext: ReactApplicationContext): NativeModule? {
11
+ return if (name == TrustbuilderModule.NAME) {
12
+ TrustbuilderModule(reactContext)
13
+ } else {
14
+ null
15
+ }
16
+ }
17
+
18
+ override fun getReactModuleInfoProvider(): ReactModuleInfoProvider {
19
+ return ReactModuleInfoProvider {
20
+ val moduleInfos = mutableMapOf<String, ReactModuleInfo>()
21
+ moduleInfos[TrustbuilderModule.NAME] = ReactModuleInfo(
22
+ TrustbuilderModule.NAME,
23
+ TrustbuilderModule.NAME,
24
+ false, // canOverrideExistingModule
25
+ false, // needsEagerInit
26
+ false, // isCxxModule
27
+ true // isTurboModule
28
+ )
29
+ moduleInfos
30
+ }
31
+ }
32
+ }
@@ -0,0 +1,5 @@
1
+ #import <RNTrustbuilderSpec/RNTrustbuilderSpec.h>
2
+
3
+ @interface RNTrustbuilder : NSObject <NativeRNTrustbuilderSpec>
4
+
5
+ @end