@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.
Files changed (275) hide show
  1. package/README.md +551 -0
  2. package/dist/__mocks__/react.d.ts +40 -0
  3. package/dist/__mocks__/react.js +33 -0
  4. package/dist/__mocks__/react.js.map +1 -0
  5. package/dist/__mocks__/secureStorage.d.ts +26 -0
  6. package/dist/__mocks__/secureStorage.js +80 -0
  7. package/dist/__mocks__/secureStorage.js.map +1 -0
  8. package/dist/__tests__/hooks/useBalance.test.d.ts +6 -0
  9. package/dist/__tests__/hooks/useBalance.test.js +217 -0
  10. package/dist/__tests__/hooks/useBalance.test.js.map +1 -0
  11. package/dist/__tests__/hooks/useWallet.test.d.ts +6 -0
  12. package/dist/__tests__/hooks/useWallet.test.js +105 -0
  13. package/dist/__tests__/hooks/useWallet.test.js.map +1 -0
  14. package/dist/__tests__/hooks/useWalletManager.test.d.ts +6 -0
  15. package/dist/__tests__/hooks/useWalletManager.test.js +193 -0
  16. package/dist/__tests__/hooks/useWalletManager.test.js.map +1 -0
  17. package/dist/__tests__/hooks/useWdkApp.test.d.ts +6 -0
  18. package/dist/__tests__/hooks/useWdkApp.test.js +55 -0
  19. package/dist/__tests__/hooks/useWdkApp.test.js.map +1 -0
  20. package/dist/__tests__/hooks/useWorklet.test.d.ts +6 -0
  21. package/dist/__tests__/hooks/useWorklet.test.js +168 -0
  22. package/dist/__tests__/hooks/useWorklet.test.js.map +1 -0
  23. package/dist/__tests__/provider/WdkAppProvider.test.d.ts +6 -0
  24. package/dist/__tests__/provider/WdkAppProvider.test.js +57 -0
  25. package/dist/__tests__/provider/WdkAppProvider.test.js.map +1 -0
  26. package/dist/__tests__/services/accountService.test.d.ts +6 -0
  27. package/dist/__tests__/services/accountService.test.js +216 -0
  28. package/dist/__tests__/services/accountService.test.js.map +1 -0
  29. package/dist/__tests__/services/addressService.test.d.ts +6 -0
  30. package/dist/__tests__/services/addressService.test.js +246 -0
  31. package/dist/__tests__/services/addressService.test.js.map +1 -0
  32. package/dist/__tests__/services/balanceService.test.d.ts +6 -0
  33. package/dist/__tests__/services/balanceService.test.js +333 -0
  34. package/dist/__tests__/services/balanceService.test.js.map +1 -0
  35. package/dist/__tests__/services/walletSetupService.test.d.ts +6 -0
  36. package/dist/__tests__/services/walletSetupService.test.js +304 -0
  37. package/dist/__tests__/services/walletSetupService.test.js.map +1 -0
  38. package/dist/__tests__/services/walletSwitchingService.test.d.ts +6 -0
  39. package/dist/__tests__/services/walletSwitchingService.test.js +209 -0
  40. package/dist/__tests__/services/walletSwitchingService.test.js.map +1 -0
  41. package/dist/__tests__/services/workletLifecycleService.test.d.ts +6 -0
  42. package/dist/__tests__/services/workletLifecycleService.test.js +451 -0
  43. package/dist/__tests__/services/workletLifecycleService.test.js.map +1 -0
  44. package/dist/__tests__/setup.d.ts +7 -0
  45. package/dist/__tests__/setup.js +49 -0
  46. package/dist/__tests__/setup.js.map +1 -0
  47. package/dist/__tests__/storage/mmkvStorage.test.d.ts +6 -0
  48. package/dist/__tests__/storage/mmkvStorage.test.js +213 -0
  49. package/dist/__tests__/storage/mmkvStorage.test.js.map +1 -0
  50. package/dist/__tests__/store/walletStore.test.d.ts +4 -0
  51. package/dist/__tests__/store/walletStore.test.js +86 -0
  52. package/dist/__tests__/store/walletStore.test.js.map +1 -0
  53. package/dist/__tests__/store/workletStore.test.d.ts +4 -0
  54. package/dist/__tests__/store/workletStore.test.js +255 -0
  55. package/dist/__tests__/store/workletStore.test.js.map +1 -0
  56. package/dist/__tests__/types/hrpc.test.d.ts +4 -0
  57. package/dist/__tests__/types/hrpc.test.js +99 -0
  58. package/dist/__tests__/types/hrpc.test.js.map +1 -0
  59. package/dist/__tests__/utils/balanceUtils.test.d.ts +4 -0
  60. package/dist/__tests__/utils/balanceUtils.test.js +133 -0
  61. package/dist/__tests__/utils/balanceUtils.test.js.map +1 -0
  62. package/dist/__tests__/utils/errorHandling.test.d.ts +6 -0
  63. package/dist/__tests__/utils/errorHandling.test.js +119 -0
  64. package/dist/__tests__/utils/errorHandling.test.js.map +1 -0
  65. package/dist/__tests__/utils/errorUtils.test.d.ts +4 -0
  66. package/dist/__tests__/utils/errorUtils.test.js +133 -0
  67. package/dist/__tests__/utils/errorUtils.test.js.map +1 -0
  68. package/dist/__tests__/utils/initializationState.test.d.ts +6 -0
  69. package/dist/__tests__/utils/initializationState.test.js +243 -0
  70. package/dist/__tests__/utils/initializationState.test.js.map +1 -0
  71. package/dist/__tests__/utils/jsonUtils.test.d.ts +4 -0
  72. package/dist/__tests__/utils/jsonUtils.test.js +118 -0
  73. package/dist/__tests__/utils/jsonUtils.test.js.map +1 -0
  74. package/dist/__tests__/utils/mmkvKeyManager.test.d.ts +6 -0
  75. package/dist/__tests__/utils/mmkvKeyManager.test.js +158 -0
  76. package/dist/__tests__/utils/mmkvKeyManager.test.js.map +1 -0
  77. package/dist/__tests__/utils/mnemonicUtils.test.d.ts +4 -0
  78. package/dist/__tests__/utils/mnemonicUtils.test.js +40 -0
  79. package/dist/__tests__/utils/mnemonicUtils.test.js.map +1 -0
  80. package/dist/__tests__/utils/raceConditions.test.d.ts +6 -0
  81. package/dist/__tests__/utils/raceConditions.test.js +239 -0
  82. package/dist/__tests__/utils/raceConditions.test.js.map +1 -0
  83. package/dist/__tests__/utils/result.test.d.ts +4 -0
  84. package/dist/__tests__/utils/result.test.js +66 -0
  85. package/dist/__tests__/utils/result.test.js.map +1 -0
  86. package/dist/__tests__/utils/schemas.test.d.ts +4 -0
  87. package/dist/__tests__/utils/schemas.test.js +66 -0
  88. package/dist/__tests__/utils/schemas.test.js.map +1 -0
  89. package/dist/__tests__/utils/storeHelpers.test.d.ts +4 -0
  90. package/dist/__tests__/utils/storeHelpers.test.js +227 -0
  91. package/dist/__tests__/utils/storeHelpers.test.js.map +1 -0
  92. package/dist/__tests__/utils/typeGuards.test.d.ts +4 -0
  93. package/dist/__tests__/utils/typeGuards.test.js +175 -0
  94. package/dist/__tests__/utils/typeGuards.test.js.map +1 -0
  95. package/dist/__tests__/utils/validation.test.d.ts +4 -0
  96. package/dist/__tests__/utils/validation.test.js +126 -0
  97. package/dist/__tests__/utils/validation.test.js.map +1 -0
  98. package/dist/__tests__/utils/walletUtils.test.d.ts +4 -0
  99. package/dist/__tests__/utils/walletUtils.test.js +156 -0
  100. package/dist/__tests__/utils/walletUtils.test.js.map +1 -0
  101. package/dist/hooks/useBalance.d.ts +170 -0
  102. package/dist/hooks/useBalance.js +442 -0
  103. package/dist/hooks/useBalance.js.map +1 -0
  104. package/dist/hooks/useWallet.d.ts +43 -0
  105. package/dist/hooks/useWallet.js +193 -0
  106. package/dist/hooks/useWallet.js.map +1 -0
  107. package/dist/hooks/useWalletManager.d.ts +100 -0
  108. package/dist/hooks/useWalletManager.js +526 -0
  109. package/dist/hooks/useWalletManager.js.map +1 -0
  110. package/dist/hooks/useWdkApp.d.ts +66 -0
  111. package/dist/hooks/useWdkApp.js +74 -0
  112. package/dist/hooks/useWdkApp.js.map +1 -0
  113. package/dist/hooks/useWorklet.d.ts +66 -0
  114. package/dist/hooks/useWorklet.js +42 -0
  115. package/dist/hooks/useWorklet.js.map +1 -0
  116. package/dist/index.d.ts +33 -0
  117. package/dist/index.js +36 -0
  118. package/dist/index.js.map +1 -0
  119. package/dist/provider/WdkAppProvider.d.ts +112 -0
  120. package/dist/provider/WdkAppProvider.js +558 -0
  121. package/dist/provider/WdkAppProvider.js.map +1 -0
  122. package/dist/services/accountService.d.ts +52 -0
  123. package/dist/services/accountService.js +119 -0
  124. package/dist/services/accountService.js.map +1 -0
  125. package/dist/services/addressService.d.ts +22 -0
  126. package/dist/services/addressService.js +110 -0
  127. package/dist/services/addressService.js.map +1 -0
  128. package/dist/services/balanceService.d.ts +114 -0
  129. package/dist/services/balanceService.js +208 -0
  130. package/dist/services/balanceService.js.map +1 -0
  131. package/dist/services/walletSetupService.d.ts +217 -0
  132. package/dist/services/walletSetupService.js +535 -0
  133. package/dist/services/walletSetupService.js.map +1 -0
  134. package/dist/services/walletSwitchingService.d.ts +48 -0
  135. package/dist/services/walletSwitchingService.js +143 -0
  136. package/dist/services/walletSwitchingService.js.map +1 -0
  137. package/dist/services/workletLifecycleService.d.ts +117 -0
  138. package/dist/services/workletLifecycleService.js +433 -0
  139. package/dist/services/workletLifecycleService.js.map +1 -0
  140. package/dist/storage/mmkvStorage.d.ts +44 -0
  141. package/dist/storage/mmkvStorage.js +348 -0
  142. package/dist/storage/mmkvStorage.js.map +1 -0
  143. package/dist/store/walletStore.d.ts +130 -0
  144. package/dist/store/walletStore.js +204 -0
  145. package/dist/store/walletStore.js.map +1 -0
  146. package/dist/store/workletStore.d.ts +121 -0
  147. package/dist/store/workletStore.js +256 -0
  148. package/dist/store/workletStore.js.map +1 -0
  149. package/dist/types/hrpc.d.ts +60 -0
  150. package/dist/types/hrpc.js +26 -0
  151. package/dist/types/hrpc.js.map +1 -0
  152. package/dist/types.d.ts +168 -0
  153. package/dist/types.js +7 -0
  154. package/dist/types.js.map +1 -0
  155. package/dist/utils/balanceUtils.d.ts +30 -0
  156. package/dist/utils/balanceUtils.js +86 -0
  157. package/dist/utils/balanceUtils.js.map +1 -0
  158. package/dist/utils/constants.d.ts +66 -0
  159. package/dist/utils/constants.js +73 -0
  160. package/dist/utils/constants.js.map +1 -0
  161. package/dist/utils/errorHandling.d.ts +47 -0
  162. package/dist/utils/errorHandling.js +54 -0
  163. package/dist/utils/errorHandling.js.map +1 -0
  164. package/dist/utils/errorUtils.d.ts +89 -0
  165. package/dist/utils/errorUtils.js +264 -0
  166. package/dist/utils/errorUtils.js.map +1 -0
  167. package/dist/utils/initializationState.d.ts +129 -0
  168. package/dist/utils/initializationState.js +220 -0
  169. package/dist/utils/initializationState.js.map +1 -0
  170. package/dist/utils/jsonUtils.d.ts +21 -0
  171. package/dist/utils/jsonUtils.js +67 -0
  172. package/dist/utils/jsonUtils.js.map +1 -0
  173. package/dist/utils/logger.d.ts +27 -0
  174. package/dist/utils/logger.js +50 -0
  175. package/dist/utils/logger.js.map +1 -0
  176. package/dist/utils/mmkvKeyManager.d.ts +57 -0
  177. package/dist/utils/mmkvKeyManager.js +214 -0
  178. package/dist/utils/mmkvKeyManager.js.map +1 -0
  179. package/dist/utils/mnemonicUtils.d.ts +17 -0
  180. package/dist/utils/mnemonicUtils.js +28 -0
  181. package/dist/utils/mnemonicUtils.js.map +1 -0
  182. package/dist/utils/operationMutex.d.ts +69 -0
  183. package/dist/utils/operationMutex.js +150 -0
  184. package/dist/utils/operationMutex.js.map +1 -0
  185. package/dist/utils/result.d.ts +34 -0
  186. package/dist/utils/result.js +43 -0
  187. package/dist/utils/result.js.map +1 -0
  188. package/dist/utils/schemas.d.ts +365 -0
  189. package/dist/utils/schemas.js +152 -0
  190. package/dist/utils/schemas.js.map +1 -0
  191. package/dist/utils/storeHelpers.d.ts +112 -0
  192. package/dist/utils/storeHelpers.js +198 -0
  193. package/dist/utils/storeHelpers.js.map +1 -0
  194. package/dist/utils/typeGuards.d.ts +70 -0
  195. package/dist/utils/typeGuards.js +95 -0
  196. package/dist/utils/typeGuards.js.map +1 -0
  197. package/dist/utils/validation.d.ts +53 -0
  198. package/dist/utils/validation.js +152 -0
  199. package/dist/utils/validation.js.map +1 -0
  200. package/dist/utils/walletStateHelpers.d.ts +62 -0
  201. package/dist/utils/walletStateHelpers.js +81 -0
  202. package/dist/utils/walletStateHelpers.js.map +1 -0
  203. package/dist/utils/walletUtils.d.ts +38 -0
  204. package/dist/utils/walletUtils.js +87 -0
  205. package/dist/utils/walletUtils.js.map +1 -0
  206. package/package.json +79 -0
  207. package/src/__mocks__/react.ts +34 -0
  208. package/src/__mocks__/secureStorage.ts +87 -0
  209. package/src/__tests__/hooks/useBalance.test.ts +286 -0
  210. package/src/__tests__/hooks/useWallet.test.ts +122 -0
  211. package/src/__tests__/hooks/useWalletManager.test.ts +271 -0
  212. package/src/__tests__/hooks/useWdkApp.test.tsx +59 -0
  213. package/src/__tests__/hooks/useWorklet.test.ts +195 -0
  214. package/src/__tests__/provider/WdkAppProvider.test.tsx +67 -0
  215. package/src/__tests__/services/accountService.test.ts +337 -0
  216. package/src/__tests__/services/addressService.test.ts +312 -0
  217. package/src/__tests__/services/balanceService.test.ts +411 -0
  218. package/src/__tests__/services/walletSetupService.test.ts +463 -0
  219. package/src/__tests__/services/walletSwitchingService.test.ts +258 -0
  220. package/src/__tests__/services/workletLifecycleService.test.ts +514 -0
  221. package/src/__tests__/setup.ts +54 -0
  222. package/src/__tests__/storage/mmkvStorage.test.ts +325 -0
  223. package/src/__tests__/store/walletStore.test.ts +101 -0
  224. package/src/__tests__/store/workletStore.test.ts +329 -0
  225. package/src/__tests__/types/hrpc.test.ts +125 -0
  226. package/src/__tests__/utils/balanceUtils.test.ts +151 -0
  227. package/src/__tests__/utils/errorHandling.test.ts +147 -0
  228. package/src/__tests__/utils/errorUtils.test.ts +170 -0
  229. package/src/__tests__/utils/initializationState.test.ts +337 -0
  230. package/src/__tests__/utils/jsonUtils.test.ts +131 -0
  231. package/src/__tests__/utils/mmkvKeyManager.test.ts +205 -0
  232. package/src/__tests__/utils/mnemonicUtils.test.ts +48 -0
  233. package/src/__tests__/utils/raceConditions.test.ts +292 -0
  234. package/src/__tests__/utils/result.test.ts +73 -0
  235. package/src/__tests__/utils/schemas.test.ts +82 -0
  236. package/src/__tests__/utils/storeHelpers.test.ts +323 -0
  237. package/src/__tests__/utils/typeGuards.test.ts +209 -0
  238. package/src/__tests__/utils/validation.test.ts +152 -0
  239. package/src/__tests__/utils/walletUtils.test.ts +195 -0
  240. package/src/hooks/useBalance.ts +597 -0
  241. package/src/hooks/useWallet.ts +288 -0
  242. package/src/hooks/useWalletManager.ts +654 -0
  243. package/src/hooks/useWdkApp.ts +78 -0
  244. package/src/hooks/useWorklet.ts +109 -0
  245. package/src/index.ts +112 -0
  246. package/src/provider/WdkAppProvider.tsx +764 -0
  247. package/src/services/accountService.ts +134 -0
  248. package/src/services/addressService.ts +125 -0
  249. package/src/services/balanceService.ts +291 -0
  250. package/src/services/walletSetupService.ts +695 -0
  251. package/src/services/walletSwitchingService.ts +157 -0
  252. package/src/services/workletLifecycleService.ts +561 -0
  253. package/src/storage/mmkvStorage.ts +417 -0
  254. package/src/store/walletStore.ts +301 -0
  255. package/src/store/workletStore.ts +340 -0
  256. package/src/types/hrpc.ts +78 -0
  257. package/src/types.ts +188 -0
  258. package/src/utils/balanceUtils.ts +96 -0
  259. package/src/utils/constants.ts +84 -0
  260. package/src/utils/errorHandling.md +163 -0
  261. package/src/utils/errorHandling.ts +61 -0
  262. package/src/utils/errorUtils.ts +300 -0
  263. package/src/utils/initializationState.ts +242 -0
  264. package/src/utils/jsonUtils.ts +75 -0
  265. package/src/utils/logger.ts +54 -0
  266. package/src/utils/mmkvKeyManager.ts +256 -0
  267. package/src/utils/mnemonicUtils.ts +35 -0
  268. package/src/utils/operationMutex.ts +181 -0
  269. package/src/utils/result.ts +57 -0
  270. package/src/utils/schemas.ts +190 -0
  271. package/src/utils/storeHelpers.ts +236 -0
  272. package/src/utils/typeGuards.ts +129 -0
  273. package/src/utils/validation.ts +174 -0
  274. package/src/utils/walletStateHelpers.ts +104 -0
  275. package/src/utils/walletUtils.ts +107 -0
