Remove instanceof checks

Summary: Replaced `instanceof` checks with `isSandyPlugin` utility. That is cleaner to read and makes it easier to find places where we make exceptions for Sandy plugins

Reviewed By: jknoxville

Differential Revision: D22206707

fbshipit-source-id: b44a1b585424f3b9bf0d7ce200c34107f03ed55e
This commit is contained in:
Michel Weststrate
2020-07-01 08:58:40 -07:00
committed by Facebook GitHub Bot
parent 1dc9e899b8
commit 04a29315e2
11 changed files with 45 additions and 34 deletions

View File

@@ -7,7 +7,11 @@
* @format * @format
*/ */
import {PluginDefinition, ClientPluginDefinition} from './plugin'; import {
PluginDefinition,
ClientPluginDefinition,
isSandyPlugin,
} from './plugin';
import BaseDevice, {OS} from './devices/BaseDevice'; import BaseDevice, {OS} from './devices/BaseDevice';
import {App} from './App'; import {App} from './App';
import {Logger} from './fb-interfaces/Logger'; import {Logger} from './fb-interfaces/Logger';
@@ -32,7 +36,7 @@ import {sideEffect} from './utils/sideEffect';
import {emitBytesReceived} from './dispatcher/tracking'; import {emitBytesReceived} from './dispatcher/tracking';
import {debounce} from 'lodash'; import {debounce} from 'lodash';
import {batch} from 'react-redux'; import {batch} from 'react-redux';
import {SandyPluginDefinition, SandyPluginInstance} from 'flipper-plugin'; import {SandyPluginInstance} from 'flipper-plugin';
type Plugins = Array<string>; type Plugins = Array<string>;
@@ -313,7 +317,7 @@ export default class Client extends EventEmitter {
) { ) {
// start a plugin on start if it is a SandyPlugin, which is starred, and doesn't have persisted state yet // start a plugin on start if it is a SandyPlugin, which is starred, and doesn't have persisted state yet
if ( if (
plugin instanceof SandyPluginDefinition && isSandyPlugin(plugin) &&
isEnabled && isEnabled &&
!this.sandyPluginStates.has(plugin.id) !this.sandyPluginStates.has(plugin.id)
) { ) {
@@ -455,7 +459,7 @@ export default class Client extends EventEmitter {
// TODO: support Sandy plugins T68683442 // TODO: support Sandy plugins T68683442
if ( if (
persistingPlugin && persistingPlugin &&
!(persistingPlugin instanceof SandyPluginDefinition) && !isSandyPlugin(persistingPlugin) &&
persistingPlugin.persistedStateReducer persistingPlugin.persistedStateReducer
) { ) {
handled = true; handled = true;

View File

@@ -12,6 +12,7 @@ import {
FlipperDevicePlugin, FlipperDevicePlugin,
Props as PluginProps, Props as PluginProps,
PluginDefinition, PluginDefinition,
isSandyPlugin,
} from './plugin'; } from './plugin';
import {Logger} from './fb-interfaces/Logger'; import {Logger} from './fb-interfaces/Logger';
import BaseDevice from './devices/BaseDevice'; import BaseDevice from './devices/BaseDevice';
@@ -46,7 +47,6 @@ import {Message} from './reducers/pluginMessageQueue';
import {Idler} from './utils/Idler'; import {Idler} from './utils/Idler';
import {processMessageQueue} from './utils/messageQueue'; import {processMessageQueue} from './utils/messageQueue';
import {ToggleButton, SmallText} from './ui'; import {ToggleButton, SmallText} from './ui';
import {SandyPluginDefinition} from 'flipper-plugin';
const Container = styled(FlexColumn)({ const Container = styled(FlexColumn)({
width: 0, width: 0,
@@ -193,7 +193,7 @@ class PluginContainer extends PureComponent<Props, State> {
pluginIsEnabled && pluginIsEnabled &&
activePlugin && activePlugin &&
// TODO: support sandy: T68683442 // TODO: support sandy: T68683442
!(activePlugin instanceof SandyPluginDefinition) && !isSandyPlugin(activePlugin) &&
activePlugin.persistedStateReducer && activePlugin.persistedStateReducer &&
pluginKey && pluginKey &&
pendingMessages?.length pendingMessages?.length
@@ -332,7 +332,7 @@ class PluginContainer extends PureComponent<Props, State> {
console.warn(`No selected plugin. Rendering empty!`); console.warn(`No selected plugin. Rendering empty!`);
return null; return null;
} }
if (activePlugin instanceof SandyPluginDefinition) { if (isSandyPlugin(activePlugin)) {
// TODO: // TODO:
return null; return null;
} }

View File

@@ -10,7 +10,7 @@
import {Store} from '../reducers/index'; import {Store} from '../reducers/index';
import {Logger} from '../fb-interfaces/Logger'; import {Logger} from '../fb-interfaces/Logger';
import {PluginNotification} from '../reducers/notifications'; import {PluginNotification} from '../reducers/notifications';
import {PluginDefinition} from '../plugin'; import {PluginDefinition, isSandyPlugin} from '../plugin';
import isHeadless from '../utils/isHeadless'; import isHeadless from '../utils/isHeadless';
import {setStaticView, setDeeplinkPayload} from '../reducers/connections'; import {setStaticView, setDeeplinkPayload} from '../reducers/connections';
import {ipcRenderer, IpcRendererEvent} from 'electron'; import {ipcRenderer, IpcRendererEvent} from 'electron';
@@ -25,7 +25,6 @@ import {deconstructPluginKey} from '../utils/clientUtils';
import NotificationScreen from '../chrome/NotificationScreen'; import NotificationScreen from '../chrome/NotificationScreen';
import {getPluginTitle} from '../utils/pluginUtils'; import {getPluginTitle} from '../utils/pluginUtils';
import {sideEffect} from '../utils/sideEffect'; import {sideEffect} from '../utils/sideEffect';
import {SandyPluginDefinition} from 'flipper-plugin';
type NotificationEvents = 'show' | 'click' | 'close' | 'reply' | 'action'; type NotificationEvents = 'show' | 'click' | 'close' | 'reply' | 'action';
const NOTIFICATION_THROTTLE = 5 * 1000; // in milliseconds const NOTIFICATION_THROTTLE = 5 * 1000; // in milliseconds
@@ -117,7 +116,7 @@ export default (store: Store, logger: Logger) => {
// TODO: add support for Sandy plugins T68683442 // TODO: add support for Sandy plugins T68683442
if ( if (
persistingPlugin && persistingPlugin &&
!(persistingPlugin instanceof SandyPluginDefinition) && !isSandyPlugin(persistingPlugin) &&
persistingPlugin.getActiveNotifications persistingPlugin.getActiveNotifications
) { ) {
try { try {

View File

@@ -37,6 +37,12 @@ export type ClientPluginDefinition =
export type ClientPluginMap = Map<string, ClientPluginDefinition>; export type ClientPluginMap = Map<string, ClientPluginDefinition>;
export type DevicePluginMap = Map<string, DevicePluginDefinition>; export type DevicePluginMap = Map<string, DevicePluginDefinition>;
export function isSandyPlugin(
plugin?: PluginDefinition,
): plugin is SandyPluginDefinition {
return plugin instanceof SandyPluginDefinition;
}
// This function is intended to be called from outside of the plugin. // This function is intended to be called from outside of the plugin.
// If you want to `call` from the plugin use, this.client.call // If you want to `call` from the plugin use, this.client.call
export function callClient( export function callClient(

View File

@@ -28,9 +28,8 @@ import {
defaultEnabledBackgroundPlugins, defaultEnabledBackgroundPlugins,
} from '../utils/pluginUtils'; } from '../utils/pluginUtils';
import {deconstructClientId} from '../utils/clientUtils'; import {deconstructClientId} from '../utils/clientUtils';
import {FlipperDevicePlugin, PluginDefinition} from '../plugin'; import {FlipperDevicePlugin, PluginDefinition, isSandyPlugin} from '../plugin';
import {RegisterPluginAction} from './plugins'; import {RegisterPluginAction} from './plugins';
import {SandyPluginDefinition} from 'flipper-plugin';
export type StaticView = export type StaticView =
| null | null
@@ -438,7 +437,7 @@ export default (state: State = INITAL_STATE, action: Actions): State => {
plugins.forEach((plugin) => { plugins.forEach((plugin) => {
// TODO: T68738317 support sandy device plugin // TODO: T68738317 support sandy device plugin
if ( if (
!(plugin instanceof SandyPluginDefinition) && !isSandyPlugin(plugin) &&
plugin.prototype instanceof FlipperDevicePlugin plugin.prototype instanceof FlipperDevicePlugin
) { ) {
// smell: devices are mutable // smell: devices are mutable

View File

@@ -26,6 +26,7 @@ import {
PluginDefinition, PluginDefinition,
DevicePluginMap, DevicePluginMap,
ClientPluginMap, ClientPluginMap,
isSandyPlugin,
} from '../plugin'; } from '../plugin';
import {default as BaseDevice} from '../devices/BaseDevice'; import {default as BaseDevice} from '../devices/BaseDevice';
import {default as ArchivedDevice} from '../devices/ArchivedDevice'; import {default as ArchivedDevice} from '../devices/ArchivedDevice';
@@ -49,7 +50,6 @@ import {processMessageQueue} from './messageQueue';
import {getPluginTitle} from './pluginUtils'; import {getPluginTitle} from './pluginUtils';
import {capture} from './screenshot'; import {capture} from './screenshot';
import {uploadFlipperMedia} from '../fb-stubs/user'; import {uploadFlipperMedia} from '../fb-stubs/user';
import {SandyPluginDefinition} from 'flipper-plugin';
export const IMPORT_FLIPPER_TRACE_EVENT = 'import-flipper-trace'; export const IMPORT_FLIPPER_TRACE_EVENT = 'import-flipper-trace';
export const EXPORT_FLIPPER_TRACE_EVENT = 'export-flipper-trace'; export const EXPORT_FLIPPER_TRACE_EVENT = 'export-flipper-trace';
@@ -223,7 +223,7 @@ const serializePluginStates = async (
const pluginsMap: Map<string, typeof FlipperBasePlugin> = new Map([]); const pluginsMap: Map<string, typeof FlipperBasePlugin> = new Map([]);
clientPlugins.forEach((val, key) => { clientPlugins.forEach((val, key) => {
// TODO: Support Sandy T68683449 and use ClientPluginsMap // TODO: Support Sandy T68683449 and use ClientPluginsMap
if (!(val instanceof SandyPluginDefinition)) { if (!isSandyPlugin(val)) {
pluginsMap.set(key, val); pluginsMap.set(key, val);
} }
}); });
@@ -260,7 +260,7 @@ const deserializePluginStates = (
const pluginsMap: Map<string, typeof FlipperBasePlugin> = new Map([]); const pluginsMap: Map<string, typeof FlipperBasePlugin> = new Map([]);
clientPlugins.forEach((val, key) => { clientPlugins.forEach((val, key) => {
// TODO: Support Sandy T68683449 // TODO: Support Sandy T68683449
if (!(val instanceof SandyPluginDefinition)) pluginsMap.set(key, val); if (!isSandyPlugin(val)) pluginsMap.set(key, val);
}); });
devicePlugins.forEach((val, key) => { devicePlugins.forEach((val, key) => {
pluginsMap.set(key, val); pluginsMap.set(key, val);
@@ -522,10 +522,7 @@ async function processQueues(
pluginClass, pluginClass,
} of pluginsToProcess) { } of pluginsToProcess) {
// TODO: Support Sandy T68683449 // TODO: Support Sandy T68683449
if ( if (!isSandyPlugin(pluginClass) && pluginClass.persistedStateReducer) {
!(pluginClass instanceof SandyPluginDefinition) &&
pluginClass.persistedStateReducer
) {
const processQueueMarker = `${EXPORT_FLIPPER_TRACE_EVENT}:process-queue-per-plugin`; const processQueueMarker = `${EXPORT_FLIPPER_TRACE_EVENT}:process-queue-per-plugin`;
performance.mark(processQueueMarker); performance.mark(processQueueMarker);

View File

@@ -19,8 +19,7 @@ import {
import {deserializeObject} from './serialization'; import {deserializeObject} from './serialization';
import {deconstructPluginKey} from './clientUtils'; import {deconstructPluginKey} from './clientUtils';
import {pluginsClassMap} from './pluginUtils'; import {pluginsClassMap} from './pluginUtils';
import {PluginDefinition} from '../plugin'; import {PluginDefinition, isSandyPlugin} from '../plugin';
import {SandyPluginDefinition} from 'flipper-plugin';
export type MetricType = {[metricName: string]: number}; export type MetricType = {[metricName: string]: number};
type MetricPluginType = {[pluginID: string]: MetricType}; type MetricPluginType = {[pluginID: string]: MetricType};
@@ -48,7 +47,7 @@ async function exportMetrics(
const metricsReducer: const metricsReducer:
| (<U>(persistedState: U) => Promise<MetricType>) | (<U>(persistedState: U) => Promise<MetricType>)
| undefined = | undefined =
pluginClass && !(pluginClass instanceof SandyPluginDefinition) pluginClass && !isSandyPlugin(pluginClass)
? pluginClass.metricsReducer ? pluginClass.metricsReducer
: undefined; : undefined;
if (pluginsMap.has(pluginName) && metricsReducer) { if (pluginsMap.has(pluginName) && metricsReducer) {

View File

@@ -7,7 +7,11 @@
* @format * @format
*/ */
import {PersistedStateReducer, FlipperDevicePlugin} from '../plugin'; import {
PersistedStateReducer,
FlipperDevicePlugin,
isSandyPlugin,
} from '../plugin';
import {State, MiddlewareAPI} from '../reducers/index'; import {State, MiddlewareAPI} from '../reducers/index';
import {setPluginState} from '../reducers/pluginStates'; import {setPluginState} from '../reducers/pluginStates';
import {flipperRecorderAddEvent} from './pluginStateRecorder'; import {flipperRecorderAddEvent} from './pluginStateRecorder';
@@ -200,7 +204,8 @@ export function processMessagesLater(
| SandyPluginDefinition, | SandyPluginDefinition,
messages: Message[], messages: Message[],
) { ) {
if (plugin instanceof SandyPluginDefinition) { // @ts-ignore
if (isSandyPlugin(plugin)) {
// TODO: // TODO:
throw new Error( throw new Error(
'Receiving messages is not yet supported for Sandy plugins', 'Receiving messages is not yet supported for Sandy plugins',

View File

@@ -8,11 +8,15 @@
*/ */
import {Store} from '../reducers/index'; import {Store} from '../reducers/index';
import {ClientPluginMap, DevicePluginMap, PluginDefinition} from '../plugin'; import {
ClientPluginMap,
DevicePluginMap,
PluginDefinition,
isSandyPlugin,
} from '../plugin';
import {setPluginState} from '../reducers/pluginStates'; import {setPluginState} from '../reducers/pluginStates';
import BaseDevice from '../devices/BaseDevice'; import BaseDevice from '../devices/BaseDevice';
import {getPersistedState} from '../utils/pluginUtils'; import {getPersistedState} from '../utils/pluginUtils';
import {SandyPluginDefinition} from 'flipper-plugin';
export function registerDeviceCallbackOnPlugins( export function registerDeviceCallbackOnPlugins(
store: Store, store: Store,
@@ -22,7 +26,7 @@ export function registerDeviceCallbackOnPlugins(
) { ) {
const callRegisterDeviceHook = (plugin: PluginDefinition) => { const callRegisterDeviceHook = (plugin: PluginDefinition) => {
// This hook is not registered for Sandy plugins, let's see in the future if it is needed // This hook is not registered for Sandy plugins, let's see in the future if it is needed
if (!(plugin instanceof SandyPluginDefinition) && plugin.onRegisterDevice) { if (!isSandyPlugin(plugin) && plugin.onRegisterDevice) {
plugin.onRegisterDevice( plugin.onRegisterDevice(
store, store,
device, device,

View File

@@ -12,7 +12,7 @@ import fs from 'fs';
import {Store, State} from '../reducers'; import {Store, State} from '../reducers';
import {getPluginKey} from './pluginUtils'; import {getPluginKey} from './pluginUtils';
import {serialize} from './serialization'; import {serialize} from './serialization';
import {SandyPluginDefinition} from 'flipper-plugin'; import {isSandyPlugin} from '../plugin';
let pluginRecordingState: { let pluginRecordingState: {
recording: string; recording: string;
@@ -69,9 +69,7 @@ async function flipperStartPluginRecording(state: State) {
// device state, and is used for creating Flipper Exports. // device state, and is used for creating Flipper Exports.
pluginRecordingState.startState = await serialize( pluginRecordingState.startState = await serialize(
state.pluginStates[pluginKey] || state.pluginStates[pluginKey] ||
(plugin instanceof SandyPluginDefinition (isSandyPlugin(plugin) ? {} : plugin.defaultPersistedState),
? {}
: plugin.defaultPersistedState),
); );
console.log( console.log(

View File

@@ -12,13 +12,13 @@ import {
FlipperBasePlugin, FlipperBasePlugin,
PluginDefinition, PluginDefinition,
DevicePluginDefinition, DevicePluginDefinition,
isSandyPlugin,
} from '../plugin'; } from '../plugin';
import {State as PluginStatesState} from '../reducers/pluginStates'; import {State as PluginStatesState} from '../reducers/pluginStates';
import {State as PluginsState} from '../reducers/plugins'; import {State as PluginsState} from '../reducers/plugins';
import {State as PluginMessageQueueState} from '../reducers/pluginMessageQueue'; import {State as PluginMessageQueueState} from '../reducers/pluginMessageQueue';
import {PluginDetails} from 'flipper-plugin-lib'; import {PluginDetails} from 'flipper-plugin-lib';
import {deconstructPluginKey, deconstructClientId} from './clientUtils'; import {deconstructPluginKey, deconstructClientId} from './clientUtils';
import {SandyPluginDefinition} from 'flipper-plugin';
type Client = import('../Client').default; type Client = import('../Client').default;
@@ -205,7 +205,7 @@ export function getPersistentPlugins(plugins: PluginsState): Array<string> {
plugin == 'DeviceLogs' || plugin == 'DeviceLogs' ||
(pluginClass && (pluginClass &&
// TODO: support Sandy plugin T68683449 // TODO: support Sandy plugin T68683449
!(pluginClass instanceof SandyPluginDefinition) && !isSandyPlugin(pluginClass) &&
(pluginClass.defaultPersistedState != undefined || (pluginClass.defaultPersistedState != undefined ||
pluginClass.exportPersistedState != undefined)) pluginClass.exportPersistedState != undefined))
); );