@@ -32,19 +32,18 @@ class LegacyAsyncStorageImpl implements AsyncStorage {
3232
3333 getItem = async ( key : string ) : Promise < string | null > => {
3434 try {
35- return await new Promise ( ( resolve , reject ) => {
35+ return await new Promise < string | null > ( ( resolve , reject ) => {
3636 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 (
4040 AsyncStorageError . jsError (
4141 error . message ,
4242 AsyncStorageError . Type . OtherStorageError
4343 )
4444 ) ;
45- } else {
46- resolve ( result ?. [ 0 ] ?. [ 1 ] ?? null ) ;
4745 }
46+ resolve ( result ?. [ 0 ] ?. [ 1 ] ?? null ) ;
4847 } ) ;
4948 } ) ;
5049 } catch ( e ) {
@@ -54,59 +53,181 @@ class LegacyAsyncStorageImpl implements AsyncStorage {
5453
5554 setItem = async ( key : string , value : string ) : Promise < void > => {
5655 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+ } ) ;
5870 } catch ( e ) {
5971 throw AsyncStorageError . nativeError ( e ) ;
6072 }
6173 } ;
6274
6375 removeItem = async ( key : string ) : Promise < void > => {
6476 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+ } ) ;
6691 } catch ( e ) {
6792 throw AsyncStorageError . nativeError ( e ) ;
6893 }
6994 } ;
7095
7196 getMany = async ( keys : string [ ] ) : Promise < Record < string , string | null > > => {
7297 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+ } ) ;
74117 } catch ( e ) {
75118 throw AsyncStorageError . nativeError ( e ) ;
76119 }
77120 } ;
78121
79122 setMany = async ( entries : Record < string , string > ) : Promise < void > => {
80123 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+ } ) ;
82138 } catch ( e ) {
83139 throw AsyncStorageError . nativeError ( e ) ;
84140 }
85141 } ;
86142
87143 removeMany = async ( keys : string [ ] ) : Promise < void > => {
88144 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+ } ) ;
90159 } catch ( e ) {
91160 throw AsyncStorageError . nativeError ( e ) ;
92161 }
93162 } ;
94163
95164 getAllKeys = async ( ) : Promise < string [ ] > => {
96165 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+ } ) ;
98189 } catch ( e ) {
99190 throw AsyncStorageError . nativeError ( e ) ;
100191 }
101192 } ;
102193
103194 clear = async ( ) : Promise < void > => {
104195 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+ } ) ;
106210 } catch ( e ) {
107211 throw AsyncStorageError . nativeError ( e ) ;
108212 }
109213 } ;
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+ } ;
110231}
111232
112233/**
@@ -141,7 +262,7 @@ interface NativeAsyncStorageSpec extends TurboModule {
141262 callback : ( error ?: ErrorLike [ ] ) => void
142263 ) => void ;
143264 getAllKeys : (
144- callback : ( error ?: ErrorLike [ ] , result ?: [ string , string ] [ ] ) => void
265+ callback : ( error ?: ErrorLike [ ] , result ?: string [ ] ) => void
145266 ) => void ;
146267 clear : ( callback : ( error ?: ErrorLike [ ] ) => void ) => void ;
147268}
0 commit comments