Fix error handling in plugin loading

Summary: If a device plugin throw an error in it's initialization, it would prevent the device itself from being registered. This fixes that. As shown in the comments of for example: https://fb.workplace.com/groups/flippersupport/permalink/1218627761951213/

Reviewed By: ananyaarun

Differential Revision: D31127969

fbshipit-source-id: 9824d23b275f1f9e866f841035961e4707ff8e04
This commit is contained in:
Michel Weststrate
2021-09-23 02:51:55 -07:00
committed by Facebook GitHub Bot
parent 40f20f6785
commit a72e46c792
2 changed files with 38 additions and 32 deletions

View File

@@ -32,6 +32,7 @@ import {
getFlipperLib,
timeout,
ClientQuery,
_SandyPluginDefinition,
} from 'flipper-plugin';
import {freeze} from 'immer';
import GK from './fb-stubs/GK';
@@ -210,17 +211,7 @@ export default class Client extends EventEmitter {
this.plugins.forEach((pluginId) => {
const plugin = this.getPlugin(pluginId);
if (plugin) {
// TODO: needs to be wrapped in error tracking T68955280
this.sandyPluginStates.set(
plugin.id,
new _SandyPluginInstance(
getFlipperLib(),
plugin,
this,
getPluginKey(this.id, {serial: this.query.device_id}, plugin.id),
initialStates[pluginId],
),
);
this.loadPlugin(plugin, initialStates[pluginId]);
}
});
return this;
@@ -237,6 +228,26 @@ export default class Client extends EventEmitter {
return plugins;
}
loadPlugin(
plugin: _SandyPluginDefinition,
initialState?: Record<string, any>,
) {
try {
this.sandyPluginStates.set(
plugin.id,
new _SandyPluginInstance(
getFlipperLib(),
plugin,
this,
getPluginKey(this.id, {serial: this.query.device_id}, plugin.id),
initialState,
),
);
} catch (e) {
console.error(`Failed to start plugin '${plugin.id}': `, e);
}
}
startPluginIfNeeded(
plugin: PluginDefinition | undefined,
isEnabled = plugin ? this.isEnabledPlugin(plugin.id) : false,
@@ -247,16 +258,7 @@ export default class Client extends EventEmitter {
(isEnabled || defaultEnabledBackgroundPlugins.includes(plugin.id)) &&
!this.sandyPluginStates.has(plugin.id)
) {
// TODO: needs to be wrapped in error tracking T68955280
this.sandyPluginStates.set(
plugin.id,
new _SandyPluginInstance(
getFlipperLib(),
plugin,
this,
getPluginKey(this.id, {serial: this.query.device_id}, plugin.id),
),
);
this.loadPlugin(plugin);
}
}

View File

@@ -306,17 +306,21 @@ export default class BaseDevice implements Device {
}
this.hasDevicePlugins = true;
if (plugin instanceof _SandyPluginDefinition) {
this.sandyPluginStates.set(
plugin.id,
new _SandyDevicePluginInstance(
getFlipperLib(),
plugin,
this,
// break circular dep, one of those days again...
getPluginKey(undefined, {serial: this.serial}, plugin.id),
initialState,
),
);
try {
this.sandyPluginStates.set(
plugin.id,
new _SandyDevicePluginInstance(
getFlipperLib(),
plugin,
this,
// break circular dep, one of those days again...
getPluginKey(undefined, {serial: this.serial}, plugin.id),
initialState,
),
);
} catch (e) {
console.error(`Failed to start device plugin '${plugin.id}': `, e);
}
}
}