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