5
5
* LICENSE file in the root directory of this source tree.
6
6
*
7
7
* @format
8
- * @noflow
9
- * @flow -weak
8
+ * @flow
10
9
* @jsdoc
11
10
*/
12
11
@@ -21,6 +20,21 @@ const RCTAsyncStorage =
21
20
NativeModules . RNC_AsyncSQLiteDBStorage ||
22
21
NativeModules . AsyncLocalStorage ;
23
22
23
+ type ReadOnlyArrayString = $ReadOnlyArray < string > ;
24
+
25
+ type MultiGetCallbackFunction = (
26
+ errors : ?$ReadOnlyArray < Error > ,
27
+ result : ?$ReadOnlyArray < ReadOnlyArrayString > ,
28
+ ) => void ;
29
+
30
+ type MultiRequest = { |
31
+ keys : $ReadOnlyArray < string > ,
32
+ callback : ?MultiGetCallbackFunction ,
33
+ keyIndex : number ,
34
+ resolve : ?( result ?: Promise < ?$ReadOnlyArray < ReadOnlyArrayString >> ) => void ,
35
+ reject : ?( error ? : any ) => void ,
36
+ | } ;
37
+
24
38
/**
25
39
* `AsyncStorage` is a simple, unencrypted, asynchronous, persistent, key-value
26
40
* storage system that is global to the app. It should be used instead of
@@ -29,7 +43,7 @@ const RCTAsyncStorage =
29
43
* See http://facebook.github.io/react-native/docs/asyncstorage.html
30
44
*/
31
45
const AsyncStorage = {
32
- _getRequests : ( [ ] : Array < any > ) ,
46
+ _getRequests : ( [ ] : Array < MultiRequest > ) ,
33
47
_getKeys : ( [ ] : Array < string > ) ,
34
48
_immediate : ( null : ?number ) ,
35
49
@@ -40,8 +54,8 @@ const AsyncStorage = {
40
54
*/
41
55
getItem : function (
42
56
key : string ,
43
- callback ?: ?( error : ?Error , result : ? string ) => void ,
44
- ) : Promise {
57
+ callback ?: ?( error : ?Error , result : string | null ) => void ,
58
+ ) : Promise < string | null > {
45
59
return new Promise ( ( resolve , reject ) => {
46
60
RCTAsyncStorage . multiGet ( [ key ] , function ( errors , result ) {
47
61
// Unpack result to get value from [[key,value]]
@@ -66,7 +80,7 @@ const AsyncStorage = {
66
80
key : string ,
67
81
value : string ,
68
82
callback ?: ?( error : ?Error ) => void ,
69
- ) : Promise {
83
+ ) : Promise < null > {
70
84
return new Promise ( ( resolve , reject ) => {
71
85
RCTAsyncStorage . multiSet ( [ [ key , value ] ] , function ( errors ) {
72
86
const errs = convertErrors ( errors ) ;
@@ -88,7 +102,7 @@ const AsyncStorage = {
88
102
removeItem : function (
89
103
key : string ,
90
104
callback ?: ?( error : ?Error ) => void ,
91
- ) : Promise {
105
+ ) : Promise < null > {
92
106
return new Promise ( ( resolve , reject ) => {
93
107
RCTAsyncStorage . multiRemove ( [ key ] , function ( errors ) {
94
108
const errs = convertErrors ( errors ) ;
@@ -114,7 +128,7 @@ const AsyncStorage = {
114
128
key : string ,
115
129
value : string ,
116
130
callback ?: ?( error : ?Error ) => void ,
117
- ) : Promise {
131
+ ) : Promise < null > {
118
132
return new Promise ( ( resolve , reject ) => {
119
133
RCTAsyncStorage . multiMerge ( [ [ key , value ] ] , function ( errors ) {
120
134
const errs = convertErrors ( errors ) ;
@@ -135,12 +149,13 @@ const AsyncStorage = {
135
149
*
136
150
* See http://facebook.github.io/react-native/docs/asyncstorage.html#clear
137
151
*/
138
- clear : function ( callback ?: ?( error : ?Error ) => void ) : Promise {
152
+ clear : function ( callback ?: ?( error : ?Error ) => void ) : Promise < null > {
139
153
return new Promise ( ( resolve , reject ) => {
140
154
RCTAsyncStorage . clear ( function ( error ) {
141
- callback && callback ( convertError ( error ) ) ;
142
- if ( error && convertError ( error ) ) {
143
- reject ( convertError ( error ) ) ;
155
+ const err = convertError ( error ) ;
156
+ callback && callback ( err ) ;
157
+ if ( err ) {
158
+ reject ( err ) ;
144
159
} else {
145
160
resolve ( null ) ;
146
161
}
@@ -154,13 +169,14 @@ const AsyncStorage = {
154
169
* See http://facebook.github.io/react-native/docs/asyncstorage.html#getallkeys
155
170
*/
156
171
getAllKeys : function (
157
- callback ?: ?( error : ?Error , keys : ?Array < string > ) => void ,
158
- ) : Promise {
172
+ callback ?: ?( error : ?Error , keys : ?ReadOnlyArrayString ) => void ,
173
+ ) : Promise < ReadOnlyArrayString > {
159
174
return new Promise ( ( resolve , reject ) => {
160
175
RCTAsyncStorage . getAllKeys ( function ( error , keys ) {
161
- callback && callback ( convertError ( error ) , keys ) ;
162
- if ( error ) {
163
- reject ( convertError ( error ) ) ;
176
+ const err = convertError ( error ) ;
177
+ callback && callback ( err , keys ) ;
178
+ if ( err ) {
179
+ reject ( err ) ;
164
180
} else {
165
181
resolve ( keys ) ;
166
182
}
@@ -223,16 +239,16 @@ const AsyncStorage = {
223
239
*/
224
240
multiGet : function (
225
241
keys : Array < string > ,
226
- callback ?: ?( errors : ? Array < Error > , result : ? Array < Array < string >> ) => void ,
227
- ) : Promise {
242
+ callback ?: ?MultiGetCallbackFunction ,
243
+ ) : Promise < ? $ReadOnlyArray < ReadOnlyArrayString >> {
228
244
if ( ! this . _immediate ) {
229
245
this . _immediate = setImmediate ( ( ) => {
230
246
this . _immediate = null ;
231
247
this . flushGetRequests ( ) ;
232
248
} ) ;
233
249
}
234
250
235
- const getRequest = {
251
+ const getRequest : MultiRequest = {
236
252
keys : keys ,
237
253
callback : callback ,
238
254
// do we need this?
@@ -265,8 +281,8 @@ const AsyncStorage = {
265
281
*/
266
282
multiSet : function (
267
283
keyValuePairs : Array < Array < string >> ,
268
- callback ?: ?( errors : ?Array < Error > ) => void ,
269
- ) : Promise {
284
+ callback ?: ?( errors : ?$ReadOnlyArray < ? Error > ) => void ,
285
+ ) : Promise < null > {
270
286
return new Promise ( ( resolve , reject ) => {
271
287
RCTAsyncStorage . multiSet ( keyValuePairs , function ( errors ) {
272
288
const error = convertErrors ( errors ) ;
@@ -287,8 +303,8 @@ const AsyncStorage = {
287
303
*/
288
304
multiRemove : function (
289
305
keys : Array < string > ,
290
- callback ?: ?( errors : ?Array < Error > ) => void ,
291
- ) : Promise {
306
+ callback ?: ?( errors : ?$ReadOnlyArray < ? Error > ) => void ,
307
+ ) : Promise < null > {
292
308
return new Promise ( ( resolve , reject ) => {
293
309
RCTAsyncStorage . multiRemove ( keys , function ( errors ) {
294
310
const error = convertErrors ( errors ) ;
@@ -312,8 +328,8 @@ const AsyncStorage = {
312
328
*/
313
329
multiMerge : function (
314
330
keyValuePairs : Array < Array < string >> ,
315
- callback ?: ?( errors : ?Array < Error > ) => void ,
316
- ) : Promise {
331
+ callback ?: ?( errors : ?$ReadOnlyArray < ? Error > ) => void ,
332
+ ) : Promise < null > {
317
333
return new Promise ( ( resolve , reject ) => {
318
334
RCTAsyncStorage . multiMerge ( keyValuePairs , function ( errors ) {
319
335
const error = convertErrors ( errors ) ;
@@ -334,19 +350,20 @@ if (!RCTAsyncStorage.multiMerge) {
334
350
delete AsyncStorage . multiMerge ;
335
351
}
336
352
337
- function convertErrors ( errs ) {
353
+ function convertErrors ( errs ) : ? $ReadOnlyArray < ? Error > {
338
354
if ( ! errs ) {
339
355
return null ;
340
356
}
341
357
return ( Array . isArray ( errs ) ? errs : [ errs ] ) . map ( e => convertError ( e ) ) ;
342
358
}
343
359
344
- function convertError ( error ) {
360
+ function convertError ( error ) : ? Error {
345
361
if ( ! error ) {
346
362
return null ;
347
363
}
348
364
const out = new Error ( error . message ) ;
349
- out . key = error . key ; // flow doesn't like this :(
365
+ // $FlowFixMe: adding custom properties to error.
366
+ out . key = error . key ;
350
367
return out ;
351
368
}
352
369
0 commit comments