1// Copyright 2018-present 650 Industries. All rights reserved. 2 3#import <ExpoModulesCore/EXNativeModulesProxy.h> 4#import <ExpoModulesCore/EXModuleRegistryAdapter.h> 5#import <ExpoModulesCore/EXModuleRegistryProvider.h> 6#import <ExpoModulesCore/EXModuleRegistryHolderReactModule.h> 7#import <ExpoModulesCore/EXReactNativeEventEmitter.h> 8 9@interface EXModuleRegistryAdapter () 10 11@property (nonatomic, strong) EXModuleRegistryProvider *moduleRegistryProvider; 12 13@end 14 15@implementation EXModuleRegistryAdapter 16 17- (nonnull instancetype)initWithModuleRegistryProvider:(EXModuleRegistryProvider *)moduleRegistryProvider 18{ 19 if (self = [super init]) { 20 _moduleRegistryProvider = moduleRegistryProvider; 21 } 22 return self; 23} 24 25- (NSArray<id<RCTBridgeModule>> *)extraModulesForBridge:(RCTBridge *)bridge 26{ 27 return [self extraModulesForModuleRegistry:[_moduleRegistryProvider moduleRegistry]]; 28} 29 30- (NSArray<id<RCTBridgeModule>> *)extraModulesForModuleRegistry:(EXModuleRegistry *)moduleRegistry 31{ 32 NSMutableArray<id<RCTBridgeModule>> *extraModules = [NSMutableArray array]; 33 34 EXNativeModulesProxy *nativeModulesProxy = [[EXNativeModulesProxy alloc] initWithModuleRegistry:moduleRegistry]; 35 [extraModules addObject:nativeModulesProxy]; 36 37 // Event emitter is not automatically registered — we add it to the module registry here. 38 // It will be added to the bridge later in this method, as it conforms to `RCTBridgeModule`. 39 EXReactNativeEventEmitter *eventEmitter = [EXReactNativeEventEmitter new]; 40 [moduleRegistry registerInternalModule:eventEmitter]; 41 42 // It is possible that among internal modules there are some RCTBridgeModules -- 43 // let's add them to extraModules here. 44 for (id<EXInternalModule> module in [moduleRegistry getAllInternalModules]) { 45 if ([module conformsToProtocol:@protocol(RCTBridgeModule)]) { 46 id<RCTBridgeModule> reactBridgeModule = (id<RCTBridgeModule>)module; 47 [extraModules addObject:reactBridgeModule]; 48 } 49 } 50 51 // Adding the way to access the module registry from RCTBridgeModules. 52 [extraModules addObject:[[EXModuleRegistryHolderReactModule alloc] initWithModuleRegistry:moduleRegistry]]; 53 54 // One could add some modules to the Module Registry after creating it. 55 // Here is our last call for finalizing initialization. 56 [moduleRegistry initialize]; 57 return extraModules; 58} 59 60@end 61