@@ -12,6 +12,7 @@ import {
12
12
} from "./utils/migrations/constants" ;
13
13
import { track } from "~/analytics" ;
14
14
import type { Feature_LlmMmkvMigration } from "@ledgerhq/types-live" ;
15
+ import { trackStorageOperation } from "./utils/performance" ;
15
16
16
17
/** Singleton reference to the global application storage object. */
17
18
export default createStorage ( ) ;
@@ -35,145 +36,185 @@ export function createStorage(init: StorageInitializer = initStorageState): Stor
35
36
36
37
incrementNumberOfErrorsDebug,
37
38
38
- keys ( ) {
39
+ async keys ( ) {
39
40
try {
40
41
return state . storageType === STORAGE_TYPE . MMKV
41
- ? Promise . resolve ( mmkvStorageWrapper . keys ( ) )
42
- : asyncStorageWrapper . keys ( ) ;
42
+ ? await trackStorageOperation ( "keys" , STORAGE_TYPE . MMKV , "all" , ( ) =>
43
+ Promise . resolve ( mmkvStorageWrapper . keys ( ) ) ,
44
+ )
45
+ : await trackStorageOperation ( "keys" , STORAGE_TYPE . ASYNC_STORAGE , "all" , ( ) =>
46
+ asyncStorageWrapper . keys ( ) ,
47
+ ) ;
43
48
} catch ( e ) {
44
49
console . error ( "Error getting keys from storage" , {
45
50
error : e ,
46
51
state : state ,
47
52
} ) ;
48
- return rejectWithError ( e ) ;
53
+ return rejectWithError ( { e , extraData : { op : "keys" } } ) ;
49
54
}
50
55
} ,
51
56
52
57
async get ( key ) {
53
58
try {
54
59
return state . storageType === STORAGE_TYPE . MMKV
55
- ? Promise . resolve ( mmkvStorageWrapper . get ( key ) )
56
- : asyncStorageWrapper . get ( key ) ;
60
+ ? await trackStorageOperation ( "get" , STORAGE_TYPE . MMKV , key , ( ) =>
61
+ Promise . resolve ( mmkvStorageWrapper . get ( key ) ) ,
62
+ )
63
+ : await trackStorageOperation ( "get" , STORAGE_TYPE . ASYNC_STORAGE , key , ( ) =>
64
+ asyncStorageWrapper . get ( key ) ,
65
+ ) ;
57
66
} catch ( e ) {
58
67
console . error ( "Error getting key from storage" , {
59
68
error : e ,
60
69
state : state ,
61
70
} ) ;
62
71
await incrementNumberOfErrors ( state , e ) ;
63
- return rejectWithError ( e ) ;
72
+ return rejectWithError ( { e , extraData : { op : "get" , key } } ) ;
64
73
}
65
74
} ,
66
75
67
76
async getString ( key ) {
68
77
try {
69
78
return state . storageType === STORAGE_TYPE . MMKV
70
- ? Promise . resolve ( mmkvStorageWrapper . getString ( key ) )
71
- : asyncStorageWrapper . getString ( key ) ;
79
+ ? await trackStorageOperation ( "getString" , STORAGE_TYPE . MMKV , key , ( ) =>
80
+ Promise . resolve ( mmkvStorageWrapper . getString ( key ) ) ,
81
+ )
82
+ : await trackStorageOperation ( "getString" , STORAGE_TYPE . ASYNC_STORAGE , key , ( ) =>
83
+ asyncStorageWrapper . getString ( key ) ,
84
+ ) ;
72
85
} catch ( e ) {
73
86
console . error ( "Error getting key from storage" , {
74
87
error : e ,
75
88
state : state ,
76
89
} ) ;
77
90
await incrementNumberOfErrors ( state , e ) ;
78
- return rejectWithError ( e ) ;
91
+ return rejectWithError ( { e , extraData : { op : "getString" , key } } ) ;
79
92
}
80
93
} ,
81
94
82
- save ( key , value ) {
95
+ async save ( key , value ) {
83
96
try {
84
97
return state . storageType === STORAGE_TYPE . MMKV
85
- ? Promise . resolve ( mmkvStorageWrapper . save ( key , value ) )
86
- : asyncStorageWrapper . save ( key , value ) ;
98
+ ? await trackStorageOperation ( "save" , STORAGE_TYPE . MMKV , key as string , ( ) =>
99
+ Promise . resolve ( mmkvStorageWrapper . save ( key , value ) ) ,
100
+ )
101
+ : await trackStorageOperation ( "save" , STORAGE_TYPE . ASYNC_STORAGE , key as string , ( ) =>
102
+ asyncStorageWrapper . save ( key , value ) ,
103
+ ) ;
87
104
} catch ( e ) {
88
105
console . error ( "Error saving key to storage" , {
89
106
error : e ,
90
107
state : state ,
91
108
} ) ;
92
- return rejectWithError ( e ) ;
109
+ return rejectWithError ( { e , extraData : { op : "save" , key , value } } ) ;
93
110
}
94
111
} ,
95
112
96
- saveString ( key , value ) {
113
+ async saveString ( key , value ) {
97
114
try {
98
115
return state . storageType === STORAGE_TYPE . MMKV
99
- ? Promise . resolve ( mmkvStorageWrapper . saveString ( key , value ) )
100
- : asyncStorageWrapper . saveString ( key , value ) ;
116
+ ? await trackStorageOperation ( "saveString" , STORAGE_TYPE . MMKV , key , ( ) =>
117
+ Promise . resolve ( mmkvStorageWrapper . saveString ( key , value ) ) ,
118
+ )
119
+ : await trackStorageOperation ( "saveString" , STORAGE_TYPE . ASYNC_STORAGE , key , ( ) =>
120
+ asyncStorageWrapper . saveString ( key , value ) ,
121
+ ) ;
101
122
} catch ( e ) {
102
123
console . error ( "Error saving key to storage" , {
103
124
error : e ,
104
125
state : state ,
105
126
} ) ;
106
- return rejectWithError ( e ) ;
127
+ return rejectWithError ( { e , extraData : { op : "saveString" , key } } ) ;
107
128
}
108
129
} ,
109
130
110
- update ( key , value ) {
131
+ async update ( key , value ) {
111
132
try {
112
133
return state . storageType === STORAGE_TYPE . MMKV
113
- ? Promise . resolve ( mmkvStorageWrapper . update ( key , value ) )
114
- : asyncStorageWrapper . update ( key , value ) ;
134
+ ? await trackStorageOperation ( "update" , STORAGE_TYPE . MMKV , key , ( ) =>
135
+ Promise . resolve ( mmkvStorageWrapper . update ( key , value ) ) ,
136
+ )
137
+ : await trackStorageOperation ( "update" , STORAGE_TYPE . ASYNC_STORAGE , key , ( ) =>
138
+ asyncStorageWrapper . update ( key , value ) ,
139
+ ) ;
115
140
} catch ( e ) {
116
141
console . error ( "Error updating key in storage" , {
117
142
error : e ,
118
143
state : state ,
119
144
} ) ;
120
- return rejectWithError ( e ) ;
145
+ return rejectWithError ( { e , extraData : { op : "update" , key } } ) ;
121
146
}
122
147
} ,
123
148
124
149
async delete ( key ) {
125
150
try {
126
151
return state . storageType === STORAGE_TYPE . MMKV
127
- ? await mmkvStorageWrapper . delete ( key )
128
- : await asyncStorageWrapper . delete ( key ) ;
152
+ ? await trackStorageOperation ( "delete" , STORAGE_TYPE . MMKV , key , ( ) =>
153
+ mmkvStorageWrapper . delete ( key ) ,
154
+ )
155
+ : await trackStorageOperation ( "delete" , STORAGE_TYPE . ASYNC_STORAGE , key , ( ) =>
156
+ asyncStorageWrapper . delete ( key ) ,
157
+ ) ;
129
158
} catch ( e ) {
130
159
console . error ( "Error deleting key from storage" , {
131
160
error : e ,
132
161
state : state ,
133
162
} ) ;
134
- return rejectWithError ( e ) ;
163
+ return rejectWithError ( { e , extraData : { op : "delete" , key } } ) ;
135
164
}
136
165
} ,
137
166
138
167
async deleteAll ( ) {
139
168
try {
140
169
return state . storageType === STORAGE_TYPE . MMKV
141
- ? await mmkvStorageWrapper . deleteAll ( )
142
- : await asyncStorageWrapper . deleteAll ( ) ;
170
+ ? await trackStorageOperation ( "deleteAll" , STORAGE_TYPE . MMKV , "all" , ( ) =>
171
+ mmkvStorageWrapper . deleteAll ( ) ,
172
+ )
173
+ : await trackStorageOperation ( "deleteAll" , STORAGE_TYPE . ASYNC_STORAGE , "all" , ( ) =>
174
+ asyncStorageWrapper . deleteAll ( ) ,
175
+ ) ;
143
176
} catch ( e ) {
144
177
console . error ( "Error deleting all keys from storage" , {
145
178
error : e ,
146
179
state : state ,
147
180
} ) ;
148
- return rejectWithError ( e ) ;
181
+ return rejectWithError ( { e , extraData : { op : "deleteAll" } } ) ;
149
182
}
150
183
} ,
151
184
152
- push ( key , value ) {
185
+ async push ( key , value ) {
153
186
try {
154
187
return state . storageType === STORAGE_TYPE . MMKV
155
- ? Promise . resolve ( mmkvStorageWrapper . push ( key , value ) )
156
- : asyncStorageWrapper . push ( key , value ) ;
188
+ ? await trackStorageOperation ( "push" , STORAGE_TYPE . MMKV , key , ( ) =>
189
+ Promise . resolve ( mmkvStorageWrapper . push ( key , value ) ) ,
190
+ )
191
+ : await trackStorageOperation ( "push" , STORAGE_TYPE . ASYNC_STORAGE , key , ( ) =>
192
+ asyncStorageWrapper . push ( key , value ) ,
193
+ ) ;
157
194
} catch ( e ) {
158
195
console . error ( "Error pushing value to storage" , {
159
196
error : e ,
160
197
state : state ,
161
198
} ) ;
162
- return rejectWithError ( e ) ;
199
+ return rejectWithError ( { e , extraData : { op : "push" , key , value } } ) ;
163
200
}
164
201
} ,
165
202
166
- stringify ( ) {
203
+ async stringify ( ) {
167
204
try {
168
205
return state . storageType === STORAGE_TYPE . MMKV
169
- ? Promise . resolve ( mmkvStorageWrapper . stringify ( ) )
170
- : asyncStorageWrapper . stringify ( ) ;
206
+ ? await trackStorageOperation ( "stringify" , STORAGE_TYPE . MMKV , "all" , ( ) =>
207
+ Promise . resolve ( mmkvStorageWrapper . stringify ( ) ) ,
208
+ )
209
+ : await trackStorageOperation ( "stringify" , STORAGE_TYPE . ASYNC_STORAGE , "all" , ( ) =>
210
+ asyncStorageWrapper . stringify ( ) ,
211
+ ) ;
171
212
} catch ( e ) {
172
- console . error ( "Error pushing value to storage" , {
213
+ console . error ( "Error stringifying storage" , {
173
214
error : e ,
174
215
state : state ,
175
216
} ) ;
176
- return rejectWithError ( e ) ;
217
+ return rejectWithError ( { e , extraData : { op : "stringify" } } ) ;
177
218
}
178
219
} ,
179
220
@@ -185,7 +226,7 @@ export function createStorage(init: StorageInitializer = initStorageState): Stor
185
226
error : e ,
186
227
state : state ,
187
228
} ) ;
188
- return rejectWithError ( e ) ;
229
+ return rejectWithError ( { e , extraData : { op : "migrate" } } ) ;
189
230
}
190
231
} ,
191
232
@@ -197,7 +238,7 @@ export function createStorage(init: StorageInitializer = initStorageState): Stor
197
238
error : e ,
198
239
state : state ,
199
240
} ) ;
200
- return rejectWithError ( e ) ;
241
+ return rejectWithError ( { e , extraData : { op : "resetMigration" } } ) ;
201
242
}
202
243
} ,
203
244
@@ -209,7 +250,7 @@ export function createStorage(init: StorageInitializer = initStorageState): Stor
209
250
error : e ,
210
251
state : state ,
211
252
} ) ;
212
- return rejectWithError ( e ) ;
253
+ return rejectWithError ( { e , extraData : { op : "rollbackMigration" } } ) ;
213
254
}
214
255
} ,
215
256
@@ -221,7 +262,7 @@ export function createStorage(init: StorageInitializer = initStorageState): Stor
221
262
error : e ,
222
263
state : state ,
223
264
} ) ;
224
- return rejectWithError ( e ) ;
265
+ return rejectWithError ( { e , extraData : { op : "handleMigration" , featureFlag } } ) ;
225
266
}
226
267
} ,
227
268
} satisfies Storage ;
0 commit comments