@@ -0,0 +1,348 @@
1
+ import { createMMKV } from 'react-native-mmkv';
2
+ import { getMMKVKey } from '../utils/mmkvKeyManager';
3
+ import { logWarn } from '../utils/logger';
4
+ /**
5
+ * Maximum number of storage instances to cache before evicting least recently used
6
+ * This prevents unbounded memory growth while maintaining performance
7
+ */
8
+ const MAX_STORAGE_CACHE_SIZE = 10;
9
+ /**
10
+ * Cache for MMKV storage instances to avoid recreating them
11
+ * Uses LRU (Least Recently Used) eviction policy to limit memory usage
12
+ */
13
+ const storageCache = new Map();
14
+ const storageAccessOrder = new Map();
15
+ let storageAccessCounter = 0;
16
+ /**
17
+ * Evict least recently used storage instance from cache when limit is reached
18
+ */
19
+ function evictLRUStorage() {
20
+ if (storageCache.size < MAX_STORAGE_CACHE_SIZE) {
21
+ return;
22
+ }
23
+ // Find the least recently used storage
24
+ let oldestKey = null;
25
+ let oldestAccess = Infinity;
26
+ for (const [key, accessTime] of storageAccessOrder.entries()) {
27
+ if (accessTime < oldestAccess) {
28
+ oldestAccess = accessTime;
29
+ oldestKey = key;
30
+ }
31
+ }
32
+ // Remove the least recently used storage
33
+ if (oldestKey !== null) {
34
+ storageCache.delete(oldestKey);
35
+ storageAccessOrder.delete(oldestKey);
36
+ }
37
+ }
38
+ /**
39
+ * Create MMKV storage instance for the wallet
40
+ *
41
+ * SECURITY NOTE: MMKV stores files in the app's document directory, which is app-scoped.
42
+ * Two different apps will NOT share data because each app has its own isolated document directory.
43
+ *
44
+ * This is for non-sensitive data persistence (wallet metadata, balances, addresses).
45
+ * For sensitive data (encrypted seeds, keys), use SecureStorage from wdk-react-native-secure-storage.
46
+ *
47
+ * The encryption key is derived from a device/app identifier to ensure each app instance
48
+ * has a unique encryption key. If no account identifier is provided, a default app-scoped
49
+ * identifier is used.
50
+ *
51
+ * @param accountIdentifier - Optional account identifier for per-account encryption keys.
52
+ * If not provided, uses a default app-scoped identifier.
53
+ * @returns Promise that resolves to MMKV storage instance
54
+ */
55
+ export async function createMMKVStorage(accountIdentifier) {
56
+ // Use account identifier if provided, otherwise use a default app-scoped identifier
57
+ // This ensures each app instance has a unique key while allowing per-account keys
58
+ const identifier = accountIdentifier || 'wdk-app-default';
59
+ // Check cache first
60
+ const cachedStorage = storageCache.get(identifier);
61
+ if (cachedStorage !== undefined) {
62
+ // Update access time for LRU tracking
63
+ storageAccessCounter++;
64
+ storageAccessOrder.set(identifier, storageAccessCounter);
65
+ return cachedStorage;
66
+ }
67
+ // Evict LRU storage if cache is full
68
+ evictLRUStorage();
69
+ // Derive encryption key asynchronously
70
+ const encryptionKey = await getMMKVKey(identifier);
71
+ const storage = createMMKV({
72
+ id: 'wallet-storage',
73
+ encryptionKey,
74
+ });
75
+ // Cache the storage instance
76
+ storageAccessCounter++;
77
+ storageCache.set(identifier, storage);
78
+ storageAccessOrder.set(identifier, storageAccessCounter);
79
+ return storage;
80
+ }
81
+ /**
82
+ * Maximum number of storage adapters to cache before evicting least recently used
83
+ * This prevents unbounded memory growth while maintaining performance
84
+ */
85
+ const MAX_ADAPTER_CACHE_SIZE = 10;
86
+ /**
87
+ * Storage adapter cache - stores initialized adapters by identifier
88
+ * Uses LRU (Least Recently Used) eviction policy to limit memory usage
89
+ */
90
+ const adapterCache = new Map();
91
+ const adapterAccessOrder = new Map();
92
+ let adapterAccessCounter = 0;
93
+ /**
94
+ * Evict least recently used adapter from cache when limit is reached
95
+ */
96
+ function evictLRUAdapter() {
97
+ if (adapterCache.size < MAX_ADAPTER_CACHE_SIZE) {
98
+ return;
99
+ }
100
+ // Find the least recently used adapter
101
+ let oldestKey = null;
102
+ let oldestAccess = Infinity;
103
+ for (const [key, accessTime] of adapterAccessOrder.entries()) {
104
+ if (accessTime < oldestAccess) {
105
+ oldestAccess = accessTime;
106
+ oldestKey = key;
107
+ }
108
+ }
109
+ // Remove the least recently used adapter
110
+ if (oldestKey !== null) {
111
+ adapterCache.delete(oldestKey);
112
+ adapterAccessOrder.delete(oldestKey);
113
+ }
114
+ }
115
+ /**
116
+ * Storage initialization state
117
+ */
118
+ var StorageInitState;
119
+ (function (StorageInitState) {
120
+ StorageInitState["NOT_STARTED"] = "NOT_STARTED";
121
+ StorageInitState["INITIALIZING"] = "INITIALIZING";
122
+ StorageInitState["READY"] = "READY";
123
+ StorageInitState["ERROR"] = "ERROR";
124
+ })(StorageInitState || (StorageInitState = {}));
125
+ /**
126
+ * Storage adapter factory for Zustand persistence
127
+ * This allows Zustand stores to use MMKV for persistence
128
+ *
129
+ * Uses lazy async initialization with synchronous API.
130
+ * Storage is initialized asynchronously when first accessed, then cached.
131
+ * Operations are queued during initialization to prevent race conditions.
132
+ *
133
+ * IMPORTANT: The synchronous API (getItem) may return null during initialization.
134
+ * This is expected behavior - Zustand will handle missing data gracefully on first load.
135
+ * Subsequent operations will be queued and processed once storage is ready.
136
+ *
137
+ * @param accountIdentifier - Optional account identifier for per-account encryption keys.
138
+ * If not provided, uses a default app-scoped identifier.
139
+ * @returns StorageAdapter with lazy async initialization
140
+ */
141
+ export function createMMKVStorageAdapter(accountIdentifier) {
142
+ const identifier = accountIdentifier || 'wdk-app-default';
143
+ // Return cached adapter if available
144
+ const cachedAdapter = adapterCache.get(identifier);
145
+ if (cachedAdapter !== undefined) {
146
+ // Update access time for LRU tracking
147
+ adapterAccessCounter++;
148
+ adapterAccessOrder.set(identifier, adapterAccessCounter);
149
+ return cachedAdapter;
150
+ }
151
+ // Evict LRU adapter if cache is full
152
+ evictLRUAdapter();
153
+ let storageInstance = null;
154
+ let storagePromise = null;
155
+ let initState = StorageInitState.NOT_STARTED;
156
+ let initError = null;
157
+ const pendingOperations = [];
158
+ // Process queued operations after storage is ready
159
+ const processPendingOperations = (storage) => {
160
+ // Process all pending operations in order
161
+ const operations = [...pendingOperations];
162
+ pendingOperations.length = 0; // Clear the array
163
+ for (const op of operations) {
164
+ try {
165
+ switch (op.type) {
166
+ case 'get':
167
+ const value = storage.getString(op.key);
168
+ op.resolve(value ?? null);
169
+ break;
170
+ case 'set':
171
+ if (op.value !== undefined) {
172
+ storage.set(op.key, op.value);
173
+ op.resolve(null);
174
+ }
175
+ break;
176
+ case 'remove':
177
+ ;
178
+ storage.delete(op.key);
179
+ op.resolve(null);
180
+ break;
181
+ }
182
+ }
183
+ catch (error) {
184
+ op.reject(error instanceof Error ? error : new Error(String(error)));
185
+ }
186
+ }
187
+ };
188
+ // Initialize storage asynchronously
189
+ const ensureStorage = async () => {
190
+ // Return immediately if already ready
191
+ if (storageInstance && initState === StorageInitState.READY) {
192
+ return storageInstance;
193
+ }
194
+ // Return existing promise if initializing
195
+ if (storagePromise && initState === StorageInitState.INITIALIZING) {
196
+ return storagePromise;
197
+ }
198
+ // If we're in error state, throw the error
199
+ if (initState === StorageInitState.ERROR && initError) {
200
+ throw initError;
201
+ }
202
+ // Start initialization
203
+ if (initState === StorageInitState.NOT_STARTED) {
204
+ initState = StorageInitState.INITIALIZING;
205
+ initError = null;
206
+ storagePromise = createMMKVStorage(identifier)
207
+ .then((storage) => {
208
+ storageInstance = storage;
209
+ initState = StorageInitState.READY;
210
+ initError = null;
211
+ // Process all pending operations
212
+ processPendingOperations(storage);
213
+ return storage;
214
+ })
215
+ .catch((error) => {
216
+ const err = error instanceof Error ? error : new Error(String(error));
217
+ initState = StorageInitState.ERROR;
218
+ initError = err;
219
+ storagePromise = null;
220
+ // Reject all pending operations
221
+ const operations = [...pendingOperations];
222
+ pendingOperations.length = 0;
223
+ for (const op of operations) {
224
+ op.reject(err);
225
+ }
226
+ throw err;
227
+ });
228
+ }
229
+ // At this point, storagePromise should be set
230
+ if (!storagePromise) {
231
+ const err = new Error('Failed to initialize storage: promise not created');
232
+ initState = StorageInitState.ERROR;
233
+ initError = err;
234
+ throw err;
235
+ }
236
+ return storagePromise;
237
+ };
238
+ // Start initialization immediately in the background
239
+ // This helps reduce the window where operations need to be queued
240
+ ensureStorage().catch((error) => {
241
+ // Error is stored in initError and will be thrown on next access
242
+ // This prevents unhandled promise rejections
243
+ });
244
+ const adapter = {
245
+ getItem: (name) => {
246
+ // If storage is ready, read directly
247
+ if (storageInstance && initState === StorageInitState.READY) {
248
+ try {
249
+ const value = storageInstance.getString(name);
250
+ return value ?? null;
251
+ }
252
+ catch (error) {
253
+ // If read fails, return null (Zustand will handle gracefully)
254
+ return null;
255
+ }
256
+ }
257
+ // If we're in error state, return null (Zustand will handle gracefully)
258
+ // The error will be thrown on next write operation
259
+ if (initState === StorageInitState.ERROR) {
260
+ return null;
261
+ }
262
+ // LIMITATION: During initialization, we cannot return values synchronously
263
+ // because storage initialization is async. Zustand's StorageAdapter interface
264
+ // requires synchronous getItem, so we must return null during initialization.
265
+ //
266
+ // This is expected behavior:
267
+ // - On first load during initialization: returns null, Zustand uses default state
268
+ // - After initialization: subsequent getItem calls will work correctly
269
+ // - Zustand handles null gracefully and will rehydrate on next read after init
270
+ //
271
+ // We don't queue get operations because we can't fulfill them synchronously.
272
+ // Instead, we ensure storage is initializing and return null immediately.
273
+ ensureStorage().catch(() => {
274
+ // Errors are handled in ensureStorage and stored in initError
275
+ });
276
+ // Return null during initialization - Zustand handles this gracefully
277
+ // The actual value will be available on next read after initialization completes
278
+ return null;
279
+ },
280
+ setItem: (name, value) => {
281
+ // If storage is ready, write directly
282
+ if (storageInstance && initState === StorageInitState.READY) {
283
+ try {
284
+ storageInstance.set(name, value);
285
+ return;
286
+ }
287
+ catch (error) {
288
+ // If write fails, queue it to retry later
289
+ // This handles edge cases where storage becomes unavailable
290
+ }
291
+ }
292
+ // Queue the write operation
293
+ pendingOperations.push({
294
+ type: 'set',
295
+ key: name,
296
+ value,
297
+ resolve: () => {
298
+ // Operation completed successfully
299
+ },
300
+ reject: (error) => {
301
+ // Log error but don't throw - this is non-critical data
302
+ // In production, you might want to log this to error tracking
303
+ logWarn('[MMKVStorageAdapter] Failed to set item:', name, error);
304
+ },
305
+ });
306
+ // Ensure storage is initializing
307
+ ensureStorage().catch((error) => {
308
+ // Error is stored and will be thrown when processing pending operations
309
+ // This ensures queued operations fail appropriately
310
+ });
311
+ },
312
+ removeItem: (name) => {
313
+ // If storage is ready, delete directly
314
+ if (storageInstance && initState === StorageInitState.READY) {
315
+ try {
316
+ ;
317
+ storageInstance.delete(name);
318
+ return;
319
+ }
320
+ catch (error) {
321
+ // If delete fails, queue it to retry later
322
+ }
323
+ }
324
+ // Queue the delete operation
325
+ pendingOperations.push({
326
+ type: 'remove',
327
+ key: name,
328
+ resolve: () => {
329
+ // Operation completed successfully
330
+ },
331
+ reject: (error) => {
332
+ // Log error but don't throw - this is non-critical data
333
+ logWarn('[MMKVStorageAdapter] Failed to remove item:', name, error);
334
+ },
335
+ });
336
+ // Ensure storage is initializing
337
+ ensureStorage().catch((error) => {
338
+ // Error is stored and will be thrown when processing pending operations
339
+ });
340
+ },
341
+ };
342
+ // Cache the adapter
343
+ adapterAccessCounter++;
344
+ adapterCache.set(identifier, adapter);
345
+ adapterAccessOrder.set(identifier, adapterAccessCounter);
346
+ return adapter;
347
+ }
348
+ //# sourceMappingURL=mmkvStorage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mmkvStorage.js","sourceRoot":"","sources":["../../src/storage/mmkvStorage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,130 @@
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
+ import { create } from 'zustand';
48
+ import type { WalletAddressesByWallet, WalletBalancesByWallet, BalanceLoadingStates } from '../types';
49
+ export interface WalletLoadingStates {
50
+ [key: string]: boolean;
51
+ }
52
+ export interface AccountInfo {
53
+ /** Account index (0-based) */
54
+ accountIndex: number;
55
+ /** Account address for each network */
56
+ addresses: Record<string, string>;
57
+ }
58
+ export interface WalletInfo {
59
+ /** Wallet identifier (e.g., user email) */
60
+ identifier: string;
61
+ /** Whether wallet exists in secure storage */
62
+ exists: boolean;
63
+ /** Whether this wallet is currently active/initialized */
64
+ isActive: boolean;
65
+ }
66
+ /**
67
+ * Wallet loading state - tracks the lifecycle of loading a specific wallet
68
+ * This is the single source of truth for wallet loading state
69
+ */
70
+ export type WalletLoadingState = {
71
+ type: 'not_loaded';
72
+ } | {
73
+ type: 'checking';
74
+ identifier: string;
75
+ } | {
76
+ type: 'loading';
77
+ identifier: string;
78
+ walletExists: boolean;
79
+ } | {
80
+ type: 'ready';
81
+ identifier: string;
82
+ } | {
83
+ type: 'error';
84
+ identifier: string | null;
85
+ error: Error;
86
+ };
87
+ export interface WalletState {
88
+ addresses: WalletAddressesByWallet;
89
+ walletLoading: Record<string, WalletLoadingStates>;
90
+ balances: WalletBalancesByWallet;
91
+ balanceLoading: Record<string, BalanceLoadingStates>;
92
+ lastBalanceUpdate: Record<string, Record<string, Record<number, number>>>;
93
+ accountList: Record<string, AccountInfo[]>;
94
+ walletList: WalletInfo[];
95
+ activeWalletId: string | null;
96
+ walletLoadingState: WalletLoadingState;
97
+ isOperationInProgress: boolean;
98
+ currentOperation: string | null;
99
+ }
100
+ export type WalletStore = WalletState;
101
+ type WalletStoreInstance = ReturnType<ReturnType<typeof create<WalletStore>>>;
102
+ /**
103
+ * Creates singleton wallet store instance.
104
+ * All operations are handled by focused services (AddressService, BalanceService), not the store itself.
105
+ */
106
+ export declare function createWalletStore(): WalletStoreInstance;
107
+ export declare function getWalletStore(): import("zustand").UseBoundStore<import("zustand").StoreApi<WalletState>>;
108
+ /**
109
+ * Update wallet loading state with validation
110
+ * Throws error if transition is invalid
111
+ * Logs state transitions for debugging
112
+ */
113
+ export declare function updateWalletLoadingState(state: WalletState, newState: WalletLoadingState): Partial<WalletState>;
114
+ /**
115
+ * Get wallet identifier from loading state
116
+ */
117
+ export declare function getWalletIdFromLoadingState(state: WalletLoadingState): string | null;
118
+ /**
119
+ * Check if wallet is in a loading state
120
+ */
121
+ export declare function isWalletLoadingState(state: WalletLoadingState): boolean;
122
+ /**
123
+ * Check if wallet is ready
124
+ */
125
+ export declare function isWalletReadyState(state: WalletLoadingState): boolean;
126
+ /**
127
+ * Check if wallet is in error state
128
+ */
129
+ export declare function isWalletErrorState(state: WalletLoadingState): boolean;
130
+ export {};