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