diff --git a/desktop/app/src/Client.tsx b/desktop/app/src/Client.tsx index 65de1bd0e..302257710 100644 --- a/desktop/app/src/Client.tsx +++ b/desktop/app/src/Client.tsx @@ -7,7 +7,11 @@ * @format */ -import {PluginDefinition, ClientPluginDefinition} from './plugin'; +import { + PluginDefinition, + ClientPluginDefinition, + isSandyPlugin, +} from './plugin'; import BaseDevice, {OS} from './devices/BaseDevice'; import {App} from './App'; import {Logger} from './fb-interfaces/Logger'; @@ -32,7 +36,7 @@ import {sideEffect} from './utils/sideEffect'; import {emitBytesReceived} from './dispatcher/tracking'; import {debounce} from 'lodash'; import {batch} from 'react-redux'; -import {SandyPluginDefinition, SandyPluginInstance} from 'flipper-plugin'; +import {SandyPluginInstance} from 'flipper-plugin'; type Plugins = Array; @@ -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 if ( - plugin instanceof SandyPluginDefinition && + isSandyPlugin(plugin) && isEnabled && !this.sandyPluginStates.has(plugin.id) ) { @@ -455,7 +459,7 @@ export default class Client extends EventEmitter { // TODO: support Sandy plugins T68683442 if ( persistingPlugin && - !(persistingPlugin instanceof SandyPluginDefinition) && + !isSandyPlugin(persistingPlugin) && persistingPlugin.persistedStateReducer ) { handled = true; diff --git a/desktop/app/src/PluginContainer.tsx b/desktop/app/src/PluginContainer.tsx index 82fdd275b..3e45dc4cf 100644 --- a/desktop/app/src/PluginContainer.tsx +++ b/desktop/app/src/PluginContainer.tsx @@ -12,6 +12,7 @@ import { FlipperDevicePlugin, Props as PluginProps, PluginDefinition, + isSandyPlugin, } from './plugin'; import {Logger} from './fb-interfaces/Logger'; import BaseDevice from './devices/BaseDevice'; @@ -46,7 +47,6 @@ import {Message} from './reducers/pluginMessageQueue'; import {Idler} from './utils/Idler'; import {processMessageQueue} from './utils/messageQueue'; import {ToggleButton, SmallText} from './ui'; -import {SandyPluginDefinition} from 'flipper-plugin'; const Container = styled(FlexColumn)({ width: 0, @@ -193,7 +193,7 @@ class PluginContainer extends PureComponent { pluginIsEnabled && activePlugin && // TODO: support sandy: T68683442 - !(activePlugin instanceof SandyPluginDefinition) && + !isSandyPlugin(activePlugin) && activePlugin.persistedStateReducer && pluginKey && pendingMessages?.length @@ -332,7 +332,7 @@ class PluginContainer extends PureComponent { console.warn(`No selected plugin. Rendering empty!`); return null; } - if (activePlugin instanceof SandyPluginDefinition) { + if (isSandyPlugin(activePlugin)) { // TODO: return null; } diff --git a/desktop/app/src/dispatcher/notifications.tsx b/desktop/app/src/dispatcher/notifications.tsx index 08dfaa757..cf5b73a03 100644 --- a/desktop/app/src/dispatcher/notifications.tsx +++ b/desktop/app/src/dispatcher/notifications.tsx @@ -10,7 +10,7 @@ import {Store} from '../reducers/index'; import {Logger} from '../fb-interfaces/Logger'; import {PluginNotification} from '../reducers/notifications'; -import {PluginDefinition} from '../plugin'; +import {PluginDefinition, isSandyPlugin} from '../plugin'; import isHeadless from '../utils/isHeadless'; import {setStaticView, setDeeplinkPayload} from '../reducers/connections'; import {ipcRenderer, IpcRendererEvent} from 'electron'; @@ -25,7 +25,6 @@ import {deconstructPluginKey} from '../utils/clientUtils'; import NotificationScreen from '../chrome/NotificationScreen'; import {getPluginTitle} from '../utils/pluginUtils'; import {sideEffect} from '../utils/sideEffect'; -import {SandyPluginDefinition} from 'flipper-plugin'; type NotificationEvents = 'show' | 'click' | 'close' | 'reply' | 'action'; const NOTIFICATION_THROTTLE = 5 * 1000; // in milliseconds @@ -117,7 +116,7 @@ export default (store: Store, logger: Logger) => { // TODO: add support for Sandy plugins T68683442 if ( persistingPlugin && - !(persistingPlugin instanceof SandyPluginDefinition) && + !isSandyPlugin(persistingPlugin) && persistingPlugin.getActiveNotifications ) { try { diff --git a/desktop/app/src/plugin.tsx b/desktop/app/src/plugin.tsx index 594890dd6..fd8b64506 100644 --- a/desktop/app/src/plugin.tsx +++ b/desktop/app/src/plugin.tsx @@ -37,6 +37,12 @@ export type ClientPluginDefinition = export type ClientPluginMap = Map; export type DevicePluginMap = Map; +export function isSandyPlugin( + plugin?: PluginDefinition, +): plugin is SandyPluginDefinition { + return plugin instanceof SandyPluginDefinition; +} + // This function is intended to be called from outside of the plugin. // If you want to `call` from the plugin use, this.client.call export function callClient( diff --git a/desktop/app/src/reducers/connections.tsx b/desktop/app/src/reducers/connections.tsx index 8398f736f..03c66f385 100644 --- a/desktop/app/src/reducers/connections.tsx +++ b/desktop/app/src/reducers/connections.tsx @@ -28,9 +28,8 @@ import { defaultEnabledBackgroundPlugins, } from '../utils/pluginUtils'; import {deconstructClientId} from '../utils/clientUtils'; -import {FlipperDevicePlugin, PluginDefinition} from '../plugin'; +import {FlipperDevicePlugin, PluginDefinition, isSandyPlugin} from '../plugin'; import {RegisterPluginAction} from './plugins'; -import {SandyPluginDefinition} from 'flipper-plugin'; export type StaticView = | null @@ -438,7 +437,7 @@ export default (state: State = INITAL_STATE, action: Actions): State => { plugins.forEach((plugin) => { // TODO: T68738317 support sandy device plugin if ( - !(plugin instanceof SandyPluginDefinition) && + !isSandyPlugin(plugin) && plugin.prototype instanceof FlipperDevicePlugin ) { // smell: devices are mutable diff --git a/desktop/app/src/utils/exportData.tsx b/desktop/app/src/utils/exportData.tsx index 066c88085..71374d069 100644 --- a/desktop/app/src/utils/exportData.tsx +++ b/desktop/app/src/utils/exportData.tsx @@ -26,6 +26,7 @@ import { PluginDefinition, DevicePluginMap, ClientPluginMap, + isSandyPlugin, } from '../plugin'; import {default as BaseDevice} from '../devices/BaseDevice'; import {default as ArchivedDevice} from '../devices/ArchivedDevice'; @@ -49,7 +50,6 @@ import {processMessageQueue} from './messageQueue'; import {getPluginTitle} from './pluginUtils'; import {capture} from './screenshot'; import {uploadFlipperMedia} from '../fb-stubs/user'; -import {SandyPluginDefinition} from 'flipper-plugin'; export const IMPORT_FLIPPER_TRACE_EVENT = 'import-flipper-trace'; export const EXPORT_FLIPPER_TRACE_EVENT = 'export-flipper-trace'; @@ -223,7 +223,7 @@ const serializePluginStates = async ( const pluginsMap: Map = new Map([]); clientPlugins.forEach((val, key) => { // TODO: Support Sandy T68683449 and use ClientPluginsMap - if (!(val instanceof SandyPluginDefinition)) { + if (!isSandyPlugin(val)) { pluginsMap.set(key, val); } }); @@ -260,7 +260,7 @@ const deserializePluginStates = ( const pluginsMap: Map = new Map([]); clientPlugins.forEach((val, key) => { // TODO: Support Sandy T68683449 - if (!(val instanceof SandyPluginDefinition)) pluginsMap.set(key, val); + if (!isSandyPlugin(val)) pluginsMap.set(key, val); }); devicePlugins.forEach((val, key) => { pluginsMap.set(key, val); @@ -522,10 +522,7 @@ async function processQueues( pluginClass, } of pluginsToProcess) { // TODO: Support Sandy T68683449 - if ( - !(pluginClass instanceof SandyPluginDefinition) && - pluginClass.persistedStateReducer - ) { + if (!isSandyPlugin(pluginClass) && pluginClass.persistedStateReducer) { const processQueueMarker = `${EXPORT_FLIPPER_TRACE_EVENT}:process-queue-per-plugin`; performance.mark(processQueueMarker); diff --git a/desktop/app/src/utils/exportMetrics.tsx b/desktop/app/src/utils/exportMetrics.tsx index 7542019c5..2bcd515ba 100644 --- a/desktop/app/src/utils/exportMetrics.tsx +++ b/desktop/app/src/utils/exportMetrics.tsx @@ -19,8 +19,7 @@ import { import {deserializeObject} from './serialization'; import {deconstructPluginKey} from './clientUtils'; import {pluginsClassMap} from './pluginUtils'; -import {PluginDefinition} from '../plugin'; -import {SandyPluginDefinition} from 'flipper-plugin'; +import {PluginDefinition, isSandyPlugin} from '../plugin'; export type MetricType = {[metricName: string]: number}; type MetricPluginType = {[pluginID: string]: MetricType}; @@ -48,7 +47,7 @@ async function exportMetrics( const metricsReducer: | ((persistedState: U) => Promise) | undefined = - pluginClass && !(pluginClass instanceof SandyPluginDefinition) + pluginClass && !isSandyPlugin(pluginClass) ? pluginClass.metricsReducer : undefined; if (pluginsMap.has(pluginName) && metricsReducer) { diff --git a/desktop/app/src/utils/messageQueue.tsx b/desktop/app/src/utils/messageQueue.tsx index 617d402f2..d853c0817 100644 --- a/desktop/app/src/utils/messageQueue.tsx +++ b/desktop/app/src/utils/messageQueue.tsx @@ -7,7 +7,11 @@ * @format */ -import {PersistedStateReducer, FlipperDevicePlugin} from '../plugin'; +import { + PersistedStateReducer, + FlipperDevicePlugin, + isSandyPlugin, +} from '../plugin'; import {State, MiddlewareAPI} from '../reducers/index'; import {setPluginState} from '../reducers/pluginStates'; import {flipperRecorderAddEvent} from './pluginStateRecorder'; @@ -200,7 +204,8 @@ export function processMessagesLater( | SandyPluginDefinition, messages: Message[], ) { - if (plugin instanceof SandyPluginDefinition) { + // @ts-ignore + if (isSandyPlugin(plugin)) { // TODO: throw new Error( 'Receiving messages is not yet supported for Sandy plugins', diff --git a/desktop/app/src/utils/onRegisterDevice.tsx b/desktop/app/src/utils/onRegisterDevice.tsx index 067fa6076..08784cb4c 100644 --- a/desktop/app/src/utils/onRegisterDevice.tsx +++ b/desktop/app/src/utils/onRegisterDevice.tsx @@ -8,11 +8,15 @@ */ import {Store} from '../reducers/index'; -import {ClientPluginMap, DevicePluginMap, PluginDefinition} from '../plugin'; +import { + ClientPluginMap, + DevicePluginMap, + PluginDefinition, + isSandyPlugin, +} from '../plugin'; import {setPluginState} from '../reducers/pluginStates'; import BaseDevice from '../devices/BaseDevice'; import {getPersistedState} from '../utils/pluginUtils'; -import {SandyPluginDefinition} from 'flipper-plugin'; export function registerDeviceCallbackOnPlugins( store: Store, @@ -22,7 +26,7 @@ export function registerDeviceCallbackOnPlugins( ) { const callRegisterDeviceHook = (plugin: PluginDefinition) => { // 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( store, device, diff --git a/desktop/app/src/utils/pluginStateRecorder.tsx b/desktop/app/src/utils/pluginStateRecorder.tsx index 8d507163a..1c57bd819 100644 --- a/desktop/app/src/utils/pluginStateRecorder.tsx +++ b/desktop/app/src/utils/pluginStateRecorder.tsx @@ -12,7 +12,7 @@ import fs from 'fs'; import {Store, State} from '../reducers'; import {getPluginKey} from './pluginUtils'; import {serialize} from './serialization'; -import {SandyPluginDefinition} from 'flipper-plugin'; +import {isSandyPlugin} from '../plugin'; let pluginRecordingState: { recording: string; @@ -69,9 +69,7 @@ async function flipperStartPluginRecording(state: State) { // device state, and is used for creating Flipper Exports. pluginRecordingState.startState = await serialize( state.pluginStates[pluginKey] || - (plugin instanceof SandyPluginDefinition - ? {} - : plugin.defaultPersistedState), + (isSandyPlugin(plugin) ? {} : plugin.defaultPersistedState), ); console.log( diff --git a/desktop/app/src/utils/pluginUtils.tsx b/desktop/app/src/utils/pluginUtils.tsx index 71df4acea..41ee2cc4c 100644 --- a/desktop/app/src/utils/pluginUtils.tsx +++ b/desktop/app/src/utils/pluginUtils.tsx @@ -12,13 +12,13 @@ import { FlipperBasePlugin, PluginDefinition, DevicePluginDefinition, + isSandyPlugin, } from '../plugin'; import {State as PluginStatesState} from '../reducers/pluginStates'; import {State as PluginsState} from '../reducers/plugins'; import {State as PluginMessageQueueState} from '../reducers/pluginMessageQueue'; import {PluginDetails} from 'flipper-plugin-lib'; import {deconstructPluginKey, deconstructClientId} from './clientUtils'; -import {SandyPluginDefinition} from 'flipper-plugin'; type Client = import('../Client').default; @@ -205,7 +205,7 @@ export function getPersistentPlugins(plugins: PluginsState): Array { plugin == 'DeviceLogs' || (pluginClass && // TODO: support Sandy plugin T68683449 - !(pluginClass instanceof SandyPluginDefinition) && + !isSandyPlugin(pluginClass) && (pluginClass.defaultPersistedState != undefined || pluginClass.exportPersistedState != undefined)) );