@@ -43,6 +43,18 @@ static void RCTAppendError(NSDictionary *error, NSMutableArray<NSDictionary *> *
4343 }
4444}
4545
46+ static NSArray <NSDictionary *> *RCTMakeErrors (NSArray <id <NSObject >> *results) {
47+ NSMutableArray <NSDictionary *> *errors;
48+ for (id object in results) {
49+ if ([object isKindOfClass: [NSError class ]]) {
50+ NSError *error = (NSError *)object;
51+ NSDictionary *keyError = RCTMakeError (error.localizedDescription , error, nil );
52+ RCTAppendError (keyError, &errors);
53+ }
54+ }
55+ return errors;
56+ }
57+
4658static NSString *RCTReadFile (NSString *filePath, NSString *key, NSDictionary **errorOut)
4759{
4860 if ([[NSFileManager defaultManager ] fileExistsAtPath: filePath]) {
@@ -329,30 +341,77 @@ - (NSDictionary *)_writeEntry:(NSArray<NSString *> *)entry changedManifest:(BOOL
329341 return errorOut;
330342}
331343
344+ - (void )_multiGet : (NSArray <NSString *> *)keys
345+ callback : (RCTResponseSenderBlock)callback
346+ getter : (NSString *(^)(NSUInteger i, NSString *key, NSDictionary **errorOut))getValue
347+ {
348+ NSMutableArray <NSDictionary *> *errors;
349+ NSMutableArray <NSArray <NSString *> *> *result = [NSMutableArray arrayWithCapacity: keys.count];
350+ for (NSUInteger i = 0 ; i < keys.count ; ++i) {
351+ NSString *key = keys[i];
352+ id keyError;
353+ id value = getValue (i, key, &keyError);
354+ [result addObject: @[key, RCTNullIfNil (value)]];
355+ RCTAppendError (keyError, &errors);
356+ }
357+ callback (@[RCTNullIfNil (errors), result]);
358+ }
359+
332360#pragma mark - Exported JS Functions
333361
334362RCT_EXPORT_METHOD (multiGet:(NSArray <NSString *> *)keys
335363 callback:(RCTResponseSenderBlock)callback)
336364{
365+ if (self.delegate != nil ) {
366+ [self .delegate valuesForKeys: keys completion: ^(NSArray <id <NSObject >> *valuesOrErrors) {
367+ [self _multiGet: keys
368+ callback: callback
369+ getter: ^NSString *(NSUInteger i, NSString *key, NSDictionary **errorOut) {
370+ id valueOrError = valuesOrErrors[i];
371+ if ([valueOrError isKindOfClass: [NSError class ]]) {
372+ NSError *error = (NSError *)valueOrError;
373+ NSDictionary *extraData = @{@" key" : RCTNullIfNil (key)};
374+ *errorOut = RCTMakeError (error.localizedDescription , error, extraData);
375+ return nil ;
376+ } else {
377+ return [valueOrError isKindOfClass: [NSString class ]]
378+ ? (NSString *)valueOrError
379+ : nil ;
380+ }
381+ }];
382+ }];
383+ return ;
384+ }
385+
337386 NSDictionary *errorOut = [self _ensureSetup ];
338387 if (errorOut) {
339388 callback (@[@[errorOut], (id )kCFNull ]);
340389 return ;
341390 }
342- NSMutableArray <NSDictionary *> *errors;
343- NSMutableArray <NSArray <NSString *> *> *result = [[NSMutableArray alloc ] initWithCapacity: keys.count];
344- for (NSString *key in keys) {
345- id keyError;
346- id value = [self _getValueForKey: key errorOut: &keyError];
347- [result addObject: @[key, RCTNullIfNil (value)]];
348- RCTAppendError (keyError, &errors);
349- }
350- callback (@[RCTNullIfNil (errors), result]);
391+ [self _multiGet: keys
392+ callback: callback
393+ getter: ^(NSUInteger i, NSString *key, NSDictionary **errorOut) {
394+ return [self _getValueForKey: key errorOut: errorOut];
395+ }];
351396}
352397
353398RCT_EXPORT_METHOD (multiSet:(NSArray <NSArray <NSString *> *> *)kvPairs
354399 callback:(RCTResponseSenderBlock)callback)
355400{
401+ if (self.delegate != nil ) {
402+ NSMutableArray <NSString *> *keys = [NSMutableArray arrayWithCapacity: kvPairs.count];
403+ NSMutableArray <NSString *> *values = [NSMutableArray arrayWithCapacity: kvPairs.count];
404+ for (NSArray <NSString *> *entry in kvPairs) {
405+ [keys addObject: entry[0 ]];
406+ [values addObject: entry[1 ]];
407+ }
408+ [self .delegate setValues: values forKeys: keys completion: ^(NSArray <id <NSObject >> *results) {
409+ NSArray <NSDictionary *> *errors = RCTMakeErrors (results);
410+ callback (@[RCTNullIfNil (errors)]);
411+ }];
412+ return ;
413+ }
414+
356415 NSDictionary *errorOut = [self _ensureSetup ];
357416 if (errorOut) {
358417 callback (@[@[errorOut]]);
@@ -373,6 +432,20 @@ - (NSDictionary *)_writeEntry:(NSArray<NSString *> *)entry changedManifest:(BOOL
373432RCT_EXPORT_METHOD (multiMerge:(NSArray <NSArray <NSString *> *> *)kvPairs
374433 callback:(RCTResponseSenderBlock)callback)
375434{
435+ if (self.delegate != nil ) {
436+ NSMutableArray <NSString *> *keys = [NSMutableArray arrayWithCapacity: kvPairs.count];
437+ NSMutableArray <NSString *> *values = [NSMutableArray arrayWithCapacity: kvPairs.count];
438+ for (NSArray <NSString *> *entry in kvPairs) {
439+ [keys addObject: entry[0 ]];
440+ [values addObject: entry[1 ]];
441+ }
442+ [self .delegate mergeValues: values forKeys: keys completion: ^(NSArray <id <NSObject >> *results) {
443+ NSArray <NSDictionary *> *errors = RCTMakeErrors (results);
444+ callback (@[RCTNullIfNil (errors)]);
445+ }];
446+ return ;
447+ }
448+
376449 NSDictionary *errorOut = [self _ensureSetup ];
377450 if (errorOut) {
378451 callback (@[@[errorOut]]);
@@ -407,8 +480,16 @@ - (NSDictionary *)_writeEntry:(NSArray<NSString *> *)entry changedManifest:(BOOL
407480}
408481
409482RCT_EXPORT_METHOD (multiRemove:(NSArray <NSString *> *)keys
410- callback:(RCTResponseSenderBlock)callback)
483+ callback:(RCTResponseSenderBlock)callback)
411484{
485+ if (self.delegate != nil ) {
486+ [self .delegate removeValuesForKeys: keys completion: ^(NSArray <id <NSObject >> *results) {
487+ NSArray <NSDictionary *> *errors = RCTMakeErrors (results);
488+ callback (@[RCTNullIfNil (errors)]);
489+ }];
490+ return ;
491+ }
492+
412493 NSDictionary *errorOut = [self _ensureSetup ];
413494 if (errorOut) {
414495 callback (@[@[errorOut]]);
@@ -439,6 +520,17 @@ - (NSDictionary *)_writeEntry:(NSArray<NSString *> *)entry changedManifest:(BOOL
439520
440521RCT_EXPORT_METHOD (clear:(RCTResponseSenderBlock)callback)
441522{
523+ if (self.delegate != nil ) {
524+ [self .delegate removeAllValues: ^(NSError *error) {
525+ NSDictionary *result = nil ;
526+ if (error != nil ) {
527+ result = RCTMakeError (error.localizedDescription , error, nil );
528+ }
529+ callback (@[RCTNullIfNil (result)]);
530+ }];
531+ return ;
532+ }
533+
442534 [_manifest removeAllObjects ];
443535 [RCTGetCache () removeAllObjects ];
444536 NSDictionary *error = RCTDeleteStorageDirectory ();
@@ -447,6 +539,13 @@ - (NSDictionary *)_writeEntry:(NSArray<NSString *> *)entry changedManifest:(BOOL
447539
448540RCT_EXPORT_METHOD (getAllKeys:(RCTResponseSenderBlock)callback)
449541{
542+ if (self.delegate != nil ) {
543+ [self .delegate allKeys: ^(NSArray <id <NSObject >> *keys) {
544+ callback (@[(id )kCFNull , keys]);
545+ }];
546+ return ;
547+ }
548+
450549 NSDictionary *errorOut = [self _ensureSetup ];
451550 if (errorOut) {
452551 callback (@[errorOut, (id )kCFNull ]);
0 commit comments