1// Copyright © 2018 650 Industries. All rights reserved.
2
3#import "EXScopedModuleRegistry.h"
4
5#import "EXScopedModuleRegistryAdapter.h"
6#import "EXPermissionsBinding.h"
7#import "EXFileSystemBinding.h"
8#import "EXSensorsManagerBinding.h"
9#import "EXConstantsBinding.h"
10#import "EXUnversioned.h"
11
12#import "EXModuleRegistryBinding.h"
13
14@implementation EXScopedModuleRegistryAdapter
15
16- (NSArray<id<RCTBridgeModule>> *)extraModulesForParams:(NSDictionary *)params andExperience:(NSString *)experienceId withScopedModulesArray:(NSArray<id<RCTBridgeModule>> *)scopedModulesArray withKernelServices:(NSDictionary *)kernelServices
17{
18  EXModuleRegistry *moduleRegistry = [self.moduleRegistryProvider moduleRegistryForExperienceId:experienceId];
19  NSDictionary<Class, id> *scopedModulesDictionary = [self dictionaryFromScopedModulesArray:scopedModulesArray];
20
21  EXFileSystemBinding *fileSystemBinding = [[EXFileSystemBinding alloc] initWithScopedModuleDelegate:kernelServices[EX_UNVERSIONED(@"EXFileSystemManager")]];
22  [moduleRegistry registerInternalModule:fileSystemBinding];
23
24  EXPermissionsBinding *permissionsBinding = [[EXPermissionsBinding alloc] initWithPermissions:scopedModulesDictionary[[EXPermissions class]]];
25  [moduleRegistry registerInternalModule:permissionsBinding];
26
27  EXSensorsManagerBinding *sensorsManagerBinding = [[EXSensorsManagerBinding alloc] initWithExperienceId:experienceId andKernelService:kernelServices[EX_UNVERSIONED(@"EXSensorManager")]];
28  [moduleRegistry registerInternalModule:sensorsManagerBinding];
29
30  EXConstantsBinding *constantsBinding = [[EXConstantsBinding alloc] initWithExperienceId:experienceId andParams:params];
31  [moduleRegistry registerInternalModule:constantsBinding];
32
33  NSArray<id<RCTBridgeModule>> *bridgeModules = [self extraModulesForModuleRegistry:moduleRegistry];
34  return [bridgeModules arrayByAddingObject:[[EXModuleRegistryBinding alloc] initWithModuleRegistry:moduleRegistry]];
35}
36
37- (NSDictionary<Class, id> *)dictionaryFromScopedModulesArray:(NSArray<id<RCTBridgeModule>> *)scopedModulesArray
38{
39  NSMutableDictionary<Class, id> *scopedModulesDictionary = [NSMutableDictionary dictionaryWithCapacity:[scopedModulesArray count]];
40  for (id<RCTBridgeModule> module in scopedModulesArray) {
41    scopedModulesDictionary[(id<NSCopying>)[module class]] = module;
42  }
43  return scopedModulesDictionary;
44}
45
46@end
47