@@ -32,19 +32,18 @@ class LegacyAsyncStorageImpl implements AsyncStorage {
32
32
33
33
getItem = async ( key : string ) : Promise < string | null > => {
34
34
try {
35
- return await new Promise ( ( resolve , reject ) => {
35
+ return await new Promise < string | null > ( ( resolve , reject ) => {
36
36
this . db . multiGet ( [ key ] , ( errors , result ) => {
37
- if ( errors ?. length ) {
38
- const error = errors [ 0 ] ! ;
39
- reject (
37
+ const error = this . getError ( errors ) ;
38
+ if ( error ) {
39
+ return reject (
40
40
AsyncStorageError . jsError (
41
41
error . message ,
42
42
AsyncStorageError . Type . OtherStorageError
43
43
)
44
44
) ;
45
- } else {
46
- resolve ( result ?. [ 0 ] ?. [ 1 ] ?? null ) ;
47
45
}
46
+ resolve ( result ?. [ 0 ] ?. [ 1 ] ?? null ) ;
48
47
} ) ;
49
48
} ) ;
50
49
} catch ( e ) {
@@ -54,59 +53,181 @@ class LegacyAsyncStorageImpl implements AsyncStorage {
54
53
55
54
setItem = async ( key : string , value : string ) : Promise < void > => {
56
55
try {
57
- throw new Error ( "todo" ) ;
56
+ await new Promise < void > ( ( resolve , reject ) => {
57
+ this . db . multiSet ( [ [ key , value ] ] , ( errors ) => {
58
+ const error = this . getError ( errors ) ;
59
+ if ( error ) {
60
+ return reject (
61
+ AsyncStorageError . jsError (
62
+ error . message ,
63
+ AsyncStorageError . Type . OtherStorageError
64
+ )
65
+ ) ;
66
+ }
67
+ resolve ( ) ;
68
+ } ) ;
69
+ } ) ;
58
70
} catch ( e ) {
59
71
throw AsyncStorageError . nativeError ( e ) ;
60
72
}
61
73
} ;
62
74
63
75
removeItem = async ( key : string ) : Promise < void > => {
64
76
try {
65
- throw new Error ( "todo" ) ;
77
+ await new Promise < void > ( ( resolve , reject ) => {
78
+ this . db . multiRemove ( [ key ] , ( errors ) => {
79
+ const error = this . getError ( errors ) ;
80
+ if ( error ) {
81
+ return reject (
82
+ AsyncStorageError . jsError (
83
+ error . message ,
84
+ AsyncStorageError . Type . OtherStorageError
85
+ )
86
+ ) ;
87
+ }
88
+ resolve ( ) ;
89
+ } ) ;
90
+ } ) ;
66
91
} catch ( e ) {
67
92
throw AsyncStorageError . nativeError ( e ) ;
68
93
}
69
94
} ;
70
95
71
96
getMany = async ( keys : string [ ] ) : Promise < Record < string , string | null > > => {
72
97
try {
73
- throw new Error ( "todo" ) ;
98
+ return await new Promise ( ( resolve , reject ) => {
99
+ this . db . multiGet ( keys , ( errors , result ) => {
100
+ const error = this . getError ( errors ) ;
101
+ if ( error ) {
102
+ return reject (
103
+ AsyncStorageError . jsError (
104
+ error . message ,
105
+ AsyncStorageError . Type . OtherStorageError
106
+ )
107
+ ) ;
108
+ }
109
+ const resultMap = new Map ( result ) ;
110
+ const entries : Record < string , string | null > = { } ;
111
+ for ( const key of keys ) {
112
+ entries [ key ] = resultMap . get ( key ) ?? null ;
113
+ }
114
+ resolve ( entries ) ;
115
+ } ) ;
116
+ } ) ;
74
117
} catch ( e ) {
75
118
throw AsyncStorageError . nativeError ( e ) ;
76
119
}
77
120
} ;
78
121
79
122
setMany = async ( entries : Record < string , string > ) : Promise < void > => {
80
123
try {
81
- throw new Error ( "todo" ) ;
124
+ await new Promise < void > ( ( resolve , reject ) => {
125
+ this . db . multiSet ( Object . entries ( entries ) , ( errors ) => {
126
+ const error = this . getError ( errors ) ;
127
+ if ( error ) {
128
+ return reject (
129
+ AsyncStorageError . jsError (
130
+ error . message ,
131
+ AsyncStorageError . Type . OtherStorageError
132
+ )
133
+ ) ;
134
+ }
135
+ resolve ( ) ;
136
+ } ) ;
137
+ } ) ;
82
138
} catch ( e ) {
83
139
throw AsyncStorageError . nativeError ( e ) ;
84
140
}
85
141
} ;
86
142
87
143
removeMany = async ( keys : string [ ] ) : Promise < void > => {
88
144
try {
89
- throw new Error ( "todo" ) ;
145
+ await new Promise < void > ( ( resolve , reject ) => {
146
+ this . db . multiRemove ( keys , ( errors ) => {
147
+ const error = this . getError ( errors ) ;
148
+ if ( error ) {
149
+ return reject (
150
+ AsyncStorageError . jsError (
151
+ error . message ,
152
+ AsyncStorageError . Type . OtherStorageError
153
+ )
154
+ ) ;
155
+ }
156
+ resolve ( ) ;
157
+ } ) ;
158
+ } ) ;
90
159
} catch ( e ) {
91
160
throw AsyncStorageError . nativeError ( e ) ;
92
161
}
93
162
} ;
94
163
95
164
getAllKeys = async ( ) : Promise < string [ ] > => {
96
165
try {
97
- throw new Error ( "todo" ) ;
166
+ return await new Promise ( ( resolve , reject ) => {
167
+ this . db . getAllKeys ( ( errors , result ) => {
168
+ const error = this . getError ( errors ) ;
169
+ if ( error ) {
170
+ return reject (
171
+ AsyncStorageError . jsError (
172
+ error . message ,
173
+ AsyncStorageError . Type . OtherStorageError
174
+ )
175
+ ) ;
176
+ }
177
+ if ( ! result ) {
178
+ return reject (
179
+ AsyncStorageError . jsError (
180
+ "Invalid state, no error and no values returned" ,
181
+ AsyncStorageError . Type . UnknownError
182
+ )
183
+ ) ;
184
+ }
185
+
186
+ resolve ( result ) ;
187
+ } ) ;
188
+ } ) ;
98
189
} catch ( e ) {
99
190
throw AsyncStorageError . nativeError ( e ) ;
100
191
}
101
192
} ;
102
193
103
194
clear = async ( ) : Promise < void > => {
104
195
try {
105
- throw new Error ( "todo" ) ;
196
+ await new Promise < void > ( ( resolve , reject ) => {
197
+ this . db . clear ( ( errors ) => {
198
+ const error = this . getError ( errors ) ;
199
+ if ( error ) {
200
+ return reject (
201
+ AsyncStorageError . jsError (
202
+ error . message ,
203
+ AsyncStorageError . Type . OtherStorageError
204
+ )
205
+ ) ;
206
+ }
207
+ resolve ( ) ;
208
+ } ) ;
209
+ } ) ;
106
210
} catch ( e ) {
107
211
throw AsyncStorageError . nativeError ( e ) ;
108
212
}
109
213
} ;
214
+
215
+ private getError = ( potentialError : any ) : ErrorLike | null => {
216
+ if ( ! potentialError ) {
217
+ return null ;
218
+ }
219
+
220
+ if ( Array . isArray ( potentialError ) && potentialError . length ) {
221
+ const firstError = potentialError . find ( ( e ) : e is ErrorLike => e ?. message ) ;
222
+ if ( firstError ) {
223
+ return firstError ;
224
+ }
225
+ return null ;
226
+ } else if ( potentialError ?. message ) {
227
+ return potentialError ;
228
+ }
229
+ return null ;
230
+ } ;
110
231
}
111
232
112
233
/**
@@ -141,7 +262,7 @@ interface NativeAsyncStorageSpec extends TurboModule {
141
262
callback : ( error ?: ErrorLike [ ] ) => void
142
263
) => void ;
143
264
getAllKeys : (
144
- callback : ( error ?: ErrorLike [ ] , result ?: [ string , string ] [ ] ) => void
265
+ callback : ( error ?: ErrorLike [ ] , result ?: string [ ] ) => void
145
266
) => void ;
146
267
clear : ( callback : ( error ?: ErrorLike [ ] ) => void ) => void ;
147
268
}
0 commit comments