1/*
2 * Copyright (c) Meta Platforms, Inc. and affiliates.
3 *
4 * This source code is licensed under the MIT license found in the
5 * LICENSE file in the root directory of this source tree.
6 */
7
8#import <ABI47_0_0React/ABI47_0_0RCTDevSplitBundleLoader.h>
9
10#import <ABI47_0_0FBReactNativeSpec/ABI47_0_0FBReactNativeSpec.h>
11#import <ABI47_0_0React/ABI47_0_0RCTBridge.h>
12#import <ABI47_0_0React/ABI47_0_0RCTBundleURLProvider.h>
13#import <ABI47_0_0React/ABI47_0_0RCTConvert.h>
14#import <ABI47_0_0React/ABI47_0_0RCTDefines.h>
15#import <ABI47_0_0React/ABI47_0_0RCTDevSettings.h>
16#import <ABI47_0_0React/ABI47_0_0RCTUtils.h>
17
18#import "ABI47_0_0CoreModulesPlugins.h"
19
20using namespace ABI47_0_0facebook::ABI47_0_0React;
21
22@interface ABI47_0_0RCTDevSplitBundleLoader () <ABI47_0_0NativeDevSplitBundleLoaderSpec>
23@end
24
25#if ABI47_0_0RCT_DEV_MENU | ABI47_0_0RCT_PACKAGER_LOADING_FUNCTIONALITY
26
27@implementation ABI47_0_0RCTDevSplitBundleLoader
28
29@synthesize bridge = _bridge;
30@synthesize loadScript = _loadScript;
31@synthesize moduleRegistry = _moduleRegistry;
32
33ABI47_0_0RCT_EXPORT_MODULE()
34
35+ (BOOL)requiresMainQueueSetup
36{
37  return NO;
38}
39
40ABI47_0_0RCT_EXPORT_METHOD(loadBundle
41                  : (NSString *)bundlePath resolve
42                  : (ABI47_0_0RCTPromiseResolveBlock)resolve reject
43                  : (ABI47_0_0RCTPromiseRejectBlock)reject)
44{
45  NSURL *sourceURL = [[ABI47_0_0RCTBundleURLProvider sharedSettings] jsBundleURLForSplitBundleRoot:bundlePath];
46  if (_bridge) {
47    [_bridge loadAndExecuteSplitBundleURL:sourceURL
48        onError:^(NSError *error) {
49          reject(@"E_BUNDLE_LOAD_ERROR", [error localizedDescription], error);
50        }
51        onComplete:^() {
52          resolve(@YES);
53        }];
54  } else {
55    __weak __typeof(self) weakSelf = self;
56    [ABI47_0_0RCTJavaScriptLoader loadBundleAtURL:sourceURL
57        onProgress:^(ABI47_0_0RCTLoadingProgress *progressData) {
58          // TODO: Setup loading bar.
59        }
60        onComplete:^(NSError *error, ABI47_0_0RCTSource *source) {
61          if (error) {
62            reject(@"E_BUNDLE_LOAD_ERROR", [error localizedDescription], error);
63            return;
64          }
65          __typeof(self) strongSelf = weakSelf;
66          strongSelf->_loadScript(source);
67          ABI47_0_0RCTDevSettings *devSettings = [strongSelf->_moduleRegistry moduleForName:"ABI47_0_0RCTDevSettings"];
68          [devSettings setupHMRClientWithAdditionalBundleURL:source.url];
69          resolve(@YES);
70        }];
71  }
72}
73
74- (std::shared_ptr<TurboModule>)getTurboModule:(const ObjCTurboModule::InitParams &)params
75{
76  return std::make_shared<NativeDevSplitBundleLoaderSpecJSI>(params);
77}
78
79@end
80
81#else
82
83@implementation ABI47_0_0RCTDevSplitBundleLoader
84
85@synthesize loadScript = _loadScript;
86
87+ (NSString *)moduleName
88{
89  return nil;
90}
91- (void)loadBundle:(NSString *)bundlePath resolve:(ABI47_0_0RCTPromiseResolveBlock)resolve reject:(ABI47_0_0RCTPromiseRejectBlock)reject;
92{
93}
94- (std::shared_ptr<TurboModule>)getTurboModule:(const ObjCTurboModule::InitParams &)params
95{
96  return std::make_shared<NativeDevSplitBundleLoaderSpecJSI>(params);
97}
98
99@end
100
101#endif
102
103Class ABI47_0_0RCTDevSplitBundleLoaderCls(void)
104{
105  return ABI47_0_0RCTDevSplitBundleLoader.class;
106}
107