@onairos/react-native 3.0.0 → 3.0.2

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/lib/commonjs/api/index.js +105 -86
  2. package/lib/commonjs/api/index.js.map +1 -1
  3. package/lib/commonjs/components/OnairosButton.js +21 -13
  4. package/lib/commonjs/components/OnairosButton.js.map +1 -1
  5. package/lib/commonjs/components/UniversalOnboarding.js +18 -0
  6. package/lib/commonjs/components/UniversalOnboarding.js.map +1 -1
  7. package/lib/commonjs/index.js +367 -12
  8. package/lib/commonjs/index.js.map +1 -1
  9. package/lib/commonjs/services/oauthService.js +101 -192
  10. package/lib/commonjs/services/oauthService.js.map +1 -1
  11. package/lib/commonjs/utils/secureStorage.js +129 -42
  12. package/lib/commonjs/utils/secureStorage.js.map +1 -1
  13. package/lib/module/api/index.js +105 -86
  14. package/lib/module/api/index.js.map +1 -1
  15. package/lib/module/components/OnairosButton.js +22 -14
  16. package/lib/module/components/OnairosButton.js.map +1 -1
  17. package/lib/module/components/UniversalOnboarding.js +19 -1
  18. package/lib/module/components/UniversalOnboarding.js.map +1 -1
  19. package/lib/module/index.js +11 -10
  20. package/lib/module/index.js.map +1 -1
  21. package/lib/module/services/oauthService.js +83 -192
  22. package/lib/module/services/oauthService.js.map +1 -1
  23. package/lib/module/utils/secureStorage.js +129 -42
  24. package/lib/module/utils/secureStorage.js.map +1 -1
  25. package/package.json +1 -1
  26. package/src/api/index.ts +86 -101
  27. package/src/components/OnairosButton.tsx +23 -14
  28. package/src/components/UniversalOnboarding.tsx +13 -0
  29. package/src/index.ts +2 -4
  30. package/src/services/oauthService.ts +419 -534
  31. package/src/types/index.ts +5 -0
  32. package/src/utils/secureStorage.ts +140 -57
@@ -1,15 +1,110 @@
1
+ import * as Keychain from 'react-native-keychain';
1
2
  import { Platform } from 'react-native';
2
- import { sha256 } from './crypto';
3
- // Temporary in-memory storage
4
- let mockStorage = {};
3
+ import { STORAGE_KEYS } from '../constants';
4
+
5
+ // Define OnairosCredentials interface locally to avoid circular dependencies
6
+
7
+ // Create a mock storage for environments without Keychain access (like Expo Go)
8
+ const mockStorage = {};
9
+
10
+ // Check if running in Expo Go or environments without native module access
11
+ const isKeychainAvailable = () => {
12
+ try {
13
+ return typeof Keychain.getGenericPassword === 'function';
14
+ } catch (e) {
15
+ return false;
16
+ }
17
+ };
18
+
19
+ // Wrapper for getGenericPassword that falls back to mock storage
20
+ const safeGetGenericPassword = async options => {
21
+ try {
22
+ if (isKeychainAvailable()) {
23
+ return await Keychain.getGenericPassword(options);
24
+ } else {
25
+ // Fall back to mock storage in memory
26
+ const key = (options === null || options === void 0 ? void 0 : options.service) || 'default';
27
+ return mockStorage[key] || null;
28
+ }
29
+ } catch (error) {
30
+ console.warn('Keychain access failed, using mock storage', error);
31
+ // Fall back to mock storage on error
32
+ const key = (options === null || options === void 0 ? void 0 : options.service) || 'default';
33
+ return mockStorage[key] || null;
34
+ }
35
+ };
36
+
37
+ // Wrapper for setGenericPassword that falls back to mock storage
38
+ const safeSetGenericPassword = async (username, password, options) => {
39
+ try {
40
+ if (isKeychainAvailable()) {
41
+ return await Keychain.setGenericPassword(username, password, options);
42
+ } else {
43
+ // Fall back to mock storage in memory
44
+ const key = (options === null || options === void 0 ? void 0 : options.service) || 'default';
45
+ mockStorage[key] = {
46
+ username,
47
+ password
48
+ };
49
+ return true;
50
+ }
51
+ } catch (error) {
52
+ console.warn('Keychain access failed, using mock storage', error);
53
+ // Fall back to mock storage on error
54
+ const key = (options === null || options === void 0 ? void 0 : options.service) || 'default';
55
+ mockStorage[key] = {
56
+ username,
57
+ password
58
+ };
59
+ return true;
60
+ }
61
+ };
62
+
63
+ // Wrapper for resetGenericPassword that falls back to mock storage
64
+ const safeResetGenericPassword = async options => {
65
+ try {
66
+ if (isKeychainAvailable()) {
67
+ return await Keychain.resetGenericPassword(options);
68
+ } else {
69
+ // Fall back to mock storage in memory
70
+ const key = (options === null || options === void 0 ? void 0 : options.service) || 'default';
71
+ delete mockStorage[key];
72
+ return true;
73
+ }
74
+ } catch (error) {
75
+ console.warn('Keychain access failed, using mock storage', error);
76
+ // Fall back to mock storage on error
77
+ const key = (options === null || options === void 0 ? void 0 : options.service) || 'default';
78
+ delete mockStorage[key];
79
+ return true;
80
+ }
81
+ };
5
82
 
