Don't die when flipper isn't initialized and a plugin is used

Summary: This diff makes sure that the app doesn't die, or dies in a meaningful way if things are misconfigured.

Reviewed By: passy

Differential Revision: D19468273

fbshipit-source-id: 2471c263391906113446af57d795d1199eb1730e
This commit is contained in:
Michel Weststrate
2020-01-23 07:09:51 -08:00
committed by Facebook Github Bot
parent 0fa0899299
commit e306aeb010
4 changed files with 38 additions and 5 deletions

View File

@@ -7,6 +7,7 @@
package com.facebook.flipper.reactnative; package com.facebook.flipper.reactnative;
import com.facebook.react.bridge.Callback;
import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.ReactMethod;
@@ -40,8 +41,9 @@ public class FlipperModule extends ReactContextBaseJavaModule {
} }
@ReactMethod @ReactMethod
public void registerPlugin(final String pluginId, final Boolean inBackground) { public void registerPlugin(
this.manager.registerPlugin(this, pluginId, inBackground); final String pluginId, final Boolean inBackground, final Callback statusCallback) {
this.manager.registerPlugin(this, pluginId, inBackground, statusCallback);
} }
@ReactMethod @ReactMethod

View File

@@ -12,6 +12,7 @@ import com.facebook.flipper.core.FlipperArray;
import com.facebook.flipper.core.FlipperClient; import com.facebook.flipper.core.FlipperClient;
import com.facebook.flipper.core.FlipperObject; import com.facebook.flipper.core.FlipperObject;
import com.facebook.flipper.core.FlipperResponder; import com.facebook.flipper.core.FlipperResponder;
import com.facebook.react.bridge.Callback;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicLong;
@@ -51,7 +52,15 @@ public class FlipperReactNativeJavaScriptPluginManager {
} }
public void registerPlugin( public void registerPlugin(
FlipperModule module, final String pluginId, final Boolean inBackground) { FlipperModule module,
final String pluginId,
final Boolean inBackground,
final Callback statusCallback) {
if (this.flipperClient == null) {
// Flipper is not available in this build
statusCallback.invoke("noflipper");
return;
}
FlipperReactNativeJavaScriptPlugin existing = getPlugin(pluginId); FlipperReactNativeJavaScriptPlugin existing = getPlugin(pluginId);
if (existing != null) { if (existing != null) {
// Make sure events are emitted on the right application context // Make sure events are emitted on the right application context
@@ -60,6 +69,7 @@ public class FlipperReactNativeJavaScriptPluginManager {
if (existing.isConnected()) { if (existing.isConnected()) {
existing.fireOnConnect(); existing.fireOnConnect();
} }
statusCallback.invoke("ok");
return; return;
} }
// we always create a new plugin class on the fly, // we always create a new plugin class on the fly,
@@ -69,6 +79,7 @@ public class FlipperReactNativeJavaScriptPluginManager {
// inner class with no new members // inner class with no new members
}; };
this.flipperClient.addPlugin(plugin); this.flipperClient.addPlugin(plugin);
statusCallback.invoke("ok");
} }
public void send(String pluginId, String method, String data) { public void send(String pluginId, String method, String data) {

View File

@@ -64,6 +64,7 @@ declare module 'Flipper' {
export function registerPlugin( export function registerPlugin(
pluginId: string, pluginId: string,
runInBackground: boolean, runInBackground: boolean,
statusCallback: (status: 'noflipper' | 'ok') => void,
): void; ): void;
export function send(pluginId: string, method: string, data: string): void; export function send(pluginId: string, method: string, data: string): void;
export function reportErrorWithMetadata( export function reportErrorWithMetadata(

View File

@@ -125,6 +125,10 @@ function startEventListeners() {
// $FlowFixMe // $FlowFixMe
export function addPlugin(plugin) { export function addPlugin(plugin) {
if (!Flipper) {
printNoFlipperWarning();
return;
}
if (!plugin || typeof plugin !== 'object') { if (!plugin || typeof plugin !== 'object') {
throw new Error('Expected plugin, got ' + plugin); throw new Error('Expected plugin, got ' + plugin);
} }
@@ -141,7 +145,22 @@ export function addPlugin(plugin) {
plugin._connection = new Connection(id); plugin._connection = new Connection(id);
plugins[id] = plugin; plugins[id] = plugin;
Flipper.registerPlugin(id, runInBackground); Flipper.registerPlugin(id, runInBackground, status => {
if (status === 'noflipper') {
printNoFlipperWarning();
}
});
} }
startEventListeners(); function printNoFlipperWarning() {
// $FlowFixMe
if (typeof __DEV__ !== 'undefined' && __DEV__) {
console.warn(
'The native module for Flipper seems unavailable. Make sure `initializeFlipper(this, getReactNativeHost().getReactInstanceManager()` is called in MainApplication.java:onCreate, and that `react-native-flipper` is installed as yarn dependency',
);
}
}
if (Flipper) {
startEventListeners();
}