Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 54 additions & 7 deletions packages/react-native/React/Base/RCTBundleManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,19 +9,66 @@

@class RCTBridge;

typedef NSURL * (^RCTBridgelessBundleURLGetter)(void);
typedef void (^RCTBridgelessBundleURLSetter)(NSURL *bundleURL);
typedef NSURL *_Nullable (^RCTBridgelessBundleURLGetter)(void);
typedef void (^RCTBridgelessBundleURLSetter)(NSURL *_Nullable bundleURL);
typedef NSMutableArray<NSURLQueryItem *> *_Nullable (^RCTPackagerOptionsUpdater)(
NSMutableArray<NSURLQueryItem *> *_Nullable options);

/**
* Configuration class for setting up custom bundle locations
*/
@interface RCTBundleConfiguration : NSObject

/**
* The URL of the bundle to load from the file system
*/
@property (nonatomic, readonly, nullable) NSURL *bundleFilePath;

/**
* The server scheme (e.g. http or https) to use when loading from the packager
*/
@property (nonatomic, readonly, nullable) NSString *packagerServerScheme;

/**
* The server host (e.g. localhost) to use when loading from the packager
*/
@property (nonatomic, readonly, nullable) NSString *packagerServerHost;

/**
* A block that modifies the packager options when loading from the packager
*/
@property (nonatomic, copy, nullable) RCTPackagerOptionsUpdater packagerOptionsUpdater;

/**
* The relative path to the bundle.
*/
@property (nonatomic, readonly, nullable) NSString *bundlePath;

- (nonnull instancetype)initWithBundleFilePath:(nullable NSURL *)bundleFilePath;

- (nonnull instancetype)initWithPackagerServerScheme:(nullable NSString *)packagerServerScheme
packagerServerHost:(nullable NSString *)packagerServerHost
bundlePath:(nullable NSString *)bundlePath;

- (nullable NSURL *)getBundleURL:(NSURL *_Nullable (^_Nullable)(void))fallbackURLProvider;

- (nullable NSString *)getPackagerServerScheme;

- (nullable NSString *)getPackagerServerHost;

@end

/**
* A class that allows NativeModules/TurboModules to read/write the bundleURL, with or without the bridge.
*/
@interface RCTBundleManager : NSObject
#ifndef RCT_REMOVE_LEGACY_ARCH
- (void)setBridge:(RCTBridge *)bridge;
- (void)setBridge:(nullable RCTBridge *)bridge;
#endif // RCT_REMOVE_LEGACY_ARCH
- (void)setBridgelessBundleURLGetter:(RCTBridgelessBundleURLGetter)getter
andSetter:(RCTBridgelessBundleURLSetter)setter
andDefaultGetter:(RCTBridgelessBundleURLGetter)defaultGetter;
- (void)setBridgelessBundleURLGetter:(nullable RCTBridgelessBundleURLGetter)getter
andSetter:(nullable RCTBridgelessBundleURLSetter)setter
andDefaultGetter:(nullable RCTBridgelessBundleURLGetter)defaultGetter;
- (void)resetBundleURL;
@property NSURL *bundleURL;
@property (nonatomic, nullable) NSURL *bundleURL;
@property (nonatomic, nullable) RCTBundleConfiguration *bundleConfig;
@end
86 changes: 86 additions & 0 deletions packages/react-native/React/Base/RCTBundleManager.m
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,94 @@
*/

#import "RCTBundleManager.h"
#import <React/RCTBundleURLProvider.h>
#import "RCTAssert.h"
#import "RCTBridge+Private.h"
#import "RCTBridge.h"
#import "RCTLog.h"

@implementation RCTBundleConfiguration

- (instancetype)initWithBundleFilePath:(NSURL *)bundleFilePath
{
return [self initWithBundleFilePath:bundleFilePath packagerServerScheme:nil packagerServerHost:nil bundlePath:nil];
}

- (instancetype)initWithPackagerServerScheme:(NSString *)packagerServerScheme
packagerServerHost:(NSString *)packagerServerHost
bundlePath:(NSString *)bundlePath
{
return [self initWithBundleFilePath:nil
packagerServerScheme:packagerServerScheme
packagerServerHost:packagerServerHost
bundlePath:bundlePath];
}

- (instancetype)initWithBundleFilePath:(NSURL *)bundleFilePath
packagerServerScheme:(NSString *)packagerServerScheme
packagerServerHost:(NSString *)packagerServerHost
bundlePath:(NSString *)bundlePath
{
if (self = [super init]) {
_bundleFilePath = bundleFilePath;
_packagerServerScheme = packagerServerScheme;
_packagerServerHost = packagerServerHost;
_bundlePath = bundlePath;
_packagerOptionsUpdater = ^NSMutableArray<NSURLQueryItem *> *(NSMutableArray<NSURLQueryItem *> *options)
{
return options;
};
}

return self;
}

- (NSString *)getPackagerServerScheme
{
if (!_packagerServerScheme) {
return [[RCTBundleURLProvider sharedSettings] packagerScheme];
}

return _packagerServerScheme;
}

- (NSString *)getPackagerServerHost
{
if (!_packagerServerHost) {
return [[RCTBundleURLProvider sharedSettings] packagerServerHostPort];
}

return _packagerServerHost;
}