6
83
  /**
7
84
  * Store credentials in memory (temporary solution)
8
85
  */
9
- export const storeCredentials = async (credentials, options = {}) => {
86
+ export const storeCredentials = async credentials => {
10
87
  try {
11
- console.log('[Mock] Storing credentials:', credentials.username);
12
- mockStorage[credentials.username] = JSON.stringify(credentials);
88
+ const existingCredentials = await getCredentials();
89
+ const updatedCredentials = {
90
+ ...existingCredentials,
91
+ ...credentials,
92
+ createdAt: (existingCredentials === null || existingCredentials === void 0 ? void 0 : existingCredentials.createdAt) || Date.now()
93
+ };
94
+ const username = updatedCredentials.username;
95
+ if (!username) {
96
+ throw new Error('Username is required for storing credentials');
97
+ }
98
+ const options = {
99
+ service: STORAGE_KEYS.credentials
100
+ };
101
+
102
+ // Only use secure storage options on real devices
103
+ if (Platform.OS !== 'web' && isKeychainAvailable()) {
104
+ options.accessControl = Keychain.ACCESS_CONTROL.BIOMETRY_ANY_OR_DEVICE_PASSCODE;
105
+ options.accessible = Keychain.ACCESSIBLE.WHEN_UNLOCKED;
106
+ }
107
+ await safeSetGenericPassword(username, JSON.stringify(updatedCredentials), options);
13
108
  return true;
14
109
  } catch (error) {
15
110
  console.error('Error storing credentials:', error);
@@ -20,16 +115,17 @@ export const storeCredentials = async (credentials, options = {}) => {
20
115
  /**
21
116
  * Retrieve credentials from memory (temporary solution)
22
117
  */
23
- export const getCredentials = async (options = {}) => {
118
+ export const getCredentials = async () => {
24
119
  try {
25
- // Get the first stored credential (temporary solution)
26
- const storedCredential = Object.values(mockStorage)[0];
27
- if (!storedCredential) {
28
- return null;
120
+ const credentials = await safeGetGenericPassword({
121
+ service: STORAGE_KEYS.credentials
122
+ });
123
+ if (credentials) {
124
+ return JSON.parse(credentials.password);
29
125
  }
30
- return JSON.parse(storedCredential);
126
+ return null;
31
127
  } catch (error) {
32
- console.error('Error retrieving credentials:', error);
128
+ console.error('Error getting credentials:', error);
33
129
  return null;
34
130
  }
35
131
  };
@@ -39,9 +135,12 @@ export const getCredentials = async (options = {}) => {
39
135
  */
40
136
  export const hasCredentials = async () => {
41
137
  try {
42
- return Object.keys(mockStorage).length > 0;
138
+ const credentials = await safeGetGenericPassword({
139
+ service: STORAGE_KEYS.credentials
140
+ });
141
+ return !!credentials;
43
142
  } catch (error) {
44
- console.error('Error checking for credentials:', error);
143
+ console.error('Error checking credentials:', error);
45
144
  return false;
46
145
  }
47
146
  };
@@ -51,7 +150,9 @@ export const hasCredentials = async () => {
51
150
  */
52
151
  export const deleteCredentials = async () => {
53
152
  try {
54
- mockStorage = {};
153
+ await safeResetGenericPassword({
154
+ service: STORAGE_KEYS.credentials
155
+ });
55
156
  return true;
56
157
  } catch (error) {
57
158
  console.error('Error deleting credentials:', error);
@@ -62,43 +163,29 @@ export const deleteCredentials = async () => {
62
163
  /**
63
164
  * Update specific fields in the stored credentials
64
165
  */
65
- export const updateCredentials = async (updates, options = {}) => {
66
- try {
67
- const currentCredentials = await getCredentials(options);
68
- if (!currentCredentials) {
69
- return false;
70
- }
71
- const updatedCredentials = {
72
- ...currentCredentials,
73
- ...updates
74
- };
75
- return await storeCredentials(updatedCredentials, options);
76
- } catch (error) {
77
- console.error('Error updating credentials:', error);
78
- return false;
79
- }
166
+ export const updateCredentials = async credentials => {
167
+ return storeCredentials(credentials);
80
168
  };
81
169
 
82
170
  /**
83
171
  * Generate a device-specific unique username
84
172
  */
85
- export const generateDeviceUsername = async () => {
86
- try {
87
- const deviceInfo = `${Platform.OS}-${Platform.Version}-${Date.now()}`;
88
- const username = `onairos_${sha256(deviceInfo).substring(0, 10)}`;
89
- return username;
90
- } catch (error) {
91
- console.error('Error generating device username:', error);
92
- return `onairos_${Date.now().toString(36)}`;
93
- }
173
+ export const generateDeviceUsername = () => {
174
+ const randomId = Math.random().toString(36).substring(2, 10);
175
+ return `dev_${randomId}`;
94
176
  };
95
177
 
96
178
  /**
97
179
  * Verify credentials (temporary mock implementation)
98
180
  */
99
- export const verifyCredentials = async credentials => {
181
+ export const verifyCredentials = async username => {
100
182
  try {
101
- console.log('[Mock] Verifying credentials for:', credentials.username);
183
+ // For Expo Go or development, always return true
184
+ if (!isKeychainAvailable()) {
185
+ return true;
186
+ }
187
+
188
+ // TODO: Implement actual verification with API
102
189
  return true;
103
190
  } catch (error) {
104
191
  console.error('Error verifying credentials:', error);
@@ -1 +1 @@
1
- {"version":3,"names":["Platform","sha256","mockStorage","storeCredentials","credentials","options","console","log","username","JSON","stringify","error","getCredentials","storedCredential","Object","values","parse","hasCredentials","keys","length","deleteCredentials","updateCredentials","updates","currentCredentials","updatedCredentials","generateDeviceUsername","deviceInfo","OS","Version","Date","now","substring","toString","verifyCredentials"],"sourceRoot":"..\\..\\..\\src","sources":["utils/secureStorage.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["Keychain","Platform","STORAGE_KEYS","mockStorage","isKeychainAvailable","getGenericPassword","e","safeGetGenericPassword","options","key","service","error","console","warn","safeSetGenericPassword","username","password","setGenericPassword","safeResetGenericPassword","resetGenericPassword","storeCredentials","credentials","existingCredentials","getCredentials","updatedCredentials","createdAt","Date","now","Error","OS","accessControl","ACCESS_CONTROL","BIOMETRY_ANY_OR_DEVICE_PASSCODE","accessible","ACCESSIBLE","WHEN_UNLOCKED","JSON","stringify","parse","hasCredentials","deleteCredentials","updateCredentials","generateDeviceUsername","randomId","Math","random","toString","substring","verifyCredentials"],"sourceRoot":"..\\..\\..\\src","sources":["utils/secureStorage.ts"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@onairos/react-native",
3
- "version": "3.0.0",
3
+ "version": "3.0.2",
4
4
  "description": "Onairos React Native SDK for social media authentication and AI model training",
5
5
  "main": "lib/commonjs/index.js",
6
6
  "module": "lib/module/index.js",
package/src/api/index.ts CHANGED
@@ -1,126 +1,111 @@
1
- import axios from 'axios';
1
+ import axios, { AxiosInstance, AxiosRequestConfig } from 'axios';
2
+ import { Platform } from 'react-native';
3
+ import { API_ENDPOINTS } from '../constants';
2
4
 
3
- /**
4
- * Onairos API service for handling API requests
5
- */
5
+ // Check if running in development mode
6
+ const isDevelopmentMode = () => {
7
+ return __DEV__ || process.env.NODE_ENV === 'development';
8
+ };
9
+
10
+ // Create mock response helper
11
+ const createMockResponse = (data: any) => {
12
+ return Promise.resolve({ data });
13
+ };
14
+
15
+ // Create API instance
16
+ const apiInstance: AxiosInstance = axios.create({
17
+ baseURL: API_ENDPOINTS.base,
18
+ timeout: 10000,
19
+ headers: {
20
+ 'Content-Type': 'application/json',
21
+ 'Accept': 'application/json',
22
+ },
23
+ });
24
+
25
+ // Add error handling interceptor
26
+ apiInstance.interceptors.response.use(
27
+ (response) => response,
28
+ (error) => {
29
+ if (isDevelopmentMode()) {
30
+ console.warn('API error in development mode, using fallback:', error);
31
+ return createMockResponse({ success: true, data: { mockData: true } });
32
+ }
33
+ return Promise.reject(error);
34
+ }
35
+ );
36
+
37
+ // API service with Expo compatibility
6
38
  export const onairosApi = {
7
- baseUrl: 'https://api2.onairos.uk',
8
-
9
- /**
10
- * Make a GET request to the API
11
- * @param endpoint The endpoint to request
12
- * @returns The response data
13
- */
14
- get: async (endpoint: string) => {
39
+ // Core API methods with fallbacks
40
+ async get(url: string) {
15
41
  try {
16
- const response = await axios.get(`${onairosApi.baseUrl}/${endpoint}`);
17
- return response.data;
42
+ if (Platform.OS === 'web' && isDevelopmentMode()) {
43
+ return createMockResponse({ success: true, data: { mockData: true } });
44
+ }
45
+ return await apiInstance.get(url);
18
46
  } catch (error) {
19
- console.error(`GET ${endpoint} error:`, error);
47
+ console.error(`GET ${url} error:`, error);
48
+ if (isDevelopmentMode()) {
49
+ return createMockResponse({ success: true, data: { mockData: true } });
50
+ }
20
51
  throw error;
21
52
  }
22
53
  },
23
-
24
- /**
25
- * Make a POST request to the API
26
- * @param endpoint The endpoint to request
27
- * @param data The data to send
28
- * @returns The response data
29
- */
30
- post: async (endpoint: string, data: any) => {
54
+
55
+ async post(url: string, data: any) {
31
56
  try {
32
- const response = await axios.post(
33
- `${onairosApi.baseUrl}/${endpoint}`,
34
- data
35
- );
36
- return response.data;
57
+ if (Platform.OS === 'web' && isDevelopmentMode()) {
58
+ return createMockResponse({ success: true, data: { mockData: true } });
59
+ }
60
+ return await apiInstance.post(url, data);
37
61
  } catch (error) {
38
- console.error(`POST ${endpoint} error:`, error);
62
+ console.error(`POST ${url} error:`, error);
63
+ if (isDevelopmentMode()) {
64
+ return createMockResponse({ success: true, data: { mockData: true } });
65
+ }
39
66
  throw error;
40
67
  }
41
68
  },
42
-
43
- /**
44
- * Get the server's public key for encryption
45
- * @returns The server's public key
46
- */
47
- getServerPublicKey: async () => {
48
- try {
49
- const response = await onairosApi.get('public/getPublicKey');
50
- return response.publicKey;
51
- } catch (error) {
52
- console.error('Error getting server public key:', error);
53
- return '';
54
- }
55
- },
56
-
57
- /**
58
- * Validate credentials with the server
59
- * @param username The username to validate
60
- * @returns Whether the credentials are valid
61
- */
62
- validateCredentials: async (username: string) => {
69
+
70
+ // Helper methods for specific API endpoints
71
+ async validateCredentials(username: string) {
63
72
  try {
64
- const response = await onairosApi.post('validate', { username });
65
- return response.valid === true;
73
+ if (isDevelopmentMode()) {
74
+ console.log('Using mock validation for:', username);
75
+ return true;
76
+ }
77
+
78
+ const response = await this.post('validate', { username });
79
+ return response.data?.success || false;
66
80
  } catch (error) {
67
81
  console.error('Error validating credentials:', error);
68
- return false;
69
- }
70
- },
71
-
72
- /**
73
- * Get account information for a user
74
- * @param username The username to get account info for
75
- * @returns The account information
76
- */
77
- getAccountInfo: async (username: string) => {
78
- try {
79
- const response = await onairosApi.post('getAccountInfo', {
80
- Info: { username }
81
- });
82
- return response.AccountInfo;
83
- } catch (error) {
84
- console.error('Error getting account info:', error);
85
- return null;
82
+ return isDevelopmentMode(); // Return true in dev mode to allow flow to continue
86
83
  }
87
84
  },
88
-
89
- /**
90
- * Get API URL and token for a user
91
- * @param params The parameters for the request
92
- * @returns The API URL and token
93
- */
94
- getApiUrl: async (params: {
95
- appId: string;
96
- username: string;
97
- encryptedModelKey: string;
98
- confirmations: { [key: string]: boolean };
99
- }) => {
85
+
86
+ async getUserProfile(token: string) {
100
87
  try {
101
- const response = await onairosApi.post('getAPIUrlMobile', {
102
- Info: {
103
- storage: 'local',
104
- appId: params.appId,
105
- confirmations: params.confirmations,
106
- developerURL: 'devURL',
107
- EncryptedUserPin: params.encryptedModelKey,
108
- account: params.username,
109
- proofMode: false,
110
- },
111
- });
112
-
113
- if (response && response.apiUrl && response.token) {
88
+ if (isDevelopmentMode()) {
114
89
  return {
115
- apiUrl: response.apiUrl,
116
- token: response.token,
90
+ username: 'demo_user',
91
+ platforms: ['instagram', 'youtube'],
92
+ createdAt: Date.now(),
117
93
  };
118
- } else {
119
- throw new Error('Invalid response from getAPIUrlMobile');
120
94
  }
95
+
96
+ apiInstance.defaults.headers.common['Authorization'] = `Bearer ${token}`;
97
+ const response = await this.get('user/profile');
98
+ return response.data?.data;
121
99
  } catch (error) {
122
- console.error('Error getting API URL:', error);
100
+ console.error('Error fetching user profile:', error);
101
+ if (isDevelopmentMode()) {
102
+ return {
103
+ username: 'demo_user',
104
+ platforms: ['instagram', 'youtube'],
105
+ createdAt: Date.now(),
106
+ };
107
+ }
123
108
  throw error;
124
109
  }
125
- }
110
+ },
126
111
  };
@@ -14,7 +14,7 @@ import { UniversalOnboarding } from './UniversalOnboarding';
14
14
  import { Overlay } from './Overlay';
15
15
  import { COLORS } from '../constants';
16
16
  import type { OnairosButtonProps } from '../types';
17
- import { hasCredentials, getCredentials, clearCredentials } from '../utils/secureStorage';
17
+ import { hasCredentials, getCredentials, deleteCredentials as clearCredentials } from '../utils/secureStorage';
18
18
  import { onairosApi } from '../api';
19
19
 
20
20
  /**
@@ -57,6 +57,7 @@ export const OnairosButton: React.FC<OnairosButtonProps> = ({
57
57
  const shouldProceed = await preCheck();
58
58
  if (!shouldProceed) {
59
59
  onRejection?.('Precheck validation failed');
60
+ setIsLoading(false);
60
61
  return;
61
62
  }
62
63
  }
@@ -68,33 +69,41 @@ export const OnairosButton: React.FC<OnairosButtonProps> = ({
68
69
  // If credentials exist, fetch them and verify
69
70
  const credentials = await getCredentials();
70
71
 
71
- if (!credentials || !credentials.username || !credentials.userPin) {
72
+ if (!credentials || !credentials.username) {
72
73
  // Invalid credentials, clear and start fresh
73
74
  await clearCredentials();
74
75
  setShowOnboarding(true);
76
+ setIsLoading(false);
75
77
  return;
76
78
  }
77
79
 
78
- // Validate credentials with server
79
- const isValid = await onairosApi.validateCredentials(credentials.username);
80
-
81
- if (!isValid) {
82
- // Clear invalid credentials
83
- await clearCredentials();
80
+ try {
81
+ // Validate credentials with server - catch errors here to prevent crashing
82
+ const isValid = await onairosApi.validateCredentials(credentials.username);
83
+
84
+ if (!isValid) {
85
+ // Clear invalid credentials
86
+ await clearCredentials();
87
+ setShowOnboarding(true);
88
+ setIsLoading(false);
89
+ return;
90
+ }
91
+
92
+ // Store and display overlay with valid credentials
93
+ setStoredCredentials(credentials);
94
+ setShowOverlay(true);
95
+ } catch (validationError) {
96
+ console.warn('Validation error, proceeding to onboarding:', validationError);
84
97
  setShowOnboarding(true);
85
- return;
86
98
  }
87
-
88
- // Store and display overlay with valid credentials
89
- setStoredCredentials(credentials);
90
- setShowOverlay(true);
91
99
  } else {
92
100
  // If no credentials, show onboarding
93
101
  setShowOnboarding(true);
94
102
  }
95
103
  } catch (error) {
96
104
  console.error('Error during button press flow:', error);
97
- Alert.alert('Error', 'An error occurred. Please try again later.');
105
+ // Fall back to onboarding on error
106
+ setShowOnboarding(true);
98
107
  onRejection?.(error instanceof Error ? error.message : 'Unknown error');
99
108
  } finally {
100
109
  setIsLoading(false);
@@ -6,6 +6,7 @@ import {
6
6
  TouchableOpacity,
7
7
  ActivityIndicator,
8
8
  Dimensions,
9
+ Platform,
9
10
  } from 'react-native';
10
11
  import BottomSheet from '@gorhom/bottom-sheet';
11
12
  import Icon from 'react-native-vector-icons/MaterialIcons';
@@ -52,6 +53,18 @@ export const UniversalOnboarding: React.FC<UniversalOnboardingProps> = ({
52
53
  if (visible) {
53
54
  bottomSheetRef.current?.expand();
54
55
  loadInitialStatus();
56
+
57
+ // Debug mode for Expo Go
58
+ if (debug || Platform.OS === 'web') {
59
+ console.log('Debug mode enabled - Using mock data for onboarding');
60
+ // Pre-populate with mock connections in debug mode
61
+ if (test || Platform.OS === 'web') {
62
+ setConnections({
63
+ instagram: { userName: 'instagram_user', connected: true },
64
+ youtube: { userName: 'youtube_user', connected: true },
65
+ });
66
+ }
67
+ }
55
68
  } else {
56
69
  bottomSheetRef.current?.close();
57
70
  }
package/src/index.ts CHANGED
@@ -72,17 +72,15 @@ export type {
72
72
  DataTier,
73
73
  UniversalOnboardingProps,
74
74
  ConnectionStatus,
75
- OnairosCredentials,
76
75
  PlatformListProps,
77
76
  PinInputProps,
78
77
  TrainingModalProps,
79
78
  OAuthWebViewProps,
80
- CredentialsResult,
81
79
  PlatformConfig,
82
80
  ApiResponse,
83
81
  } from './types';
84
82
 
85
- export type { StorageOptions } from './utils/secureStorage';
83
+ export type { StorageOptions, OnairosCredentials } from './utils/secureStorage';
86
84
  export type { OAuthConfig } from './services/oauthService';
87
85
  export type { ApiErrorType, ApiError } from './utils/onairosApi';
88
86
 
@@ -91,6 +89,6 @@ export { COLORS, PLATFORMS, API_ENDPOINTS, STORAGE_KEYS, PIN_REQUIREMENTS, DEEP_
91
89
 
92
90
  // API and Services
93
91
  export { onairosApi } from './api';
94
- export { OAuthService } from './services/OAuthService';
92
+ export { OAuthService } from './services/oauthService';
95
93
  export * from './utils/secureStorage';
96
94
  export * from './utils/encryption';