@spacesops/wdk-react-native-core 1.0.0-beta.40
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/README.md +551 -0
- package/dist/__mocks__/react.d.ts +40 -0
- package/dist/__mocks__/react.js +33 -0
- package/dist/__mocks__/react.js.map +1 -0
- package/dist/__mocks__/secureStorage.d.ts +26 -0
- package/dist/__mocks__/secureStorage.js +80 -0
- package/dist/__mocks__/secureStorage.js.map +1 -0
- package/dist/__tests__/hooks/useBalance.test.d.ts +6 -0
- package/dist/__tests__/hooks/useBalance.test.js +217 -0
- package/dist/__tests__/hooks/useBalance.test.js.map +1 -0
- package/dist/__tests__/hooks/useWallet.test.d.ts +6 -0
- package/dist/__tests__/hooks/useWallet.test.js +105 -0
- package/dist/__tests__/hooks/useWallet.test.js.map +1 -0
- package/dist/__tests__/hooks/useWalletManager.test.d.ts +6 -0
- package/dist/__tests__/hooks/useWalletManager.test.js +193 -0
- package/dist/__tests__/hooks/useWalletManager.test.js.map +1 -0
- package/dist/__tests__/hooks/useWdkApp.test.d.ts +6 -0
- package/dist/__tests__/hooks/useWdkApp.test.js +55 -0
- package/dist/__tests__/hooks/useWdkApp.test.js.map +1 -0
- package/dist/__tests__/hooks/useWorklet.test.d.ts +6 -0
- package/dist/__tests__/hooks/useWorklet.test.js +168 -0
- package/dist/__tests__/hooks/useWorklet.test.js.map +1 -0
- package/dist/__tests__/provider/WdkAppProvider.test.d.ts +6 -0
- package/dist/__tests__/provider/WdkAppProvider.test.js +57 -0
- package/dist/__tests__/provider/WdkAppProvider.test.js.map +1 -0
- package/dist/__tests__/services/accountService.test.d.ts +6 -0
- package/dist/__tests__/services/accountService.test.js +216 -0
- package/dist/__tests__/services/accountService.test.js.map +1 -0
- package/dist/__tests__/services/addressService.test.d.ts +6 -0
- package/dist/__tests__/services/addressService.test.js +246 -0
- package/dist/__tests__/services/addressService.test.js.map +1 -0
- package/dist/__tests__/services/balanceService.test.d.ts +6 -0
- package/dist/__tests__/services/balanceService.test.js +333 -0
- package/dist/__tests__/services/balanceService.test.js.map +1 -0
- package/dist/__tests__/services/walletSetupService.test.d.ts +6 -0
- package/dist/__tests__/services/walletSetupService.test.js +304 -0
- package/dist/__tests__/services/walletSetupService.test.js.map +1 -0
- package/dist/__tests__/services/walletSwitchingService.test.d.ts +6 -0
- package/dist/__tests__/services/walletSwitchingService.test.js +209 -0
- package/dist/__tests__/services/walletSwitchingService.test.js.map +1 -0
- package/dist/__tests__/services/workletLifecycleService.test.d.ts +6 -0
- package/dist/__tests__/services/workletLifecycleService.test.js +451 -0
- package/dist/__tests__/services/workletLifecycleService.test.js.map +1 -0
- package/dist/__tests__/setup.d.ts +7 -0
- package/dist/__tests__/setup.js +49 -0
- package/dist/__tests__/setup.js.map +1 -0
- package/dist/__tests__/storage/mmkvStorage.test.d.ts +6 -0
- package/dist/__tests__/storage/mmkvStorage.test.js +213 -0
- package/dist/__tests__/storage/mmkvStorage.test.js.map +1 -0
- package/dist/__tests__/store/walletStore.test.d.ts +4 -0
- package/dist/__tests__/store/walletStore.test.js +86 -0
- package/dist/__tests__/store/walletStore.test.js.map +1 -0
- package/dist/__tests__/store/workletStore.test.d.ts +4 -0
- package/dist/__tests__/store/workletStore.test.js +255 -0
- package/dist/__tests__/store/workletStore.test.js.map +1 -0
- package/dist/__tests__/types/hrpc.test.d.ts +4 -0
- package/dist/__tests__/types/hrpc.test.js +99 -0
- package/dist/__tests__/types/hrpc.test.js.map +1 -0
- package/dist/__tests__/utils/balanceUtils.test.d.ts +4 -0
- package/dist/__tests__/utils/balanceUtils.test.js +133 -0
- package/dist/__tests__/utils/balanceUtils.test.js.map +1 -0
- package/dist/__tests__/utils/errorHandling.test.d.ts +6 -0
- package/dist/__tests__/utils/errorHandling.test.js +119 -0
- package/dist/__tests__/utils/errorHandling.test.js.map +1 -0
- package/dist/__tests__/utils/errorUtils.test.d.ts +4 -0
- package/dist/__tests__/utils/errorUtils.test.js +133 -0
- package/dist/__tests__/utils/errorUtils.test.js.map +1 -0
- package/dist/__tests__/utils/initializationState.test.d.ts +6 -0
- package/dist/__tests__/utils/initializationState.test.js +243 -0
- package/dist/__tests__/utils/initializationState.test.js.map +1 -0
- package/dist/__tests__/utils/jsonUtils.test.d.ts +4 -0
- package/dist/__tests__/utils/jsonUtils.test.js +118 -0
- package/dist/__tests__/utils/jsonUtils.test.js.map +1 -0
- package/dist/__tests__/utils/mmkvKeyManager.test.d.ts +6 -0
- package/dist/__tests__/utils/mmkvKeyManager.test.js +158 -0
- package/dist/__tests__/utils/mmkvKeyManager.test.js.map +1 -0
- package/dist/__tests__/utils/mnemonicUtils.test.d.ts +4 -0
- package/dist/__tests__/utils/mnemonicUtils.test.js +40 -0
- package/dist/__tests__/utils/mnemonicUtils.test.js.map +1 -0
- package/dist/__tests__/utils/raceConditions.test.d.ts +6 -0
- package/dist/__tests__/utils/raceConditions.test.js +239 -0
- package/dist/__tests__/utils/raceConditions.test.js.map +1 -0
- package/dist/__tests__/utils/result.test.d.ts +4 -0
- package/dist/__tests__/utils/result.test.js +66 -0
- package/dist/__tests__/utils/result.test.js.map +1 -0
- package/dist/__tests__/utils/schemas.test.d.ts +4 -0
- package/dist/__tests__/utils/schemas.test.js +66 -0
- package/dist/__tests__/utils/schemas.test.js.map +1 -0
- package/dist/__tests__/utils/storeHelpers.test.d.ts +4 -0
- package/dist/__tests__/utils/storeHelpers.test.js +227 -0
- package/dist/__tests__/utils/storeHelpers.test.js.map +1 -0
- package/dist/__tests__/utils/typeGuards.test.d.ts +4 -0
- package/dist/__tests__/utils/typeGuards.test.js +175 -0
- package/dist/__tests__/utils/typeGuards.test.js.map +1 -0
- package/dist/__tests__/utils/validation.test.d.ts +4 -0
- package/dist/__tests__/utils/validation.test.js +126 -0
- package/dist/__tests__/utils/validation.test.js.map +1 -0
- package/dist/__tests__/utils/walletUtils.test.d.ts +4 -0
- package/dist/__tests__/utils/walletUtils.test.js +156 -0
- package/dist/__tests__/utils/walletUtils.test.js.map +1 -0
- package/dist/hooks/useBalance.d.ts +170 -0
- package/dist/hooks/useBalance.js +442 -0
- package/dist/hooks/useBalance.js.map +1 -0
- package/dist/hooks/useWallet.d.ts +43 -0
- package/dist/hooks/useWallet.js +193 -0
- package/dist/hooks/useWallet.js.map +1 -0
- package/dist/hooks/useWalletManager.d.ts +100 -0
- package/dist/hooks/useWalletManager.js +526 -0
- package/dist/hooks/useWalletManager.js.map +1 -0
- package/dist/hooks/useWdkApp.d.ts +66 -0
- package/dist/hooks/useWdkApp.js +74 -0
- package/dist/hooks/useWdkApp.js.map +1 -0
- package/dist/hooks/useWorklet.d.ts +66 -0
- package/dist/hooks/useWorklet.js +42 -0
- package/dist/hooks/useWorklet.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/provider/WdkAppProvider.d.ts +112 -0
- package/dist/provider/WdkAppProvider.js +558 -0
- package/dist/provider/WdkAppProvider.js.map +1 -0
- package/dist/services/accountService.d.ts +52 -0
- package/dist/services/accountService.js +119 -0
- package/dist/services/accountService.js.map +1 -0
- package/dist/services/addressService.d.ts +22 -0
- package/dist/services/addressService.js +110 -0
- package/dist/services/addressService.js.map +1 -0
- package/dist/services/balanceService.d.ts +114 -0
- package/dist/services/balanceService.js +208 -0
- package/dist/services/balanceService.js.map +1 -0
- package/dist/services/walletSetupService.d.ts +217 -0
- package/dist/services/walletSetupService.js +535 -0
- package/dist/services/walletSetupService.js.map +1 -0
- package/dist/services/walletSwitchingService.d.ts +48 -0
- package/dist/services/walletSwitchingService.js +143 -0
- package/dist/services/walletSwitchingService.js.map +1 -0
- package/dist/services/workletLifecycleService.d.ts +117 -0
- package/dist/services/workletLifecycleService.js +433 -0
- package/dist/services/workletLifecycleService.js.map +1 -0
- package/dist/storage/mmkvStorage.d.ts +44 -0
- package/dist/storage/mmkvStorage.js +348 -0
- package/dist/storage/mmkvStorage.js.map +1 -0
- package/dist/store/walletStore.d.ts +130 -0
- package/dist/store/walletStore.js +204 -0
- package/dist/store/walletStore.js.map +1 -0
- package/dist/store/workletStore.d.ts +121 -0
- package/dist/store/workletStore.js +256 -0
- package/dist/store/workletStore.js.map +1 -0
- package/dist/types/hrpc.d.ts +60 -0
- package/dist/types/hrpc.js +26 -0
- package/dist/types/hrpc.js.map +1 -0
- package/dist/types.d.ts +168 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/balanceUtils.d.ts +30 -0
- package/dist/utils/balanceUtils.js +86 -0
- package/dist/utils/balanceUtils.js.map +1 -0
- package/dist/utils/constants.d.ts +66 -0
- package/dist/utils/constants.js +73 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/errorHandling.d.ts +47 -0
- package/dist/utils/errorHandling.js +54 -0
- package/dist/utils/errorHandling.js.map +1 -0
- package/dist/utils/errorUtils.d.ts +89 -0
- package/dist/utils/errorUtils.js +264 -0
- package/dist/utils/errorUtils.js.map +1 -0
- package/dist/utils/initializationState.d.ts +129 -0
- package/dist/utils/initializationState.js +220 -0
- package/dist/utils/initializationState.js.map +1 -0
- package/dist/utils/jsonUtils.d.ts +21 -0
- package/dist/utils/jsonUtils.js +67 -0
- package/dist/utils/jsonUtils.js.map +1 -0
- package/dist/utils/logger.d.ts +27 -0
- package/dist/utils/logger.js +50 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/mmkvKeyManager.d.ts +57 -0
- package/dist/utils/mmkvKeyManager.js +214 -0
- package/dist/utils/mmkvKeyManager.js.map +1 -0
- package/dist/utils/mnemonicUtils.d.ts +17 -0
- package/dist/utils/mnemonicUtils.js +28 -0
- package/dist/utils/mnemonicUtils.js.map +1 -0
- package/dist/utils/operationMutex.d.ts +69 -0
- package/dist/utils/operationMutex.js +150 -0
- package/dist/utils/operationMutex.js.map +1 -0
- package/dist/utils/result.d.ts +34 -0
- package/dist/utils/result.js +43 -0
- package/dist/utils/result.js.map +1 -0
- package/dist/utils/schemas.d.ts +365 -0
- package/dist/utils/schemas.js +152 -0
- package/dist/utils/schemas.js.map +1 -0
- package/dist/utils/storeHelpers.d.ts +112 -0
- package/dist/utils/storeHelpers.js +198 -0
- package/dist/utils/storeHelpers.js.map +1 -0
- package/dist/utils/typeGuards.d.ts +70 -0
- package/dist/utils/typeGuards.js +95 -0
- package/dist/utils/typeGuards.js.map +1 -0
- package/dist/utils/validation.d.ts +53 -0
- package/dist/utils/validation.js +152 -0
- package/dist/utils/validation.js.map +1 -0
- package/dist/utils/walletStateHelpers.d.ts +62 -0
- package/dist/utils/walletStateHelpers.js +81 -0
- package/dist/utils/walletStateHelpers.js.map +1 -0
- package/dist/utils/walletUtils.d.ts +38 -0
- package/dist/utils/walletUtils.js +87 -0
- package/dist/utils/walletUtils.js.map +1 -0
- package/package.json +79 -0
- package/src/__mocks__/react.ts +34 -0
- package/src/__mocks__/secureStorage.ts +87 -0
- package/src/__tests__/hooks/useBalance.test.ts +286 -0
- package/src/__tests__/hooks/useWallet.test.ts +122 -0
- package/src/__tests__/hooks/useWalletManager.test.ts +271 -0
- package/src/__tests__/hooks/useWdkApp.test.tsx +59 -0
- package/src/__tests__/hooks/useWorklet.test.ts +195 -0
- package/src/__tests__/provider/WdkAppProvider.test.tsx +67 -0
- package/src/__tests__/services/accountService.test.ts +337 -0
- package/src/__tests__/services/addressService.test.ts +312 -0
- package/src/__tests__/services/balanceService.test.ts +411 -0
- package/src/__tests__/services/walletSetupService.test.ts +463 -0
- package/src/__tests__/services/walletSwitchingService.test.ts +258 -0
- package/src/__tests__/services/workletLifecycleService.test.ts +514 -0
- package/src/__tests__/setup.ts +54 -0
- package/src/__tests__/storage/mmkvStorage.test.ts +325 -0
- package/src/__tests__/store/walletStore.test.ts +101 -0
- package/src/__tests__/store/workletStore.test.ts +329 -0
- package/src/__tests__/types/hrpc.test.ts +125 -0
- package/src/__tests__/utils/balanceUtils.test.ts +151 -0
- package/src/__tests__/utils/errorHandling.test.ts +147 -0
- package/src/__tests__/utils/errorUtils.test.ts +170 -0
- package/src/__tests__/utils/initializationState.test.ts +337 -0
- package/src/__tests__/utils/jsonUtils.test.ts +131 -0
- package/src/__tests__/utils/mmkvKeyManager.test.ts +205 -0
- package/src/__tests__/utils/mnemonicUtils.test.ts +48 -0
- package/src/__tests__/utils/raceConditions.test.ts +292 -0
- package/src/__tests__/utils/result.test.ts +73 -0
- package/src/__tests__/utils/schemas.test.ts +82 -0
- package/src/__tests__/utils/storeHelpers.test.ts +323 -0
- package/src/__tests__/utils/typeGuards.test.ts +209 -0
- package/src/__tests__/utils/validation.test.ts +152 -0
- package/src/__tests__/utils/walletUtils.test.ts +195 -0
- package/src/hooks/useBalance.ts +597 -0
- package/src/hooks/useWallet.ts +288 -0
- package/src/hooks/useWalletManager.ts +654 -0
- package/src/hooks/useWdkApp.ts +78 -0
- package/src/hooks/useWorklet.ts +109 -0
- package/src/index.ts +112 -0
- package/src/provider/WdkAppProvider.tsx +764 -0
- package/src/services/accountService.ts +134 -0
- package/src/services/addressService.ts +125 -0
- package/src/services/balanceService.ts +291 -0
- package/src/services/walletSetupService.ts +695 -0
- package/src/services/walletSwitchingService.ts +157 -0
- package/src/services/workletLifecycleService.ts +561 -0
- package/src/storage/mmkvStorage.ts +417 -0
- package/src/store/walletStore.ts +301 -0
- package/src/store/workletStore.ts +340 -0
- package/src/types/hrpc.ts +78 -0
- package/src/types.ts +188 -0
- package/src/utils/balanceUtils.ts +96 -0
- package/src/utils/constants.ts +84 -0
- package/src/utils/errorHandling.md +163 -0
- package/src/utils/errorHandling.ts +61 -0
- package/src/utils/errorUtils.ts +300 -0
- package/src/utils/initializationState.ts +242 -0
- package/src/utils/jsonUtils.ts +75 -0
- package/src/utils/logger.ts +54 -0
- package/src/utils/mmkvKeyManager.ts +256 -0
- package/src/utils/mnemonicUtils.ts +35 -0
- package/src/utils/operationMutex.ts +181 -0
- package/src/utils/result.ts +57 -0
- package/src/utils/schemas.ts +190 -0
- package/src/utils/storeHelpers.ts +236 -0
- package/src/utils/typeGuards.ts +129 -0
- package/src/utils/validation.ts +174 -0
- package/src/utils/walletStateHelpers.ts +104 -0
- package/src/utils/walletUtils.ts +107 -0
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wallet Store - Source of Truth for Wallet Data
|
|
3
|
+
*
|
|
4
|
+
* IMPORTANT: This is the ONLY place where addresses and balances are actually stored.
|
|
5
|
+
*
|
|
6
|
+
* ## Store Boundaries
|
|
7
|
+
*
|
|
8
|
+
* **walletStore** (this file):
|
|
9
|
+
* - Wallet addresses: { [walletId]: { [network]: { [accountIndex]: address } } }
|
|
10
|
+
* - Wallet balances: { [walletId]: { [network]: { [accountIndex]: { [tokenAddress]: balance } } } }
|
|
11
|
+
* - Address loading states: { [walletId]: { [network-accountIndex]: boolean } }
|
|
12
|
+
* - Balance loading states: { [walletId]: { [network-accountIndex-tokenAddress]: boolean } }
|
|
13
|
+
* - Last balance update timestamps: { [walletId]: { [network]: { [accountIndex]: timestamp } } }
|
|
14
|
+
* - Account list: { [walletId]: Array of account info }
|
|
15
|
+
* - Wallet list: Array of wallet info (multiple wallets)
|
|
16
|
+
* - Active wallet ID: Currently active wallet identifier
|
|
17
|
+
*
|
|
18
|
+
* Note: Loading states for wallet list operations are managed locally in hooks
|
|
19
|
+
* (useWalletManager) since they're ephemeral and only used within those hooks.
|
|
20
|
+
*
|
|
21
|
+
* **workletStore** (workletStore.ts):
|
|
22
|
+
* - Worklet lifecycle state (isWorkletStarted, isInitialized, etc.)
|
|
23
|
+
* - Worklet runtime instances (worklet, hrpc, ipc)
|
|
24
|
+
* - Worklet configuration
|
|
25
|
+
*
|
|
26
|
+
* ## Separation of Concerns
|
|
27
|
+
*
|
|
28
|
+
* - **walletStore**: Manages wallet data (addresses, balances) - derived/computed from worklet
|
|
29
|
+
* - **workletStore**: Manages worklet runtime and lifecycle
|
|
30
|
+
*
|
|
31
|
+
* These stores are intentionally separate to:
|
|
32
|
+
* 1. Prevent cross-contamination of lifecycle and data concerns
|
|
33
|
+
* 2. Allow independent persistence strategies
|
|
34
|
+
* 3. Enable clear boundaries for testing and debugging
|
|
35
|
+
*
|
|
36
|
+
* ## Important Notes
|
|
37
|
+
*
|
|
38
|
+
* - Addresses: Stored in Zustand (derived/computed state, deterministic, no refetching needed)
|
|
39
|
+
* - Balances: Stored in Zustand (single source of truth), use TanStack Query via useBalance() hook for fetching
|
|
40
|
+
* - Zustand is the single source of truth for balances
|
|
41
|
+
* - TanStack Query reads from Zustand (initialData) and updates Zustand after fetch
|
|
42
|
+
* - No sync logic needed - TanStack Query directly updates the source of truth
|
|
43
|
+
* - NEVER store worklet lifecycle state in walletStore
|
|
44
|
+
* - NEVER store worklet runtime instances in walletStore
|
|
45
|
+
* - All operations are handled by focused services (AddressService, BalanceService), not the store itself
|
|
46
|
+
*/
|
|
47
|
+
// External packages
|
|
48
|
+
import { create } from 'zustand';
|
|
49
|
+
import { persist, createJSONStorage, devtools } from 'zustand/middleware';
|
|
50
|
+
import { createMMKVStorageAdapter } from '../storage/mmkvStorage';
|
|
51
|
+
import { log, logError } from '../utils/logger';
|
|
52
|
+
const initialState = {
|
|
53
|
+
addresses: {}, // walletId -> addresses
|
|
54
|
+
walletLoading: {}, // walletId -> loading states
|
|
55
|
+
balances: {}, // walletId -> balances
|
|
56
|
+
balanceLoading: {}, // walletId -> loading states
|
|
57
|
+
lastBalanceUpdate: {}, // walletId -> network -> accountIndex -> timestamp
|
|
58
|
+
accountList: {}, // walletId -> account list
|
|
59
|
+
walletList: [],
|
|
60
|
+
activeWalletId: null,
|
|
61
|
+
walletLoadingState: { type: 'not_loaded' },
|
|
62
|
+
isOperationInProgress: false,
|
|
63
|
+
currentOperation: null,
|
|
64
|
+
};
|
|
65
|
+
const defaultStorageAdapter = createMMKVStorageAdapter();
|
|
66
|
+
let walletStoreInstance = null;
|
|
67
|
+
/**
|
|
68
|
+
* Creates singleton wallet store instance.
|
|
69
|
+
* All operations are handled by focused services (AddressService, BalanceService), not the store itself.
|
|
70
|
+
*/
|
|
71
|
+
export function createWalletStore() {
|
|
72
|
+
if (walletStoreInstance) {
|
|
73
|
+
return walletStoreInstance;
|
|
74
|
+
}
|
|
75
|
+
const store = create()(devtools(persist((set, get) => ({
|
|
76
|
+
...initialState,
|
|
77
|
+
}), {
|
|
78
|
+
name: 'wallet-storage',
|
|
79
|
+
storage: createJSONStorage(() => defaultStorageAdapter),
|
|
80
|
+
partialize: (state) => ({
|
|
81
|
+
addresses: state.addresses,
|
|
82
|
+
balances: state.balances,
|
|
83
|
+
balanceLoading: {},
|
|
84
|
+
lastBalanceUpdate: state.lastBalanceUpdate,
|
|
85
|
+
accountList: state.accountList,
|
|
86
|
+
walletList: state.walletList,
|
|
87
|
+
activeWalletId: state.activeWalletId,
|
|
88
|
+
// Don't persist loading state or operation mutex - these are runtime-only
|
|
89
|
+
}),
|
|
90
|
+
onRehydrateStorage: () => {
|
|
91
|
+
return (state) => {
|
|
92
|
+
if (state) {
|
|
93
|
+
log('🔄 Rehydrating wallet state - resetting loading states');
|
|
94
|
+
state.walletLoading = {};
|
|
95
|
+
state.balanceLoading = {};
|
|
96
|
+
// Reset runtime-only state
|
|
97
|
+
state.walletLoadingState = { type: 'not_loaded' };
|
|
98
|
+
state.isOperationInProgress = false;
|
|
99
|
+
state.currentOperation = null;
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
},
|
|
103
|
+
}), { name: 'WalletStore' }));
|
|
104
|
+
walletStoreInstance = store;
|
|
105
|
+
return store;
|
|
106
|
+
}
|
|
107
|
+
export function getWalletStore() {
|
|
108
|
+
return createWalletStore();
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Wallet state actions - helper functions for updating wallet loading state
|
|
112
|
+
* These provide a clean API for state transitions with validation
|
|
113
|
+
*/
|
|
114
|
+
/**
|
|
115
|
+
* Validate state transition
|
|
116
|
+
* Returns true if transition is valid, false otherwise
|
|
117
|
+
*/
|
|
118
|
+
function isValidStateTransition(current, next) {
|
|
119
|
+
// Allow reset from any state
|
|
120
|
+
if (next === 'not_loaded')
|
|
121
|
+
return true;
|
|
122
|
+
// Allow error from any state
|
|
123
|
+
if (next === 'error')
|
|
124
|
+
return true;
|
|
125
|
+
// After early returns, TypeScript narrows the type, but we need to check all transitions
|
|
126
|
+
// Use type assertion to tell TypeScript that 'not_loaded' and 'error' are still possible
|
|
127
|
+
// (even though they're handled by early returns, they're valid from all states)
|
|
128
|
+
const nextType = next;
|
|
129
|
+
switch (current.type) {
|
|
130
|
+
case 'not_loaded':
|
|
131
|
+
return nextType === 'checking' || nextType === 'loading';
|
|
132
|
+
case 'checking':
|
|
133
|
+
return nextType === 'loading' || nextType === 'error';
|
|
134
|
+
case 'loading':
|
|
135
|
+
return nextType === 'ready' || nextType === 'error';
|
|
136
|
+
case 'ready':
|
|
137
|
+
return nextType === 'not_loaded' || nextType === 'loading' || nextType === 'checking';
|
|
138
|
+
case 'error':
|
|
139
|
+
return nextType === 'not_loaded' || nextType === 'checking' || nextType === 'loading';
|
|
140
|
+
default:
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Update wallet loading state with validation
|
|
146
|
+
* Throws error if transition is invalid
|
|
147
|
+
* Logs state transitions for debugging
|
|
148
|
+
*/
|
|
149
|
+
export function updateWalletLoadingState(state, newState) {
|
|
150
|
+
// Log state transition for debugging
|
|
151
|
+
if (state.walletLoadingState.type !== newState.type) {
|
|
152
|
+
log(`[WalletState] Transition: ${state.walletLoadingState.type} -> ${newState.type}`, {
|
|
153
|
+
from: state.walletLoadingState,
|
|
154
|
+
to: newState,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
if (!isValidStateTransition(state.walletLoadingState, newState.type)) {
|
|
158
|
+
const error = new Error(`Invalid state transition from ${state.walletLoadingState.type} to ${newState.type}`);
|
|
159
|
+
logError(`⚠️ Invalid state transition: ${error.message}`, {
|
|
160
|
+
currentState: state.walletLoadingState,
|
|
161
|
+
attemptedState: newState,
|
|
162
|
+
});
|
|
163
|
+
// In development, throw error. In production, log and allow transition
|
|
164
|
+
// Note: __DEV__ is a React Native global, may not be available in all environments
|
|
165
|
+
if (typeof __DEV__ !== 'undefined' && __DEV__) {
|
|
166
|
+
throw error;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return { walletLoadingState: newState };
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Get wallet identifier from loading state
|
|
173
|
+
*/
|
|
174
|
+
export function getWalletIdFromLoadingState(state) {
|
|
175
|
+
switch (state.type) {
|
|
176
|
+
case 'checking':
|
|
177
|
+
case 'loading':
|
|
178
|
+
case 'ready':
|
|
179
|
+
return state.identifier;
|
|
180
|
+
case 'error':
|
|
181
|
+
return state.identifier;
|
|
182
|
+
case 'not_loaded':
|
|
183
|
+
return null;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Check if wallet is in a loading state
|
|
188
|
+
*/
|
|
189
|
+
export function isWalletLoadingState(state) {
|
|
190
|
+
return state.type === 'checking' || state.type === 'loading';
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Check if wallet is ready
|
|
194
|
+
*/
|
|
195
|
+
export function isWalletReadyState(state) {
|
|
196
|
+
return state.type === 'ready';
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Check if wallet is in error state
|
|
200
|
+
*/
|
|
201
|
+
export function isWalletErrorState(state) {
|
|
202
|
+
return state.type === 'error';
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=walletStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"walletStore.js","sourceRoot":"","sources":["../../src/store/walletStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worklet Store - Source of Truth for Worklet Lifecycle
|
|
3
|
+
*
|
|
4
|
+
* This store manages worklet lifecycle state (initialization, configuration, runtime instances).
|
|
5
|
+
*
|
|
6
|
+
* ## Store Boundaries
|
|
7
|
+
*
|
|
8
|
+
* **workletStore** (this file):
|
|
9
|
+
* - Worklet lifecycle state (isWorkletStarted, isInitialized, isLoading)
|
|
10
|
+
* - Worklet runtime instances (worklet, hrpc, ipc)
|
|
11
|
+
* - Worklet configuration (networkConfigs)
|
|
12
|
+
* - Worklet initialization results (workletStartResult, wdkInitResult)
|
|
13
|
+
* - Encrypted credentials in memory (encryptedSeed, encryptionKey) - for active wallet
|
|
14
|
+
* - Multi-wallet credential cache (credentialsCache) - for multiple wallets
|
|
15
|
+
*
|
|
16
|
+
* **walletStore** (walletStore.ts):
|
|
17
|
+
* - Wallet data (addresses, balances)
|
|
18
|
+
* - Wallet loading states
|
|
19
|
+
* - Balance loading states
|
|
20
|
+
* - Last balance update timestamps
|
|
21
|
+
*
|
|
22
|
+
* ## Separation of Concerns
|
|
23
|
+
*
|
|
24
|
+
* - **workletStore**: Manages the worklet runtime and its lifecycle
|
|
25
|
+
* - **walletStore**: Manages wallet data derived from the worklet
|
|
26
|
+
*
|
|
27
|
+
* These stores are intentionally separate to:
|
|
28
|
+
* 1. Prevent cross-contamination of lifecycle and data concerns
|
|
29
|
+
* 2. Allow independent persistence strategies
|
|
30
|
+
* 3. Enable clear boundaries for testing and debugging
|
|
31
|
+
*
|
|
32
|
+
* ## Important Notes
|
|
33
|
+
*
|
|
34
|
+
* - NEVER store wallet data (addresses, balances) in workletStore
|
|
35
|
+
* - NEVER store worklet lifecycle state in walletStore
|
|
36
|
+
* - All worklet state is runtime-only - state resets completely on app restart
|
|
37
|
+
* - Worklets must be recreated when the app restarts
|
|
38
|
+
* - Encrypted credentials are runtime-only (loaded from secure storage when needed)
|
|
39
|
+
* - All operations are handled by WorkletLifecycleService, not the store itself
|
|
40
|
+
*/
|
|
41
|
+
import { create } from 'zustand';
|
|
42
|
+
import { Worklet } from '@spacesops/react-native-bare-kit';
|
|
43
|
+
import { HRPC } from '@spacesops/pear-wrk-wdk';
|
|
44
|
+
import type { WorkletStartResponse } from '@spacesops/pear-wrk-wdk/types/rpc';
|
|
45
|
+
import type { NetworkConfigs } from '../types';
|
|
46
|
+
/**
|
|
47
|
+
* Cached credentials interface for multi-wallet support
|
|
48
|
+
* Credentials are cached in workletStore to avoid repeated biometric prompts
|
|
49
|
+
*/
|
|
50
|
+
export interface CachedCredentials {
|
|
51
|
+
encryptionKey?: string;
|
|
52
|
+
encryptedSeed?: string;
|
|
53
|
+
encryptedEntropy?: string;
|
|
54
|
+
expiresAt: number;
|
|
55
|
+
}
|
|
56
|
+
export interface WorkletState {
|
|
57
|
+
worklet: Worklet | null;
|
|
58
|
+
hrpc: HRPC | null;
|
|
59
|
+
ipc: unknown | null;
|
|
60
|
+
isWorkletStarted: boolean;
|
|
61
|
+
isInitialized: boolean;
|
|
62
|
+
isLoading: boolean;
|
|
63
|
+
error: string | null;
|
|
64
|
+
encryptedSeed: string | null;
|
|
65
|
+
encryptionKey: string | null;
|
|
66
|
+
networkConfigs: NetworkConfigs | null;
|
|
67
|
+
workletStartResult: WorkletStartResponse | null;
|
|
68
|
+
wdkInitResult: {
|
|
69
|
+
status?: string | null;
|
|
70
|
+
} | null;
|
|
71
|
+
credentialsCache: Record<string, CachedCredentials>;
|
|
72
|
+
credentialsCacheTTL: number;
|
|
73
|
+
}
|
|
74
|
+
export type WorkletStore = WorkletState;
|
|
75
|
+
type WorkletStoreInstance = ReturnType<ReturnType<typeof create<WorkletStore>>>;
|
|
76
|
+
/**
|
|
77
|
+
* Creates singleton worklet store instance.
|
|
78
|
+
*
|
|
79
|
+
* This store is runtime-only - all state resets on app restart.
|
|
80
|
+
* All operations are handled by WorkletLifecycleService, not the store itself.
|
|
81
|
+
*/
|
|
82
|
+
export declare function createWorkletStore(): WorkletStoreInstance;
|
|
83
|
+
export declare function getWorkletStore(): import("zustand").UseBoundStore<import("zustand").StoreApi<WorkletState>>;
|
|
84
|
+
/**
|
|
85
|
+
* Get cached credentials for a wallet identifier
|
|
86
|
+
* Returns null if not cached or expired
|
|
87
|
+
* Updates access time for LRU tracking
|
|
88
|
+
*/
|
|
89
|
+
export declare function getCachedCredentials(identifier: string): CachedCredentials | null;
|
|
90
|
+
/**
|
|
91
|
+
* Set cached credentials for a wallet identifier
|
|
92
|
+
* Evicts LRU entries if cache size limit is reached
|
|
93
|
+
* Logs cache size for monitoring
|
|
94
|
+
*/
|
|
95
|
+
export declare function setCachedCredentials(identifier: string, credentials: Partial<CachedCredentials>): void;
|
|
96
|
+
/**
|
|
97
|
+
* Clear credentials cache for a specific wallet or all wallets
|
|
98
|
+
* Also clears access tracking
|
|
99
|
+
*/
|
|
100
|
+
export declare function clearCredentialsCache(identifier?: string): void;
|
|
101
|
+
/**
|
|
102
|
+
* Clear all sensitive data from memory (active wallet credentials + cache)
|
|
103
|
+
* This should be called when sensitive data is no longer needed
|
|
104
|
+
* to minimize exposure in memory dumps or debugging
|
|
105
|
+
*
|
|
106
|
+
* Note: In JavaScript, we cannot overwrite memory. Setting to null and clearing
|
|
107
|
+
* references allows garbage collection, but the old values may remain in memory
|
|
108
|
+
* until GC runs. This is a JavaScript limitation.
|
|
109
|
+
*/
|
|
110
|
+
export declare function clearAllSensitiveData(): void;
|
|
111
|
+
/**
|
|
112
|
+
* Reset the worklet store instance (useful for testing)
|
|
113
|
+
* Also resets access tracking
|
|
114
|
+
*/
|
|
115
|
+
export declare function resetWorkletStore(): void;
|
|
116
|
+
/**
|
|
117
|
+
* Get current credentials cache size
|
|
118
|
+
* Useful for monitoring and debugging
|
|
119
|
+
*/
|
|
120
|
+
export declare function getCredentialsCacheSize(): number;
|
|
121
|
+
export {};
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worklet Store - Source of Truth for Worklet Lifecycle
|
|
3
|
+
*
|
|
4
|
+
* This store manages worklet lifecycle state (initialization, configuration, runtime instances).
|
|
5
|
+
*
|
|
6
|
+
* ## Store Boundaries
|
|
7
|
+
*
|
|
8
|
+
* **workletStore** (this file):
|
|
9
|
+
* - Worklet lifecycle state (isWorkletStarted, isInitialized, isLoading)
|
|
10
|
+
* - Worklet runtime instances (worklet, hrpc, ipc)
|
|
11
|
+
* - Worklet configuration (networkConfigs)
|
|
12
|
+
* - Worklet initialization results (workletStartResult, wdkInitResult)
|
|
13
|
+
* - Encrypted credentials in memory (encryptedSeed, encryptionKey) - for active wallet
|
|
14
|
+
* - Multi-wallet credential cache (credentialsCache) - for multiple wallets
|
|
15
|
+
*
|
|
16
|
+
* **walletStore** (walletStore.ts):
|
|
17
|
+
* - Wallet data (addresses, balances)
|
|
18
|
+
* - Wallet loading states
|
|
19
|
+
* - Balance loading states
|
|
20
|
+
* - Last balance update timestamps
|
|
21
|
+
*
|
|
22
|
+
* ## Separation of Concerns
|
|
23
|
+
*
|
|
24
|
+
* - **workletStore**: Manages the worklet runtime and its lifecycle
|
|
25
|
+
* - **walletStore**: Manages wallet data derived from the worklet
|
|
26
|
+
*
|
|
27
|
+
* These stores are intentionally separate to:
|
|
28
|
+
* 1. Prevent cross-contamination of lifecycle and data concerns
|
|
29
|
+
* 2. Allow independent persistence strategies
|
|
30
|
+
* 3. Enable clear boundaries for testing and debugging
|
|
31
|
+
*
|
|
32
|
+
* ## Important Notes
|
|
33
|
+
*
|
|
34
|
+
* - NEVER store wallet data (addresses, balances) in workletStore
|
|
35
|
+
* - NEVER store worklet lifecycle state in walletStore
|
|
36
|
+
* - All worklet state is runtime-only - state resets completely on app restart
|
|
37
|
+
* - Worklets must be recreated when the app restarts
|
|
38
|
+
* - Encrypted credentials are runtime-only (loaded from secure storage when needed)
|
|
39
|
+
* - All operations are handled by WorkletLifecycleService, not the store itself
|
|
40
|
+
*/
|
|
41
|
+
// External packages
|
|
42
|
+
import { create } from 'zustand';
|
|
43
|
+
import { devtools } from 'zustand/middleware';
|
|
44
|
+
import { log } from '../utils/logger';
|
|
45
|
+
/**
|
|
46
|
+
* Maximum number of credentials to cache before evicting least recently used
|
|
47
|
+
* This prevents unbounded memory growth while maintaining performance
|
|
48
|
+
* Recommended: 10-20 wallets for typical use cases
|
|
49
|
+
*
|
|
50
|
+
* Cache Management:
|
|
51
|
+
* - Size Limit: When cache exceeds MAX_CREDENTIALS_CACHE_SIZE, LRU entries are evicted
|
|
52
|
+
* - TTL (Time To Live): Each credential has an expiration timestamp (default: 5 minutes)
|
|
53
|
+
* - Automatic Expiration: Expired credentials are removed on access
|
|
54
|
+
* - LRU Eviction: Least recently used credentials are evicted when size limit is reached
|
|
55
|
+
*
|
|
56
|
+
* These safeguards ensure:
|
|
57
|
+
* 1. Memory usage remains bounded
|
|
58
|
+
* 2. Credentials don't persist indefinitely in memory
|
|
59
|
+
* 3. Frequently used wallets remain cached for better UX
|
|
60
|
+
*/
|
|
61
|
+
const MAX_CREDENTIALS_CACHE_SIZE = 15;
|
|
62
|
+
/**
|
|
63
|
+
* Access tracking for LRU eviction
|
|
64
|
+
* Tracks when each credential was last accessed
|
|
65
|
+
*/
|
|
66
|
+
const credentialsAccessOrder = new Map();
|
|
67
|
+
let credentialsAccessCounter = 0;
|
|
68
|
+
const initialState = {
|
|
69
|
+
worklet: null,
|
|
70
|
+
hrpc: null,
|
|
71
|
+
ipc: null,
|
|
72
|
+
isWorkletStarted: false,
|
|
73
|
+
isInitialized: false,
|
|
74
|
+
isLoading: false,
|
|
75
|
+
error: null,
|
|
76
|
+
encryptedSeed: null,
|
|
77
|
+
encryptionKey: null,
|
|
78
|
+
networkConfigs: null,
|
|
79
|
+
workletStartResult: null,
|
|
80
|
+
wdkInitResult: null,
|
|
81
|
+
credentialsCache: {},
|
|
82
|
+
credentialsCacheTTL: 5 * 60 * 1000, // 5 minutes
|
|
83
|
+
};
|
|
84
|
+
let workletStoreInstance = null;
|
|
85
|
+
/**
|
|
86
|
+
* Creates singleton worklet store instance.
|
|
87
|
+
*
|
|
88
|
+
* This store is runtime-only - all state resets on app restart.
|
|
89
|
+
* All operations are handled by WorkletLifecycleService, not the store itself.
|
|
90
|
+
*/
|
|
91
|
+
export function createWorkletStore() {
|
|
92
|
+
if (workletStoreInstance) {
|
|
93
|
+
return workletStoreInstance;
|
|
94
|
+
}
|
|
95
|
+
const store = create()(devtools(() => ({
|
|
96
|
+
...initialState,
|
|
97
|
+
}), { name: 'WorkletStore' }));
|
|
98
|
+
workletStoreInstance = store;
|
|
99
|
+
return store;
|
|
100
|
+
}
|
|
101
|
+
export function getWorkletStore() {
|
|
102
|
+
return createWorkletStore();
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Evict least recently used credentials from cache when limit is reached
|
|
106
|
+
* Logs eviction for monitoring
|
|
107
|
+
*/
|
|
108
|
+
function evictLRUCredentials() {
|
|
109
|
+
const store = getWorkletStore();
|
|
110
|
+
const state = store.getState();
|
|
111
|
+
const cacheSize = Object.keys(state.credentialsCache).length;
|
|
112
|
+
if (cacheSize < MAX_CREDENTIALS_CACHE_SIZE) {
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
// Find the least recently used credential
|
|
116
|
+
let oldestIdentifier = null;
|
|
117
|
+
let oldestAccess = Infinity;
|
|
118
|
+
for (const [identifier, accessTime] of credentialsAccessOrder.entries()) {
|
|
119
|
+
if (accessTime < oldestAccess && state.credentialsCache[identifier]) {
|
|
120
|
+
oldestAccess = accessTime;
|
|
121
|
+
oldestIdentifier = identifier;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Remove the least recently used credential
|
|
125
|
+
if (oldestIdentifier !== null) {
|
|
126
|
+
const { [oldestIdentifier]: _, ...rest } = state.credentialsCache;
|
|
127
|
+
credentialsAccessOrder.delete(oldestIdentifier);
|
|
128
|
+
store.setState({ credentialsCache: rest });
|
|
129
|
+
log(`[WorkletStore] Evicted LRU credentials cache entry: ${oldestIdentifier} (cache size: ${cacheSize}/${MAX_CREDENTIALS_CACHE_SIZE})`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Log cache size if it exceeds warning threshold (50% of max)
|
|
134
|
+
* Useful for monitoring cache growth in production
|
|
135
|
+
*/
|
|
136
|
+
function logCacheSizeIfNeeded(cacheSize) {
|
|
137
|
+
const warningThreshold = Math.ceil(MAX_CREDENTIALS_CACHE_SIZE * 0.5);
|
|
138
|
+
if (cacheSize >= warningThreshold) {
|
|
139
|
+
log(`[WorkletStore] Credentials cache size: ${cacheSize}/${MAX_CREDENTIALS_CACHE_SIZE} (${Math.round(cacheSize / MAX_CREDENTIALS_CACHE_SIZE * 100)}% full)`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Get cached credentials for a wallet identifier
|
|
144
|
+
* Returns null if not cached or expired
|
|
145
|
+
* Updates access time for LRU tracking
|
|
146
|
+
*/
|
|
147
|
+
export function getCachedCredentials(identifier) {
|
|
148
|
+
const store = getWorkletStore();
|
|
149
|
+
const state = store.getState();
|
|
150
|
+
const cached = state.credentialsCache[identifier];
|
|
151
|
+
if (!cached)
|
|
152
|
+
return null;
|
|
153
|
+
// Check expiration
|
|
154
|
+
if (Date.now() > cached.expiresAt) {
|
|
155
|
+
// Remove expired entry
|
|
156
|
+
const { [identifier]: _, ...rest } = state.credentialsCache;
|
|
157
|
+
credentialsAccessOrder.delete(identifier);
|
|
158
|
+
store.setState({
|
|
159
|
+
credentialsCache: rest,
|
|
160
|
+
});
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
// Update access time for LRU tracking
|
|
164
|
+
credentialsAccessCounter++;
|
|
165
|
+
credentialsAccessOrder.set(identifier, credentialsAccessCounter);
|
|
166
|
+
return cached;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Set cached credentials for a wallet identifier
|
|
170
|
+
* Evicts LRU entries if cache size limit is reached
|
|
171
|
+
* Logs cache size for monitoring
|
|
172
|
+
*/
|
|
173
|
+
export function setCachedCredentials(identifier, credentials) {
|
|
174
|
+
const store = getWorkletStore();
|
|
175
|
+
const state = store.getState();
|
|
176
|
+
const existing = state.credentialsCache[identifier] || {};
|
|
177
|
+
// Evict LRU credentials if needed before adding new entry
|
|
178
|
+
// Check if we're adding a new entry (not just updating existing)
|
|
179
|
+
const isNewEntry = !state.credentialsCache[identifier];
|
|
180
|
+
if (isNewEntry) {
|
|
181
|
+
evictLRUCredentials();
|
|
182
|
+
}
|
|
183
|
+
// Update access time for LRU tracking
|
|
184
|
+
credentialsAccessCounter++;
|
|
185
|
+
credentialsAccessOrder.set(identifier, credentialsAccessCounter);
|
|
186
|
+
store.setState({
|
|
187
|
+
credentialsCache: {
|
|
188
|
+
...state.credentialsCache,
|
|
189
|
+
[identifier]: {
|
|
190
|
+
...existing,
|
|
191
|
+
...credentials,
|
|
192
|
+
expiresAt: Date.now() + state.credentialsCacheTTL,
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
// Log cache size for monitoring (after state update)
|
|
197
|
+
const newCacheSize = Object.keys(store.getState().credentialsCache).length;
|
|
198
|
+
logCacheSizeIfNeeded(newCacheSize);
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Clear credentials cache for a specific wallet or all wallets
|
|
202
|
+
* Also clears access tracking
|
|
203
|
+
*/
|
|
204
|
+
export function clearCredentialsCache(identifier) {
|
|
205
|
+
const store = getWorkletStore();
|
|
206
|
+
const state = store.getState();
|
|
207
|
+
if (identifier) {
|
|
208
|
+
// Clear specific wallet
|
|
209
|
+
const { [identifier]: _, ...rest } = state.credentialsCache;
|
|
210
|
+
credentialsAccessOrder.delete(identifier);
|
|
211
|
+
store.setState({ credentialsCache: rest });
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
// Clear all
|
|
215
|
+
credentialsAccessOrder.clear();
|
|
216
|
+
credentialsAccessCounter = 0;
|
|
217
|
+
store.setState({ credentialsCache: {} });
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Clear all sensitive data from memory (active wallet credentials + cache)
|
|
222
|
+
* This should be called when sensitive data is no longer needed
|
|
223
|
+
* to minimize exposure in memory dumps or debugging
|
|
224
|
+
*
|
|
225
|
+
* Note: In JavaScript, we cannot overwrite memory. Setting to null and clearing
|
|
226
|
+
* references allows garbage collection, but the old values may remain in memory
|
|
227
|
+
* until GC runs. This is a JavaScript limitation.
|
|
228
|
+
*/
|
|
229
|
+
export function clearAllSensitiveData() {
|
|
230
|
+
const store = getWorkletStore();
|
|
231
|
+
credentialsAccessOrder.clear();
|
|
232
|
+
credentialsAccessCounter = 0;
|
|
233
|
+
store.setState({
|
|
234
|
+
encryptedSeed: null,
|
|
235
|
+
encryptionKey: null,
|
|
236
|
+
credentialsCache: {},
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Reset the worklet store instance (useful for testing)
|
|
241
|
+
* Also resets access tracking
|
|
242
|
+
*/
|
|
243
|
+
export function resetWorkletStore() {
|
|
244
|
+
credentialsAccessOrder.clear();
|
|
245
|
+
credentialsAccessCounter = 0;
|
|
246
|
+
workletStoreInstance = null;
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Get current credentials cache size
|
|
250
|
+
* Useful for monitoring and debugging
|
|
251
|
+
*/
|
|
252
|
+
export function getCredentialsCacheSize() {
|
|
253
|
+
const store = getWorkletStore();
|
|
254
|
+
return Object.keys(store.getState().credentialsCache).length;
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=workletStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workletStore.js","sourceRoot":"","sources":["../../src/store/workletStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HRPC Type Extensions
|
|
3
|
+
*
|
|
4
|
+
* Type definitions for HRPC methods that may not be in the @spacesops/pear-wrk-wdk types yet.
|
|
5
|
+
* These types extend the HRPC interface to provide proper type safety.
|
|
6
|
+
*/
|
|
7
|
+
import type { HRPC } from '@spacesops/pear-wrk-wdk';
|
|
8
|
+
/**
|
|
9
|
+
* Extended HRPC interface with additional methods
|
|
10
|
+
*/
|
|
11
|
+
export interface ExtendedHRPC extends HRPC {
|
|
12
|
+
/**
|
|
13
|
+
* Initialize WDK with encrypted seed
|
|
14
|
+
*/
|
|
15
|
+
initializeWDK: (options: {
|
|
16
|
+
encryptionKey: string;
|
|
17
|
+
encryptedSeed: string;
|
|
18
|
+
config: string;
|
|
19
|
+
}) => Promise<{
|
|
20
|
+
status?: string | null;
|
|
21
|
+
}>;
|
|
22
|
+
/**
|
|
23
|
+
* Generate entropy and encrypt it
|
|
24
|
+
*/
|
|
25
|
+
generateEntropyAndEncrypt: (options: {
|
|
26
|
+
wordCount: number;
|
|
27
|
+
}) => Promise<{
|
|
28
|
+
encryptionKey: string;
|
|
29
|
+
encryptedSeedBuffer: string;
|
|
30
|
+
encryptedEntropyBuffer: string;
|
|
31
|
+
}>;
|
|
32
|
+
/**
|
|
33
|
+
* Get mnemonic from encrypted entropy
|
|
34
|
+
*/
|
|
35
|
+
getMnemonicFromEntropy: (options: {
|
|
36
|
+
encryptedEntropy: string;
|
|
37
|
+
encryptionKey: string;
|
|
38
|
+
}) => Promise<{
|
|
39
|
+
mnemonic: string;
|
|
40
|
+
}>;
|
|
41
|
+
/**
|
|
42
|
+
* Get seed and entropy from mnemonic phrase
|
|
43
|
+
*/
|
|
44
|
+
getSeedAndEntropyFromMnemonic: (options: {
|
|
45
|
+
mnemonic: string;
|
|
46
|
+
}) => Promise<{
|
|
47
|
+
encryptionKey: string;
|
|
48
|
+
encryptedSeedBuffer: string;
|
|
49
|
+
encryptedEntropyBuffer: string;
|
|
50
|
+
}>;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Type guard to check if HRPC instance has extended methods
|
|
54
|
+
*/
|
|
55
|
+
export declare function isExtendedHRPC(hrpc: HRPC): hrpc is ExtendedHRPC;
|
|
56
|
+
/**
|
|
57
|
+
* Safely cast HRPC to ExtendedHRPC
|
|
58
|
+
* Throws if the HRPC instance doesn't have the required methods
|
|
59
|
+
*/
|
|
60
|
+
export declare function asExtendedHRPC(hrpc: HRPC): ExtendedHRPC;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HRPC Type Extensions
|
|
3
|
+
*
|
|
4
|
+
* Type definitions for HRPC methods that may not be in the @spacesops/pear-wrk-wdk types yet.
|
|
5
|
+
* These types extend the HRPC interface to provide proper type safety.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Type guard to check if HRPC instance has extended methods
|
|
9
|
+
*/
|
|
10
|
+
export function isExtendedHRPC(hrpc) {
|
|
11
|
+
return (typeof hrpc.initializeWDK === 'function' &&
|
|
12
|
+
typeof hrpc.generateEntropyAndEncrypt === 'function' &&
|
|
13
|
+
typeof hrpc.getMnemonicFromEntropy === 'function' &&
|
|
14
|
+
typeof hrpc.getSeedAndEntropyFromMnemonic === 'function');
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Safely cast HRPC to ExtendedHRPC
|
|
18
|
+
* Throws if the HRPC instance doesn't have the required methods
|
|
19
|
+
*/
|
|
20
|
+
export function asExtendedHRPC(hrpc) {
|
|
21
|
+
if (!isExtendedHRPC(hrpc)) {
|
|
22
|
+
throw new Error('HRPC instance does not have required extended methods');
|
|
23
|
+
}
|
|
24
|
+
return hrpc;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=hrpc.js.map
|