- (NSURL *)getBundleURL:(NSURL * (^)(void))fallbackURLProvider
{
if (_packagerServerScheme && _packagerServerHost) {
NSArray<NSURLQueryItem *> *jsBundleURLQuery =
[[RCTBundleURLProvider sharedSettings] createJSBundleURLQuery:_packagerServerHost
packagerScheme:_packagerServerScheme];

NSArray<NSURLQueryItem *> *updatedBundleURLQuery = _packagerOptionsUpdater((NSMutableArray *)jsBundleURLQuery);
NSString *path = [NSString stringWithFormat:@"/%@.bundle", _bundlePath];
return [[RCTBundleURLProvider class] resourceURLForResourcePath:path
packagerHost:_packagerServerHost
scheme:_packagerServerScheme
queryItems:updatedBundleURLQuery];
}

if (_bundleFilePath) {
if (!_bundleFilePath.fileURL) {
RCTLogError(@"Bundle file path must be a file URL");
return nil;
}

return _bundleFilePath;
}

return fallbackURLProvider();
}

@end

@implementation RCTBundleManager {
#ifndef RCT_REMOVE_LEGACY_ARCH
Expand All @@ -18,6 +103,7 @@ @implementation RCTBundleManager {
RCTBridgelessBundleURLSetter _bridgelessBundleURLSetter;
RCTBridgelessBundleURLGetter _bridgelessBundleURLDefaultGetter;
}
@synthesize bundleConfig;

#ifndef RCT_REMOVE_LEGACY_ARCH
- (void)setBridge:(RCTBridge *)bridge
Expand Down
13 changes: 13 additions & 0 deletions packages/react-native/React/Base/RCTBundleURLProvider.h
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,19 @@ NS_ASSUME_NONNULL_BEGIN
resourceExtension:(NSString *)extension
offlineBundle:(NSBundle *)offlineBundle;

- (NSArray<NSURLQueryItem *> *)createJSBundleURLQuery:(NSString *)packagerHost
packagerScheme:(NSString *__nullable)scheme;

+ (NSArray<NSURLQueryItem *> *)createJSBundleURLQuery:(NSString *)packagerHost
packagerScheme:(NSString *__nullable)scheme
enableDev:(BOOL)enableDev
enableMinification:(BOOL)enableMinification
inlineSourceMap:(BOOL)inlineSourceMap
modulesOnly:(BOOL)modulesOnly
runModule:(BOOL)runModule
additionalOptions:
(NSDictionary<NSString *, NSString *> *__nullable)additionalOptions;

/**
* The IP address or hostname of the packager.
*/
Expand Down
43 changes: 39 additions & 4 deletions packages/react-native/React/Base/RCTBundleURLProvider.mm
Original file line number Diff line number Diff line change
Expand Up @@ -313,6 +313,44 @@ + (NSURL *__nullable)jsBundleURLForBundleRoot:(NSString *)bundleRoot
additionalOptions:(NSDictionary<NSString *, NSString *> *__nullable)additionalOptions
{
NSString *path = [NSString stringWithFormat:@"/%@.bundle", bundleRoot];
NSArray<NSURLQueryItem *> *queryItems = [self createJSBundleURLQuery:packagerHost
packagerScheme:scheme
enableDev:enableDev
enableMinification:enableMinification
inlineSourceMap:inlineSourceMap
modulesOnly:modulesOnly
runModule:runModule
additionalOptions:additionalOptions];

return [[self class] resourceURLForResourcePath:path
packagerHost:packagerHost
scheme:scheme
queryItems:[queryItems copy]];
}

- (NSArray<NSURLQueryItem *> *)createJSBundleURLQuery:(NSString *)packagerHost
packagerScheme:(NSString *__nullable)scheme
{
return [[self class] createJSBundleURLQuery:packagerHost
packagerScheme:scheme
enableDev:[self enableDev]
enableMinification:[self enableMinification]
inlineSourceMap:[self inlineSourceMap]
modulesOnly:NO
runModule:YES
additionalOptions:nil];
}

+ (NSArray<NSURLQueryItem *> *)createJSBundleURLQuery:(NSString *)packagerHost
packagerScheme:(NSString *__nullable)scheme
enableDev:(BOOL)enableDev
enableMinification:(BOOL)enableMinification
inlineSourceMap:(BOOL)inlineSourceMap
modulesOnly:(BOOL)modulesOnly
runModule:(BOOL)runModule
additionalOptions:
(NSDictionary<NSString *, NSString *> *__nullable)additionalOptions
{
BOOL lazy = enableDev;
NSMutableArray<NSURLQueryItem *> *queryItems = [[NSMutableArray alloc] initWithArray:@[
[[NSURLQueryItem alloc] initWithName:@"platform" value:RCTPlatformName],
Expand Down Expand Up @@ -345,10 +383,7 @@ + (NSURL *__nullable)jsBundleURLForBundleRoot:(NSString *)bundleRoot
}
}

return [[self class] resourceURLForResourcePath:path
packagerHost:packagerHost
scheme:scheme
queryItems:[queryItems copy]];
return queryItems;
}

+ (NSURL *)resourceURLForResourcePath:(NSString *)path
Expand Down
Loading