/** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. */ #import #import #import #import #import #import @class JSValue; @class RCTBridge; @class RCTEventDispatcher; @class RCTPerformanceLogger; /** * This notification fires when the bridge starts loading the JS bundle. */ RCT_EXTERN NSString *const RCTJavaScriptWillStartLoadingNotification; /** * This notification fires when the bridge has finished loading the JS bundle. */ RCT_EXTERN NSString *const RCTJavaScriptDidLoadNotification; /** * This notification fires when the bridge failed to load the JS bundle. The * `error` key can be used to determine the error that occured. */ RCT_EXTERN NSString *const RCTJavaScriptDidFailToLoadNotification; /** * This notification fires each time a native module is instantiated. The * `module` key will contain a reference to the newly-created module instance. * Note that this notification may be fired before the module is available via * the `[bridge moduleForClass:]` method. */ RCT_EXTERN NSString *const RCTDidInitializeModuleNotification; /** * This block can be used to instantiate modules that require additional * init parameters, or additional configuration prior to being used. * The bridge will call this block to instatiate the modules, and will * be responsible for invalidating/releasing them when the bridge is destroyed. * For this reason, the block should always return new module instances, and * module instances should not be shared between bridges. */ typedef NSArray> *(^RCTBridgeModuleProviderBlock)(void); /** * This function returns the module name for a given class. */ RCT_EXTERN NSString *RCTBridgeModuleNameForClass(Class bridgeModuleClass); /** * Async batched bridge used to communicate with the JavaScript application. */ @interface RCTBridge : NSObject /** * Creates a new bridge with a custom RCTBridgeDelegate. * * All the interaction with the JavaScript context should be done using the bridge * instance of the RCTBridgeModules. Modules will be automatically instantiated * using the default contructor, but you can optionally pass in an array of * pre-initialized module instances if they require additional init parameters * or configuration. */ - (instancetype)initWithDelegate:(id)delegate launchOptions:(NSDictionary *)launchOptions; /** * DEPRECATED: Use initWithDelegate:launchOptions: instead * * The designated initializer. This creates a new bridge on top of the specified * executor. The bridge should then be used for all subsequent communication * with the JavaScript code running in the executor. Modules will be automatically * instantiated using the default contructor, but you can optionally pass in an * array of pre-initialized module instances if they require additional init * parameters or configuration. */ - (instancetype)initWithBundleURL:(NSURL *)bundleURL moduleProvider:(RCTBridgeModuleProviderBlock)block launchOptions:(NSDictionary *)launchOptions; /** * This method is used to call functions in the JavaScript application context. * It is primarily intended for use by modules that require two-way communication * with the JavaScript code. Safe to call from any thread. */ - (void)enqueueJSCall:(NSString *)moduleDotMethod args:(NSArray *)args; - (void)enqueueJSCall:(NSString *)module method:(NSString *)method args:(NSArray *)args completion:(dispatch_block_t)completion; /** * This method is used to call functions in the JavaScript application context * synchronously. This is intended for use by applications which do their own * thread management and are careful to manage multi-threaded access to the JSVM. * See also -[RCTBridgeDelgate shouldBridgeLoadJavaScriptSynchronously], which * may be needed to ensure that any requires JS code is loaded before this method * is called. If the underlying executor is not JSC, this will return nil. Safe * to call from any thread. * * @experimental */ - (JSValue *)callFunctionOnModule:(NSString *)module method:(NSString *)method arguments:(NSArray *)arguments error:(NSError **)error; /** * Retrieve a bridge module instance by name or class. Note that modules are * lazily instantiated, so calling these methods for the first time with a given * module name/class may cause the class to be sychronously instantiated, * potentially blocking both the calling thread and main thread for a short time. */ - (id)moduleForName:(NSString *)moduleName; - (id)moduleForClass:(Class)moduleClass; /** * Convenience method for retrieving all modules conforming to a given protocol. * Modules will be sychronously instantiated if they haven't already been, * potentially blocking both the calling thread and main thread for a short time. */ - (NSArray *)modulesConformingToProtocol:(Protocol *)protocol; /** * Test if a module has been initialized. Use this prior to calling * `moduleForClass:` or `moduleForName:` if you do not want to cause the module * to be instantiated if it hasn't been already. */ - (BOOL)moduleIsInitialized:(Class)moduleClass; /** * Call when your delegate's `whitelistedModulesForBridge:` value has changed. * In response to this, the bridge will immediately instantiate any (whitelisted) * native modules that require main thread initialization. Modules that do not require * main thread initialization will still be created lazily. * * This method must be called on the main thread, as any pending native modules * will be initialized immediately. */ - (void)whitelistedModulesDidChange; /** * All registered bridge module classes. */ @property (nonatomic, copy, readonly) NSArray *moduleClasses; /** * URL of the script that was loaded into the bridge. */ @property (nonatomic, strong, readonly) NSURL *bundleURL; /** * The class of the executor currently being used. Changes to this value will * take effect after the bridge is reloaded. */ @property (nonatomic, strong) Class executorClass; /** * The delegate provided during the bridge initialization */ @property (nonatomic, weak, readonly) id delegate; /** * The launch options that were used to initialize the bridge. */ @property (nonatomic, copy, readonly) NSDictionary *launchOptions; /** * Use this to check if the bridge is currently loading. */ @property (nonatomic, readonly, getter=isLoading) BOOL loading; /** * Use this to check if the bridge has been invalidated. */ @property (nonatomic, readonly, getter=isValid) BOOL valid; /** * Link to the Performance Logger that logs React Native perf events. */ @property (nonatomic, readonly, strong) RCTPerformanceLogger *performanceLogger; /** * Reload the bundle and reset executor & modules. Safe to call from any thread. */ - (void)reload; /** * Inform the bridge, and anything subscribing to it, that it should reload. */ - (void)requestReload __deprecated_msg("Call reload instead"); /** * Says whether bridge has started recieving calls from javascript. */ - (BOOL)isBatchActive; @end