Allow lazy modules registration with the BatchedBridge

Reviewed By: javache

Differential Revision: D5181849

fbshipit-source-id: f63562c360488a9818605b25c1338214daac7411
This commit is contained in:
Alex Dvornikov 2017-06-06 07:03:10 -07:00 committed by Facebook Github Bot
parent a939109183
commit 485bb70691
6 changed files with 29 additions and 40 deletions

View File

@ -42,7 +42,7 @@ const TRACE_TAG_REACT_APPS = 1 << 17;
const DEBUG_INFO_LIMIT = 32;
class MessageQueue {
_callableModules: {[key: string]: Object};
_lazyCallableModules: {[key: string]: void => Object};
_queue: [Array<number>, Array<number>, Array<any>, number];
_successCallbacks: Array<?Function>;
_failureCallbacks: Array<?Function>;
@ -58,7 +58,7 @@ class MessageQueue {
__spy: ?(data: SpyData) => void;
constructor() {
this._callableModules = {};
this._lazyCallableModules = {};
this._queue = [[], [], [], 0];
this._successCallbacks = [];
this._failureCallbacks = [];
@ -136,7 +136,23 @@ class MessageQueue {
}
registerCallableModule(name: string, module: Object) {
this._callableModules[name] = module;
this._lazyCallableModules[name] = () => module;
}
registerLazyCallableModule(name: string, factory: void => Object) {
let module: Object;
let getValue: ?(void => Object) = factory;
this._lazyCallableModules[name] = () => {
if (getValue) {
module = getValue();
getValue = null;
}
return module;
};
}
_getCallableModule(name: string) {
return this._lazyCallableModules[name]();
}
enqueueNativeCall(moduleID: number, methodID: number, params: Array<any>, onFail: ?Function, onSucc: ?Function) {
@ -230,7 +246,7 @@ class MessageQueue {
if (this.__spy) {
this.__spy({ type: TO_JS, module, method, args});
}
const moduleMethods = this._callableModules[module];
const moduleMethods = this._getCallableModule(module);
invariant(
!!moduleMethods,
'Module %s is not a registered callable module (calling %s)',

View File

@ -106,10 +106,11 @@ ExceptionsManager.installConsoleErrorReporter();
// TODO: Move these around to solve the cycle in a cleaner way
const BatchedBridge = require('BatchedBridge');
BatchedBridge.registerCallableModule('Systrace', require('Systrace'));
BatchedBridge.registerCallableModule('JSTimersExecution', require('JSTimersExecution'));
BatchedBridge.registerCallableModule('HeapCapture', require('HeapCapture'));
BatchedBridge.registerCallableModule('SamplingProfiler', require('SamplingProfiler'));
BatchedBridge.registerLazyCallableModule('Systrace', () => require('Systrace'));
BatchedBridge.registerLazyCallableModule('JSTimersExecution', () => require('JSTimersExecution'));
BatchedBridge.registerLazyCallableModule('HeapCapture', () => require('HeapCapture'));
BatchedBridge.registerLazyCallableModule('SamplingProfiler', () => require('SamplingProfiler'));
BatchedBridge.registerLazyCallableModule('RCTLog', () => require('RCTLog'));
if (__DEV__) {
if (!global.__RCTProfileIsProfiling) {
@ -117,9 +118,6 @@ if (__DEV__) {
}
}
// RCTLog needs to register with BatchedBridge
require('RCTLog');
// Set up error handler
if (!global.__fbDisableExceptionsManager) {
const handleError = (e, isFatal) => {
@ -226,6 +224,6 @@ if (__DEV__) {
// Just to make sure the JS gets packaged up. Wait until the JS environment has
// been initialized before requiring them.
require('RCTDeviceEventEmitter');
require('RCTNativeAppEventEmitter');
require('PerformanceLogger');
BatchedBridge.registerLazyCallableModule('RCTDeviceEventEmitter', () => require('RCTDeviceEventEmitter'));
BatchedBridge.registerLazyCallableModule('RCTNativeAppEventEmitter', () => require('RCTNativeAppEventEmitter'));
BatchedBridge.registerLazyCallableModule('PerformanceLogger', () => require('PerformanceLogger'));

View File

@ -13,7 +13,6 @@
const EventEmitter = require('EventEmitter');
const EventSubscriptionVendor = require('EventSubscriptionVendor');
const BatchedBridge = require('BatchedBridge');
import type EmitterSubscription from 'EmitterSubscription';
@ -70,11 +69,4 @@ class RCTDeviceEventEmitter extends EventEmitter {
}
}
RCTDeviceEventEmitter = new RCTDeviceEventEmitter();
BatchedBridge.registerCallableModule(
'RCTDeviceEventEmitter',
RCTDeviceEventEmitter
);
module.exports = RCTDeviceEventEmitter;
module.exports = new RCTDeviceEventEmitter();

View File

@ -11,7 +11,6 @@
*/
'use strict';
const BatchedBridge = require('BatchedBridge');
const RCTDeviceEventEmitter = require('RCTDeviceEventEmitter');
/**
@ -19,10 +18,4 @@ const RCTDeviceEventEmitter = require('RCTDeviceEventEmitter');
* adding all event listeners directly to RCTNativeAppEventEmitter.
*/
const RCTNativeAppEventEmitter = RCTDeviceEventEmitter;
BatchedBridge.registerCallableModule(
'RCTNativeAppEventEmitter',
RCTNativeAppEventEmitter
);
module.exports = RCTNativeAppEventEmitter;

View File

@ -12,7 +12,6 @@
*/
'use strict';
const BatchedBridge = require('BatchedBridge');
const Systrace = require('Systrace');
const infoLog = require('infoLog');
@ -179,6 +178,4 @@ const PerformanceLogger = {
},
};
BatchedBridge.registerCallableModule('PerformanceLogger', PerformanceLogger);
module.exports = PerformanceLogger;

View File

@ -11,8 +11,6 @@
*/
'use strict';
const BatchedBridge = require('BatchedBridge');
const invariant = require('fbjs/lib/invariant');
const levelsMap = {
@ -48,9 +46,4 @@ class RCTLog {
}
}
BatchedBridge.registerCallableModule(
'RCTLog',
RCTLog
);
module.exports = RCTLog;