diff --git a/desktop/app/src/Client.tsx b/desktop/app/src/Client.tsx index f8d32c06e..9086cca61 100644 --- a/desktop/app/src/Client.tsx +++ b/desktop/app/src/Client.tsx @@ -8,7 +8,7 @@ */ import {PluginDefinition} from './plugin'; -import BaseDevice, {OS} from './devices/BaseDevice'; +import BaseDevice, {OS} from './server/devices/BaseDevice'; import {Logger} from './fb-interfaces/Logger'; import {Store} from './reducers/index'; import {performance} from 'perf_hooks'; @@ -16,10 +16,9 @@ import {reportPluginFailures} from './utils/metrics'; import {default as isProduction} from './utils/isProduction'; import {EventEmitter} from 'events'; import invariant from 'invariant'; -import { - getPluginKey, - defaultEnabledBackgroundPlugins, -} from './utils/pluginUtils'; +import {getPluginKey} from './utils/pluginKey'; + +import {defaultEnabledBackgroundPlugins} from './utils/pluginUtils'; import {processMessagesLater} from './utils/messageQueue'; import {emitBytesReceived} from './dispatcher/tracking'; import {debounce} from 'lodash'; @@ -36,7 +35,7 @@ import { ConnectionStatus, ErrorType, ClientConnection, -} from './comms/ClientConnection'; +} from './server/comms/ClientConnection'; type Plugins = Set; type PluginsArr = Array; diff --git a/desktop/app/src/PluginContainer.tsx b/desktop/app/src/PluginContainer.tsx index ca8d71c20..7e4a44d00 100644 --- a/desktop/app/src/PluginContainer.tsx +++ b/desktop/app/src/PluginContainer.tsx @@ -9,8 +9,8 @@ import {FlipperPlugin, FlipperDevicePlugin} from './plugin'; import {Logger} from './fb-interfaces/Logger'; -import BaseDevice from './devices/BaseDevice'; -import {pluginKey as getPluginKey} from './utils/pluginUtils'; +import BaseDevice from './server/devices/BaseDevice'; +import {pluginKey as getPluginKey} from './utils/pluginKey'; import Client from './Client'; import { ErrorBoundary, diff --git a/desktop/app/src/__tests__/disconnect.node.tsx b/desktop/app/src/__tests__/disconnect.node.tsx index 557860028..dd475040b 100644 --- a/desktop/app/src/__tests__/disconnect.node.tsx +++ b/desktop/app/src/__tests__/disconnect.node.tsx @@ -7,7 +7,7 @@ * @format */ -import {default as BaseDevice} from '../devices/BaseDevice'; +import {default as BaseDevice} from '../server/devices/BaseDevice'; import {createMockFlipperWithPlugin} from '../test-utils/createMockFlipperWithPlugin'; import { TestUtils, diff --git a/desktop/app/src/chrome/JSEmulatorLauncherSheet.tsx b/desktop/app/src/chrome/JSEmulatorLauncherSheet.tsx index 27d49e9e2..7a2bec80f 100644 --- a/desktop/app/src/chrome/JSEmulatorLauncherSheet.tsx +++ b/desktop/app/src/chrome/JSEmulatorLauncherSheet.tsx @@ -11,7 +11,7 @@ import {Button} from '../ui'; import React, {Component} from 'react'; import {connect} from 'react-redux'; import {State as Store} from '../reducers'; -import {launchJsEmulator} from '../utils/js-client-server-utils/serverUtils'; +import {launchJsEmulator} from '../server/utils/js-client-server-utils/serverUtils'; import {updateSettings, Action} from '../reducers/settings'; import {Settings} from '../reducers/settings'; import {Collapse, Form, Input as AntInput} from 'antd'; diff --git a/desktop/app/src/chrome/MetroButton.tsx b/desktop/app/src/chrome/MetroButton.tsx index cfa1fdfea..03b121fd4 100644 --- a/desktop/app/src/chrome/MetroButton.tsx +++ b/desktop/app/src/chrome/MetroButton.tsx @@ -8,7 +8,7 @@ */ import React, {useCallback, useEffect, useState} from 'react'; -import MetroDevice, {MetroReportableEvent} from '../devices/MetroDevice'; +import MetroDevice, {MetroReportableEvent} from '../server/devices/MetroDevice'; import {useStore} from '../utils/useStore'; import {Button as AntButton} from 'antd'; import {MenuOutlined, ReloadOutlined} from '@ant-design/icons'; diff --git a/desktop/app/src/chrome/VideoRecordingButton.tsx b/desktop/app/src/chrome/VideoRecordingButton.tsx index 5d899238f..e6e0266f6 100644 --- a/desktop/app/src/chrome/VideoRecordingButton.tsx +++ b/desktop/app/src/chrome/VideoRecordingButton.tsx @@ -8,7 +8,7 @@ */ import React, {Component} from 'react'; -import BaseDevice from '../devices/BaseDevice'; +import BaseDevice from '../server/devices/BaseDevice'; import {Button, Glyph, colors} from '../ui'; import path from 'path'; import os from 'os'; diff --git a/desktop/app/src/dispatcher/__tests__/iOSDevice.node.tsx b/desktop/app/src/dispatcher/__tests__/iOSDevice.node.tsx index 6cadfa95b..cf74dc281 100644 --- a/desktop/app/src/dispatcher/__tests__/iOSDevice.node.tsx +++ b/desktop/app/src/dispatcher/__tests__/iOSDevice.node.tsx @@ -14,7 +14,7 @@ import { import configureStore from 'redux-mock-store'; import {State, createRootReducer} from '../../reducers/index'; import {getInstance} from '../../fb-stubs/Logger'; -import {IOSBridge} from '../../utils/IOSBridge'; +import {IOSBridge} from '../../server/utils/IOSBridge'; const mockStore = configureStore([])( createRootReducer()(undefined, {type: 'INIT'}), diff --git a/desktop/app/src/dispatcher/__tests__/pluginManager.node.tsx b/desktop/app/src/dispatcher/__tests__/pluginManager.node.tsx index 4b95402f4..53e9f2557 100644 --- a/desktop/app/src/dispatcher/__tests__/pluginManager.node.tsx +++ b/desktop/app/src/dispatcher/__tests__/pluginManager.node.tsx @@ -22,7 +22,7 @@ import {_SandyPluginDefinition as SandyPluginDefinition} from 'flipper-plugin'; import MockFlipper from '../../test-utils/MockFlipper'; import Client from '../../Client'; import React from 'react'; -import BaseDevice from '../../devices/BaseDevice'; +import BaseDevice from '../../server/devices/BaseDevice'; const pluginDetails1 = TestUtils.createMockPluginDetails({ id: 'plugin1', diff --git a/desktop/app/src/dispatcher/androidDevice.tsx b/desktop/app/src/dispatcher/androidDevice.tsx index bebee643f..12c6e9b52 100644 --- a/desktop/app/src/dispatcher/androidDevice.tsx +++ b/desktop/app/src/dispatcher/androidDevice.tsx @@ -7,13 +7,13 @@ * @format */ -import AndroidDevice from '../devices/AndroidDevice'; -import KaiOSDevice from '../devices/KaiOSDevice'; +import AndroidDevice from '../server/devices/AndroidDevice'; +import KaiOSDevice from '../server/devices/KaiOSDevice'; import child_process from 'child_process'; import {Store} from '../reducers/index'; -import BaseDevice from '../devices/BaseDevice'; +import BaseDevice from '../server/devices/BaseDevice'; import {Logger} from '../fb-interfaces/Logger'; -import {getAdbClient} from '../utils/adbClient'; +import {getAdbClient} from '../server/utils/adbClient'; import which from 'which'; import {promisify} from 'util'; import {ServerPorts} from '../reducers/application'; @@ -105,7 +105,7 @@ function createDevice( export async function getActiveAndroidDevices( store: Store, ): Promise> { - const client = await getAdbClient(store); + const client = await getAdbClient(store.getState().settingsState); const androidDevices = await client.listDevices(); const devices = await Promise.all( androidDevices.map((device) => createDevice(client, device, store)), @@ -169,7 +169,7 @@ export default (store: Store, logger: Logger) => { console.warn('Failed to query AVDs:', err); }); - return getAdbClient(store) + return getAdbClient(store.getState().settingsState) .then((client) => { client .trackDevices() @@ -282,7 +282,7 @@ export default (store: Store, logger: Logger) => { // cleanup method return () => - getAdbClient(store).then((client) => { + getAdbClient(store.getState().settingsState).then((client) => { client.kill(); }); }; diff --git a/desktop/app/src/dispatcher/application.tsx b/desktop/app/src/dispatcher/application.tsx index c201c7100..43d1677e4 100644 --- a/desktop/app/src/dispatcher/application.tsx +++ b/desktop/app/src/dispatcher/application.tsx @@ -10,7 +10,7 @@ import {remote, ipcRenderer, IpcRendererEvent} from 'electron'; import {Store} from '../reducers/index'; import {Logger} from '../fb-interfaces/Logger'; -import {parseFlipperPorts} from '../utils/environmentVariables'; +import {parseFlipperPorts} from '../server/utils/environmentVariables'; import { importFileToStore, IMPORT_FLIPPER_TRACE_EVENT, diff --git a/desktop/app/src/dispatcher/desktopDevice.tsx b/desktop/app/src/dispatcher/desktopDevice.tsx index 27bc69be9..dbbb2093f 100644 --- a/desktop/app/src/dispatcher/desktopDevice.tsx +++ b/desktop/app/src/dispatcher/desktopDevice.tsx @@ -10,8 +10,8 @@ import {Store} from '../reducers/index'; import {Logger} from '../fb-interfaces/Logger'; -import MacDevice from '../devices/MacDevice'; -import WindowsDevice from '../devices/WindowsDevice'; +import MacDevice from '../server/devices/MacDevice'; +import WindowsDevice from '../server/devices/WindowsDevice'; export default (store: Store, _logger: Logger) => { let device; diff --git a/desktop/app/src/dispatcher/iOSDevice.tsx b/desktop/app/src/dispatcher/iOSDevice.tsx index 0158dba99..f4aeaa301 100644 --- a/desktop/app/src/dispatcher/iOSDevice.tsx +++ b/desktop/app/src/dispatcher/iOSDevice.tsx @@ -16,8 +16,8 @@ import {promisify} from 'util'; import path from 'path'; import child_process from 'child_process'; const execFile = child_process.execFile; -import iosUtil from '../utils/iOSContainerUtility'; -import IOSDevice from '../devices/IOSDevice'; +import iosUtil from '../server/utils/iOSContainerUtility'; +import IOSDevice from '../server/devices/IOSDevice'; import {addErrorNotification} from '../reducers/notifications'; import {getStaticPath} from '../utils/pathUtils'; import {destroyDevice} from '../reducers/connections'; @@ -25,7 +25,7 @@ import { ERR_NO_IDB_OR_XCODE_AVAILABLE, IOSBridge, makeIOSBridge, -} from '../utils/IOSBridge'; +} from '../server/utils/IOSBridge'; type iOSSimulatorDevice = { state: 'Booted' | 'Shutdown' | 'Shutting Down'; diff --git a/desktop/app/src/dispatcher/metroDevice.tsx b/desktop/app/src/dispatcher/metroDevice.tsx index f5e8692db..762c1bfc9 100644 --- a/desktop/app/src/dispatcher/metroDevice.tsx +++ b/desktop/app/src/dispatcher/metroDevice.tsx @@ -9,11 +9,11 @@ import {Store} from '../reducers/index'; import {Logger} from '../fb-interfaces/Logger'; -import MetroDevice from '../devices/MetroDevice'; +import MetroDevice from '../server/devices/MetroDevice'; import http from 'http'; import {addErrorNotification} from '../reducers/notifications'; import {destroyDevice} from '../reducers/connections'; -import {parseEnvironmentVariableAsNumber} from '../utils/environmentVariables'; +import {parseEnvironmentVariableAsNumber} from '../server/utils/environmentVariables'; const METRO_HOST = 'localhost'; const METRO_PORT = parseEnvironmentVariableAsNumber('METRO_SERVER_PORT', 8081); diff --git a/desktop/app/src/dispatcher/pluginManager.tsx b/desktop/app/src/dispatcher/pluginManager.tsx index 6370b6e9c..264080acf 100644 --- a/desktop/app/src/dispatcher/pluginManager.tsx +++ b/desktop/app/src/dispatcher/pluginManager.tsx @@ -44,10 +44,10 @@ import { import {deconstructClientId} from '../utils/clientUtils'; import {clearMessageQueue} from '../reducers/pluginMessageQueue'; import { - getPluginKey, isDevicePluginDefinition, defaultEnabledBackgroundPlugins, } from '../utils/pluginUtils'; +import {getPluginKey} from '../utils/pluginKey'; const maxInstalledPluginVersionsToKeep = 2; diff --git a/desktop/app/src/dispatcher/reactNative.tsx b/desktop/app/src/dispatcher/reactNative.tsx index cc3748a50..2e6e37bea 100644 --- a/desktop/app/src/dispatcher/reactNative.tsx +++ b/desktop/app/src/dispatcher/reactNative.tsx @@ -8,7 +8,7 @@ */ import {remote} from 'electron'; -import MetroDevice from '../devices/MetroDevice'; +import MetroDevice from '../server/devices/MetroDevice'; import {Store} from '../reducers'; type ShortcutEventCommand = diff --git a/desktop/app/src/dispatcher/server.tsx b/desktop/app/src/dispatcher/server.tsx index a46db8f23..acc7ca101 100644 --- a/desktop/app/src/dispatcher/server.tsx +++ b/desktop/app/src/dispatcher/server.tsx @@ -7,14 +7,14 @@ * @format */ -import ServerController from '../comms/ServerController'; +import ServerController from '../server/comms/ServerController'; import {Store} from '../reducers/index'; import {Logger} from '../fb-interfaces/Logger'; import Client from '../Client'; import {UninitializedClient} from '../UninitializedClient'; import {addErrorNotification} from '../reducers/notifications'; -import {CertificateExchangeMedium} from '../utils/CertificateProvider'; +import {CertificateExchangeMedium} from '../server/utils/CertificateProvider'; import {selectClient, selectDevice} from '../reducers/connections'; import {isLoggedIn} from '../fb-stubs/user'; import React from 'react'; diff --git a/desktop/app/src/dispatcher/tracking.tsx b/desktop/app/src/dispatcher/tracking.tsx index a8ddb2d29..645e6d1fd 100644 --- a/desktop/app/src/dispatcher/tracking.tsx +++ b/desktop/app/src/dispatcher/tracking.tsx @@ -25,7 +25,7 @@ import { selectionChanged, } from '../reducers/usageTracking'; import produce from 'immer'; -import BaseDevice from '../devices/BaseDevice'; +import BaseDevice from '../server/devices/BaseDevice'; import {deconstructClientId} from '../utils/clientUtils'; import {getCPUUsage} from 'process'; import {sideEffect} from '../utils/sideEffect'; diff --git a/desktop/app/src/fb-stubs/constants.tsx b/desktop/app/src/fb-stubs/constants.tsx index 2be65a55c..c24639543 100644 --- a/desktop/app/src/fb-stubs/constants.tsx +++ b/desktop/app/src/fb-stubs/constants.tsx @@ -7,7 +7,7 @@ * @format */ -import {OS} from '../devices/BaseDevice'; +import {OS} from '../server/devices/BaseDevice'; export default Object.freeze({ GRAPH_APP_ID: '', diff --git a/desktop/app/src/index.tsx b/desktop/app/src/index.tsx index 5e1f33bf4..ed2da4a5a 100644 --- a/desktop/app/src/index.tsx +++ b/desktop/app/src/index.tsx @@ -30,19 +30,19 @@ export {reportUsage} from './utils/metrics'; export {default as promiseTimeout} from './utils/promiseTimeout'; export {clipboard, remote, OpenDialogOptions} from 'electron'; export {bufferToBlob} from './utils/screenshot'; -export {getPluginKey} from './utils/pluginUtils'; +export {getPluginKey} from './utils/pluginKey'; export {Notification, Idler} from 'flipper-plugin'; export {IdlerImpl} from './utils/Idler'; export {Store, State as ReduxState} from './reducers/index'; -export {default as BaseDevice} from './devices/BaseDevice'; +export {default as BaseDevice} from './server/devices/BaseDevice'; export {default as isProduction} from './utils/isProduction'; export {DetailSidebar} from 'flipper-plugin'; -export {default as Device} from './devices/BaseDevice'; -export {default as AndroidDevice} from './devices/AndroidDevice'; -export {default as ArchivedDevice} from './devices/ArchivedDevice'; -export {default as IOSDevice} from './devices/IOSDevice'; -export {default as KaiOSDevice} from './devices/KaiOSDevice'; -export {OS} from './devices/BaseDevice'; +export {default as Device} from './server/devices/BaseDevice'; +export {default as AndroidDevice} from './server/devices/AndroidDevice'; +export {default as ArchivedDevice} from './server/devices/ArchivedDevice'; +export {default as IOSDevice} from './server/devices/IOSDevice'; +export {default as KaiOSDevice} from './server/devices/KaiOSDevice'; +export {OS} from './server/devices/BaseDevice'; export {default as Button} from './ui/components/Button'; export {default as ToggleButton} from './ui/components/ToggleSwitch'; export {default as ButtonGroup} from './ui/components/ButtonGroup'; @@ -129,7 +129,7 @@ export {Rect} from './utils/geometry'; export {Logger} from './fb-interfaces/Logger'; export {getInstance as getLogger} from './fb-stubs/Logger'; export {callVSCode} from './utils/vscodeUtils'; -export {checkIdbIsInstalled} from './utils/iOSContainerUtility'; +export {checkIdbIsInstalled} from './server/utils/iOSContainerUtility'; export {IDEFileResolver, IDEType} from './fb-stubs/IDEFileResolver'; export {renderMockFlipperWithPlugin} from './test-utils/createMockFlipperWithPlugin'; export {Tracked} from 'flipper-plugin'; // To be able to use it in legacy plugins diff --git a/desktop/app/src/plugin.tsx b/desktop/app/src/plugin.tsx index be905da43..1737c330d 100644 --- a/desktop/app/src/plugin.tsx +++ b/desktop/app/src/plugin.tsx @@ -11,7 +11,7 @@ import {KeyboardActions} from './MenuBar'; import {Logger} from './fb-interfaces/Logger'; import Client from './Client'; import {Component} from 'react'; -import BaseDevice from './devices/BaseDevice'; +import BaseDevice from './server/devices/BaseDevice'; import {StaticView} from './reducers/connections'; import {State as ReduxState} from './reducers'; import {DEFAULT_MAX_QUEUE_SIZE} from './reducers/pluginMessageQueue'; diff --git a/desktop/app/src/reducers/__tests__/connections.node.tsx b/desktop/app/src/reducers/__tests__/connections.node.tsx index d84ba0ad7..bb4b9a39f 100644 --- a/desktop/app/src/reducers/__tests__/connections.node.tsx +++ b/desktop/app/src/reducers/__tests__/connections.node.tsx @@ -9,10 +9,10 @@ import reducer from '../connections'; import {State, selectPlugin} from '../connections'; -import BaseDevice from '../../devices/BaseDevice'; -import MacDevice from '../../devices/MacDevice'; +import BaseDevice from '../../server/devices/BaseDevice'; +import MacDevice from '../../server/devices/MacDevice'; import {FlipperDevicePlugin} from '../../plugin'; -import MetroDevice from '../../devices/MetroDevice'; +import MetroDevice from '../../server/devices/MetroDevice'; import {TestUtils, _setFlipperLibImplementation} from 'flipper-plugin'; import {wrapSandy} from '../../test-utils/createMockFlipperWithPlugin'; import {createMockFlipperLib} from 'flipper-plugin/src/test-utils/test-utils'; diff --git a/desktop/app/src/reducers/connections.tsx b/desktop/app/src/reducers/connections.tsx index 72a20ccba..d33c331f6 100644 --- a/desktop/app/src/reducers/connections.tsx +++ b/desktop/app/src/reducers/connections.tsx @@ -10,18 +10,20 @@ import {ComponentType} from 'react'; import {produce} from 'immer'; -import type BaseDevice from '../devices/BaseDevice'; -import MacDevice from '../devices/MacDevice'; +import type BaseDevice from '../server/devices/BaseDevice'; +import MacDevice from '../server/devices/MacDevice'; import type Client from '../Client'; import type {UninitializedClient} from '../UninitializedClient'; import {isEqual} from 'lodash'; import {performance} from 'perf_hooks'; import type {Actions, Store} from '.'; import {WelcomeScreenStaticView} from '../sandy-chrome/WelcomeScreen'; -import {getPluginKey, isDevicePluginDefinition} from '../utils/pluginUtils'; +import {isDevicePluginDefinition} from '../utils/pluginUtils'; +import {getPluginKey} from '../utils/pluginKey'; + import {deconstructClientId} from '../utils/clientUtils'; import type {RegisterPluginAction} from './plugins'; -import MetroDevice from '../devices/MetroDevice'; +import MetroDevice from '../server/devices/MetroDevice'; import {Logger} from 'flipper-plugin'; export type StaticViewProps = {logger: Logger}; diff --git a/desktop/app/src/reducers/supportForm.tsx b/desktop/app/src/reducers/supportForm.tsx index bfc66d90d..6eee2aae6 100644 --- a/desktop/app/src/reducers/supportForm.tsx +++ b/desktop/app/src/reducers/supportForm.tsx @@ -18,7 +18,7 @@ import constants from '../fb-stubs/constants'; import {getInstance} from '../fb-stubs/Logger'; import {logPlatformSuccessRate} from '../utils/metrics'; export const SUPPORT_FORM_PREFIX = 'support-form-v2'; -import {OS} from '../devices/BaseDevice'; +import {OS} from '../server/devices/BaseDevice'; import {getExportablePlugins} from '../selectors/connections'; const {DEFAULT_SUPPORT_GROUP} = constants; diff --git a/desktop/app/src/sandy-chrome/appinspect/AppInspect.tsx b/desktop/app/src/sandy-chrome/appinspect/AppInspect.tsx index bed93e91b..fc7c26652 100644 --- a/desktop/app/src/sandy-chrome/appinspect/AppInspect.tsx +++ b/desktop/app/src/sandy-chrome/appinspect/AppInspect.tsx @@ -18,7 +18,7 @@ import ScreenCaptureButtons from '../../chrome/ScreenCaptureButtons'; import MetroButton from '../../chrome/MetroButton'; import {BookmarkSection} from './BookmarkSection'; import Client from '../../Client'; -import BaseDevice from '../../devices/BaseDevice'; +import BaseDevice from '../../server/devices/BaseDevice'; import {ExclamationCircleOutlined, FieldTimeOutlined} from '@ant-design/icons'; import {useSelector} from 'react-redux'; import { diff --git a/desktop/app/src/sandy-chrome/appinspect/AppSelector.tsx b/desktop/app/src/sandy-chrome/appinspect/AppSelector.tsx index 5d9465f93..b5e95a036 100644 --- a/desktop/app/src/sandy-chrome/appinspect/AppSelector.tsx +++ b/desktop/app/src/sandy-chrome/appinspect/AppSelector.tsx @@ -25,7 +25,7 @@ import { selectClient, selectDevice, } from '../../reducers/connections'; -import BaseDevice, {OS} from '../../devices/BaseDevice'; +import BaseDevice, {OS} from '../../server/devices/BaseDevice'; import Client from '../../Client'; import {State} from '../../reducers'; import {brandColors, brandIcons, colors} from '../../ui/components/colors'; diff --git a/desktop/app/src/sandy-chrome/appinspect/LaunchEmulator.tsx b/desktop/app/src/sandy-chrome/appinspect/LaunchEmulator.tsx index dde7d8e4c..40f49f272 100644 --- a/desktop/app/src/sandy-chrome/appinspect/LaunchEmulator.tsx +++ b/desktop/app/src/sandy-chrome/appinspect/LaunchEmulator.tsx @@ -17,7 +17,7 @@ import { } from '@ant-design/icons'; import {Store} from '../../reducers'; import {useStore} from '../../utils/useStore'; -import {launchEmulator} from '../../devices/AndroidDevice'; +import {launchEmulator} from '../../server/devices/AndroidDevice'; import {Layout, renderReactRoot, withTrackingScope} from 'flipper-plugin'; import {Provider} from 'react-redux'; import { diff --git a/desktop/app/src/sandy-chrome/appinspect/PluginList.tsx b/desktop/app/src/sandy-chrome/appinspect/PluginList.tsx index cf1f34cf9..2bbef77bf 100644 --- a/desktop/app/src/sandy-chrome/appinspect/PluginList.tsx +++ b/desktop/app/src/sandy-chrome/appinspect/PluginList.tsx @@ -23,9 +23,9 @@ import {useDispatch, useStore} from '../../utils/useStore'; import {getPluginTitle, getPluginTooltip} from '../../utils/pluginUtils'; import {selectPlugin} from '../../reducers/connections'; import Client from '../../Client'; -import BaseDevice from '../../devices/BaseDevice'; +import BaseDevice from '../../server/devices/BaseDevice'; import {DownloadablePluginDetails} from 'flipper-plugin-lib'; -import MetroDevice from '../../devices/MetroDevice'; +import MetroDevice from '../../server/devices/MetroDevice'; import { DownloadablePluginState, PluginDownloadStatus, diff --git a/desktop/app/src/sandy-chrome/appinspect/__tests__/LaunchEmulator.spec.tsx b/desktop/app/src/sandy-chrome/appinspect/__tests__/LaunchEmulator.spec.tsx index b6c0d8fe6..35e520d90 100644 --- a/desktop/app/src/sandy-chrome/appinspect/__tests__/LaunchEmulator.spec.tsx +++ b/desktop/app/src/sandy-chrome/appinspect/__tests__/LaunchEmulator.spec.tsx @@ -17,11 +17,11 @@ import {createRootReducer} from '../../../reducers'; import {act} from 'react-dom/test-utils'; import {sleep} from 'flipper-plugin'; -jest.mock('../../../devices/AndroidDevice', () => ({ +jest.mock('../../../server/devices/AndroidDevice', () => ({ launchEmulator: jest.fn(() => Promise.resolve([])), })); -import {launchEmulator} from '../../../devices/AndroidDevice'; +import {launchEmulator} from '../../../server/devices/AndroidDevice'; test('Can render and launch android apps', async () => { const store = createStore(createRootReducer()); diff --git a/desktop/app/src/sandy-chrome/appinspect/__tests__/PluginList.spec.tsx b/desktop/app/src/sandy-chrome/appinspect/__tests__/PluginList.spec.tsx index aae5a07ee..5ce2f0876 100644 --- a/desktop/app/src/sandy-chrome/appinspect/__tests__/PluginList.spec.tsx +++ b/desktop/app/src/sandy-chrome/appinspect/__tests__/PluginList.spec.tsx @@ -12,8 +12,8 @@ import { MockFlipperResult, } from '../../../test-utils/createMockFlipperWithPlugin'; import {FlipperPlugin} from '../../../plugin'; -import MetroDevice from '../../../devices/MetroDevice'; -import BaseDevice from '../../../devices/BaseDevice'; +import MetroDevice from '../../../server/devices/MetroDevice'; +import BaseDevice from '../../../server/devices/BaseDevice'; import {_SandyPluginDefinition} from 'flipper-plugin'; import {TestUtils} from 'flipper-plugin'; import {selectPlugin} from '../../../reducers/connections'; diff --git a/desktop/app/src/selectors/connections.tsx b/desktop/app/src/selectors/connections.tsx index 2f4ca25f1..252dd0a27 100644 --- a/desktop/app/src/selectors/connections.tsx +++ b/desktop/app/src/selectors/connections.tsx @@ -7,7 +7,7 @@ * @format */ -import MetroDevice from '../devices/MetroDevice'; +import MetroDevice from '../server/devices/MetroDevice'; import {State} from '../reducers'; import { computePluginLists, diff --git a/desktop/app/src/server/FlipperServerHost.ts b/desktop/app/src/server/FlipperServerHost.ts new file mode 100644 index 000000000..047225058 --- /dev/null +++ b/desktop/app/src/server/FlipperServerHost.ts @@ -0,0 +1,31 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @format + */ + +/** + * A set of utilities that should be provided by the hosting environment + */ +export interface FlipperServerHost {} + +let instance: FlipperServerHost | undefined; + +export function getFlipperServerHost(): FlipperServerHost { + if (!instance) { + throw new Error( + 'FlipperServerHost not set, call setFlipperServerHost first', + ); + } + return instance; +} + +export function setFlipperServerHost(impl: FlipperServerHost) { + if (instance) { + throw new Error('FlipperServerHost was already set'); + } + instance = impl; +} diff --git a/desktop/app/src/comms/BrowserClientFlipperConnection.tsx b/desktop/app/src/server/comms/BrowserClientFlipperConnection.tsx similarity index 100% rename from desktop/app/src/comms/BrowserClientFlipperConnection.tsx rename to desktop/app/src/server/comms/BrowserClientFlipperConnection.tsx diff --git a/desktop/app/src/comms/ClientConnection.tsx b/desktop/app/src/server/comms/ClientConnection.tsx similarity index 100% rename from desktop/app/src/comms/ClientConnection.tsx rename to desktop/app/src/server/comms/ClientConnection.tsx diff --git a/desktop/app/src/comms/ServerAdapter.tsx b/desktop/app/src/server/comms/ServerAdapter.tsx similarity index 99% rename from desktop/app/src/comms/ServerAdapter.tsx rename to desktop/app/src/server/comms/ServerAdapter.tsx index a1fcb581c..eb41680ff 100644 --- a/desktop/app/src/comms/ServerAdapter.tsx +++ b/desktop/app/src/server/comms/ServerAdapter.tsx @@ -11,7 +11,7 @@ import { CertificateExchangeMedium, SecureServerConfig, } from '../utils/CertificateProvider'; -import Client, {ClientQuery} from '../Client'; +import Client, {ClientQuery} from '../../Client'; import {ClientConnection} from './ClientConnection'; import {transformCertificateExchangeMediumToType} from './Utilities'; diff --git a/desktop/app/src/comms/ServerController.tsx b/desktop/app/src/server/comms/ServerController.tsx similarity index 94% rename from desktop/app/src/comms/ServerController.tsx rename to desktop/app/src/server/comms/ServerController.tsx index 8586c05b8..aee6099ed 100644 --- a/desktop/app/src/comms/ServerController.tsx +++ b/desktop/app/src/server/comms/ServerController.tsx @@ -8,23 +8,23 @@ */ import {CertificateExchangeMedium} from '../utils/CertificateProvider'; -import {Logger} from '../fb-interfaces/Logger'; -import {ClientQuery} from '../Client'; -import {Store, State} from '../reducers/index'; +import {Logger} from '../../fb-interfaces/Logger'; +import {ClientQuery} from '../../Client'; +import {Store, State} from '../../reducers/index'; import CertificateProvider from '../utils/CertificateProvider'; -import Client from '../Client'; +import Client from '../../Client'; import {ClientConnection, ConnectionStatus} from './ClientConnection'; -import {UninitializedClient} from '../UninitializedClient'; -import {reportPlatformFailures} from '../utils/metrics'; +import {UninitializedClient} from '../../UninitializedClient'; +import {reportPlatformFailures} from '../../utils/metrics'; import {EventEmitter} from 'events'; import invariant from 'invariant'; -import GK from '../fb-stubs/GK'; +import GK from '../../fb-stubs/GK'; import {initJsEmulatorIPC} from '../utils/js-client-server-utils/serverUtils'; -import {buildClientId} from '../utils/clientUtils'; -import JSDevice from '../devices/JSDevice'; -import DummyDevice from '../devices/DummyDevice'; -import BaseDevice from '../devices/BaseDevice'; -import {sideEffect} from '../utils/sideEffect'; +import {buildClientId} from '../../utils/clientUtils'; +import JSDevice from '../../server/devices/JSDevice'; +import DummyDevice from '../../server/devices/DummyDevice'; +import BaseDevice from '../../server/devices/BaseDevice'; +import {sideEffect} from '../../utils/sideEffect'; import { appNameWithUpdateHint, transformCertificateExchangeMediumToType, @@ -79,7 +79,11 @@ class ServerController extends EventEmitter implements ServerEventsListener { super(); this.logger = logger; this.connections = new Map(); - this.certificateProvider = new CertificateProvider(this, logger, store); + this.certificateProvider = new CertificateProvider( + this, + logger, + store.getState().settingsState, + ); this.connectionTracker = new ConnectionTracker(logger); this.secureServer = null; this.insecureServer = null; diff --git a/desktop/app/src/comms/ServerFactory.tsx b/desktop/app/src/server/comms/ServerFactory.tsx similarity index 98% rename from desktop/app/src/comms/ServerFactory.tsx rename to desktop/app/src/server/comms/ServerFactory.tsx index 0f9325070..2b962e9db 100644 --- a/desktop/app/src/comms/ServerFactory.tsx +++ b/desktop/app/src/server/comms/ServerFactory.tsx @@ -7,7 +7,7 @@ * @format */ -import GK from '../fb-stubs/GK'; +import GK from '../../fb-stubs/GK'; import {SecureServerConfig} from '../utils/CertificateProvider'; import ServerAdapter, {ServerEventsListener} from './ServerAdapter'; import ServerRSocket from './ServerRSocket'; diff --git a/desktop/app/src/comms/ServerRSocket.tsx b/desktop/app/src/server/comms/ServerRSocket.tsx similarity index 99% rename from desktop/app/src/comms/ServerRSocket.tsx rename to desktop/app/src/server/comms/ServerRSocket.tsx index 3f28d5b53..d8e61a7ec 100644 --- a/desktop/app/src/comms/ServerRSocket.tsx +++ b/desktop/app/src/server/comms/ServerRSocket.tsx @@ -17,7 +17,7 @@ import net, {Socket} from 'net'; import {RSocketServer} from 'rsocket-core'; import RSocketTCPServer from 'rsocket-tcp-server'; import {Payload, ReactiveSocket, Responder} from 'rsocket-types'; -import Client, {ClientQuery} from '../Client'; +import Client, {ClientQuery} from '../../Client'; import {Single} from 'rsocket-flowable'; import { ClientConnection, diff --git a/desktop/app/src/comms/ServerWebSocket.tsx b/desktop/app/src/server/comms/ServerWebSocket.tsx similarity index 99% rename from desktop/app/src/comms/ServerWebSocket.tsx rename to desktop/app/src/server/comms/ServerWebSocket.tsx index 83451d242..0403b77a5 100644 --- a/desktop/app/src/comms/ServerWebSocket.tsx +++ b/desktop/app/src/server/comms/ServerWebSocket.tsx @@ -12,7 +12,7 @@ import WebSocket from 'ws'; import ws from 'ws'; import {SecureClientQuery, ServerEventsListener} from './ServerAdapter'; import querystring from 'querystring'; -import Client, {ClientQuery} from '../Client'; +import Client, {ClientQuery} from '../../Client'; import {OS} from '../devices/BaseDevice'; import { ClientConnection, diff --git a/desktop/app/src/comms/ServerWebSocketBase.tsx b/desktop/app/src/server/comms/ServerWebSocketBase.tsx similarity index 100% rename from desktop/app/src/comms/ServerWebSocketBase.tsx rename to desktop/app/src/server/comms/ServerWebSocketBase.tsx diff --git a/desktop/app/src/comms/ServerWebSocketBrowser.tsx b/desktop/app/src/server/comms/ServerWebSocketBrowser.tsx similarity index 98% rename from desktop/app/src/comms/ServerWebSocketBrowser.tsx rename to desktop/app/src/server/comms/ServerWebSocketBrowser.tsx index bc1f7c5e8..27d5532d5 100644 --- a/desktop/app/src/comms/ServerWebSocketBrowser.tsx +++ b/desktop/app/src/server/comms/ServerWebSocketBrowser.tsx @@ -10,10 +10,10 @@ import ServerWebSocketBase from './ServerWebSocketBase'; import WebSocket from 'ws'; import querystring from 'querystring'; -import Client, {ClientQuery} from '../Client'; +import Client, {ClientQuery} from '../../Client'; import {BrowserClientFlipperConnection} from './BrowserClientFlipperConnection'; import {ServerEventsListener} from './ServerAdapter'; -import constants from '../fb-stubs/constants'; +import constants from '../../fb-stubs/constants'; import ws from 'ws'; import {IncomingMessage} from 'http'; diff --git a/desktop/app/src/comms/Utilities.tsx b/desktop/app/src/server/comms/Utilities.tsx similarity index 97% rename from desktop/app/src/comms/Utilities.tsx rename to desktop/app/src/server/comms/Utilities.tsx index 53a524b07..1c825a346 100644 --- a/desktop/app/src/comms/Utilities.tsx +++ b/desktop/app/src/server/comms/Utilities.tsx @@ -8,7 +8,7 @@ */ import {CertificateExchangeMedium} from '../utils/CertificateProvider'; -import {ClientQuery} from '../Client'; +import {ClientQuery} from '../../Client'; /** * Transforms the certificate exchange medium type as number to the diff --git a/desktop/app/src/devices/AndroidDevice.tsx b/desktop/app/src/server/devices/AndroidDevice.tsx similarity index 100% rename from desktop/app/src/devices/AndroidDevice.tsx rename to desktop/app/src/server/devices/AndroidDevice.tsx diff --git a/desktop/app/src/devices/ArchivedDevice.tsx b/desktop/app/src/server/devices/ArchivedDevice.tsx similarity index 94% rename from desktop/app/src/devices/ArchivedDevice.tsx rename to desktop/app/src/server/devices/ArchivedDevice.tsx index c8ead36d7..fb2f99020 100644 --- a/desktop/app/src/devices/ArchivedDevice.tsx +++ b/desktop/app/src/server/devices/ArchivedDevice.tsx @@ -10,7 +10,7 @@ import BaseDevice from './BaseDevice'; import type {DeviceType} from 'flipper-plugin'; import {OS, DeviceShell} from './BaseDevice'; -import {SupportFormRequestDetailsState} from '../reducers/supportForm'; +import {SupportFormRequestDetailsState} from '../../reducers/supportForm'; export default class ArchivedDevice extends BaseDevice { isArchived = true; diff --git a/desktop/app/src/devices/BaseDevice.tsx b/desktop/app/src/server/devices/BaseDevice.tsx similarity index 95% rename from desktop/app/src/devices/BaseDevice.tsx rename to desktop/app/src/server/devices/BaseDevice.tsx index f348fb8de..6a85bb79d 100644 --- a/desktop/app/src/devices/BaseDevice.tsx +++ b/desktop/app/src/server/devices/BaseDevice.tsx @@ -18,8 +18,8 @@ import { createState, getFlipperLib, } from 'flipper-plugin'; -import {PluginDefinition, DevicePluginMap} from '../plugin'; import {DeviceSpec, OS as PluginOS, PluginDetails} from 'flipper-plugin-lib'; +import {getPluginKey} from '../../utils/pluginKey'; export type DeviceShell = { stdout: stream.Readable; @@ -29,6 +29,9 @@ export type DeviceShell = { export type OS = PluginOS | 'Windows' | 'MacOS' | 'JSWebApp'; +type PluginDefinition = _SandyPluginDefinition; +type PluginMap = Map; + export type DeviceExport = { os: OS; title: string; @@ -80,6 +83,7 @@ export default class BaseDevice { // if imported, stores the original source location source = ''; + // TODO: ideally we don't want BasePlugin to know about the concept of plugins sandyPluginStates: Map = new Map< string, _SandyDevicePluginInstance @@ -221,7 +225,7 @@ export default class BaseDevice { } loadDevicePlugins( - devicePlugins: DevicePluginMap, + devicePlugins: PluginMap, enabledDevicePlugins: Set, pluginStates?: Record, ) { @@ -249,11 +253,7 @@ export default class BaseDevice { plugin, this, // break circular dep, one of those days again... - require('../utils/pluginUtils').getPluginKey( - undefined, - {serial: this.serial}, - plugin.id, - ), + getPluginKey(undefined, {serial: this.serial}, plugin.id), initialState, ), ); diff --git a/desktop/app/src/devices/DummyDevice.tsx b/desktop/app/src/server/devices/DummyDevice.tsx similarity index 100% rename from desktop/app/src/devices/DummyDevice.tsx rename to desktop/app/src/server/devices/DummyDevice.tsx diff --git a/desktop/app/src/devices/IOSDevice.tsx b/desktop/app/src/server/devices/IOSDevice.tsx similarity index 97% rename from desktop/app/src/devices/IOSDevice.tsx rename to desktop/app/src/server/devices/IOSDevice.tsx index b73b01b09..9ed7a0542 100644 --- a/desktop/app/src/devices/IOSDevice.tsx +++ b/desktop/app/src/server/devices/IOSDevice.tsx @@ -7,13 +7,12 @@ * @format */ -import type {LogLevel, DeviceLogEntry, DeviceType} from 'flipper-plugin'; +import {LogLevel, DeviceLogEntry, DeviceType, timeout} from 'flipper-plugin'; import child_process, {ChildProcess} from 'child_process'; import BaseDevice from './BaseDevice'; import JSONStream from 'JSONStream'; import {Transform} from 'stream'; import {exec} from 'promisify-child-process'; -import {default as promiseTimeout} from '../utils/promiseTimeout'; import { ERR_PHYSICAL_DEVICE_LOGS_WITHOUT_IDB, IOSBridge, @@ -230,7 +229,7 @@ export default class IOSDevice extends BaseDevice { this.recordingProcess!.kill('SIGINT'); }); - const output: string | null = await promiseTimeout( + const output: string | null = await timeout( 5000, prom, 'Timed out to stop a screen capture.', diff --git a/desktop/app/src/devices/JSDevice.tsx b/desktop/app/src/server/devices/JSDevice.tsx similarity index 100% rename from desktop/app/src/devices/JSDevice.tsx rename to desktop/app/src/server/devices/JSDevice.tsx diff --git a/desktop/app/src/devices/KaiOSDevice.tsx b/desktop/app/src/server/devices/KaiOSDevice.tsx similarity index 100% rename from desktop/app/src/devices/KaiOSDevice.tsx rename to desktop/app/src/server/devices/KaiOSDevice.tsx diff --git a/desktop/app/src/devices/MacDevice.tsx b/desktop/app/src/server/devices/MacDevice.tsx similarity index 100% rename from desktop/app/src/devices/MacDevice.tsx rename to desktop/app/src/server/devices/MacDevice.tsx diff --git a/desktop/app/src/devices/MetroDevice.tsx b/desktop/app/src/server/devices/MetroDevice.tsx similarity index 100% rename from desktop/app/src/devices/MetroDevice.tsx rename to desktop/app/src/server/devices/MetroDevice.tsx diff --git a/desktop/app/src/devices/WindowsDevice.tsx b/desktop/app/src/server/devices/WindowsDevice.tsx similarity index 100% rename from desktop/app/src/devices/WindowsDevice.tsx rename to desktop/app/src/server/devices/WindowsDevice.tsx diff --git a/desktop/app/src/devices/__tests__/BaseDevice.node.tsx b/desktop/app/src/server/devices/__tests__/BaseDevice.node.tsx similarity index 98% rename from desktop/app/src/devices/__tests__/BaseDevice.node.tsx rename to desktop/app/src/server/devices/__tests__/BaseDevice.node.tsx index 736134426..0a524474c 100644 --- a/desktop/app/src/devices/__tests__/BaseDevice.node.tsx +++ b/desktop/app/src/server/devices/__tests__/BaseDevice.node.tsx @@ -8,11 +8,11 @@ */ import BaseDevice from '../BaseDevice'; -import * as DeviceTestPluginModule from '../../test-utils/DeviceTestPlugin'; +import * as DeviceTestPluginModule from '../../../test-utils/DeviceTestPlugin'; import {TestUtils, _SandyPluginDefinition} from 'flipper-plugin'; import ArchivedDevice from '../ArchivedDevice'; import DummyDevice from '../DummyDevice'; -import {createMockFlipperWithPlugin} from '../../test-utils/createMockFlipperWithPlugin'; +import {createMockFlipperWithPlugin} from '../../../test-utils/createMockFlipperWithPlugin'; const physicalDevicePluginDetails = TestUtils.createMockPluginDetails({ id: 'physicalDevicePlugin', diff --git a/desktop/app/src/devices/__tests__/iOSLogs.node.tsx b/desktop/app/src/server/devices/__tests__/iOSLogs.node.tsx similarity index 100% rename from desktop/app/src/devices/__tests__/iOSLogs.node.tsx rename to desktop/app/src/server/devices/__tests__/iOSLogs.node.tsx diff --git a/desktop/app/src/utils/CertificateProvider.tsx b/desktop/app/src/server/utils/CertificateProvider.tsx similarity index 96% rename from desktop/app/src/utils/CertificateProvider.tsx rename to desktop/app/src/server/utils/CertificateProvider.tsx index 4f135a369..258eed444 100644 --- a/desktop/app/src/utils/CertificateProvider.tsx +++ b/desktop/app/src/server/utils/CertificateProvider.tsx @@ -7,8 +7,8 @@ * @format */ -import {Logger} from '../fb-interfaces/Logger'; -import {internGraphPOSTAPIRequest} from '../fb-stubs/user'; +import {Logger} from '../../fb-interfaces/Logger'; +import {internGraphPOSTAPIRequest} from '../../fb-stubs/user'; import ServerController from '../comms/ServerController'; import {promisify} from 'util'; import fs from 'fs'; @@ -21,14 +21,13 @@ import { import path from 'path'; import tmp, {DirOptions, FileOptions} from 'tmp'; import iosUtil from './iOSContainerUtility'; -import {reportPlatformFailures} from './metrics'; +import {reportPlatformFailures} from '../../utils/metrics'; import {getAdbClient} from './adbClient'; import * as androidUtil from './androidContainerUtility'; import os from 'os'; import {Client as ADBClient} from 'adbkit'; -import {Store} from '../reducers/index'; import archiver from 'archiver'; -import promiseTimeout from '../utils/promiseTimeout'; +import {timeout} from 'flipper-plugin'; import {v4 as uuid} from 'uuid'; export type CertificateExchangeMedium = 'FS_ACCESS' | 'WWW'; @@ -71,6 +70,12 @@ export type SecureServerConfig = { rejectUnauthorized: boolean; }; +type CertificateProviderConfig = { + idbPath: string; + androidHome: string; + enablePhysicalIOS: boolean; +}; + /* * This class is responsible for generating and deploying server and client * certificates to allow for secure communication between Flipper and apps. @@ -86,17 +91,21 @@ export default class CertificateProvider { logger: Logger; adb: Promise; certificateSetup: Promise; - store: Store; + config: CertificateProviderConfig; server: ServerController; - constructor(server: ServerController, logger: Logger, store: Store) { + constructor( + server: ServerController, + logger: Logger, + config: CertificateProviderConfig, + ) { this.logger = logger; - this.adb = getAdbClient(store); + this.adb = getAdbClient(config); this.certificateSetup = reportPlatformFailures( this.ensureServerCertExists(), 'ensureServerCertExists', ); - this.store = store; + this.config = config; this.server = server; } @@ -104,7 +113,7 @@ export default class CertificateProvider { const buff = await fsExtra.readFile(zipPath); const file = new File([buff], 'certs.zip'); return reportPlatformFailures( - promiseTimeout( + timeout( 5 * 60 * 1000, internGraphPOSTAPIRequest('flipper/certificates', { certificate_zip: file, @@ -345,7 +354,7 @@ export default class CertificateProvider { filePath, bundleId, destination, - this.store.getState().settingsState.idbPath, + this.config.idbPath, ), ); }); @@ -421,10 +430,7 @@ export default class CertificateProvider { return Promise.resolve(matches[1]); } return iosUtil - .targets( - this.store.getState().settingsState.idbPath, - this.store.getState().settingsState.enablePhysicalIOS, - ) + .targets(this.config.idbPath, this.config.enablePhysicalIOS) .then((targets) => { if (targets.length === 0) { throw new Error('No iOS devices found'); @@ -493,7 +499,7 @@ export default class CertificateProvider { originalFile, bundleId, path.join(dir, csrFileName), - this.store.getState().settingsState.idbPath, + this.config.idbPath, ) .then(() => dir); }) diff --git a/desktop/app/src/utils/IOSBridge.tsx b/desktop/app/src/server/utils/IOSBridge.tsx similarity index 98% rename from desktop/app/src/utils/IOSBridge.tsx rename to desktop/app/src/server/utils/IOSBridge.tsx index 7f7aa2a7f..74915e13d 100644 --- a/desktop/app/src/utils/IOSBridge.tsx +++ b/desktop/app/src/server/utils/IOSBridge.tsx @@ -13,7 +13,7 @@ import {DeviceType} from 'flipper-plugin-lib'; import {v1 as uuid} from 'uuid'; import path from 'path'; import {exec} from 'promisify-child-process'; -import {getAppTempPath} from '../utils/pathUtils'; +import {getAppTempPath} from '../../utils/pathUtils'; export const ERR_NO_IDB_OR_XCODE_AVAILABLE = 'Neither Xcode nor idb available. Cannot provide iOS device functionality.'; diff --git a/desktop/app/src/utils/__tests__/IOSBridge.node.tsx b/desktop/app/src/server/utils/__tests__/IOSBridge.node.tsx similarity index 100% rename from desktop/app/src/utils/__tests__/IOSBridge.node.tsx rename to desktop/app/src/server/utils/__tests__/IOSBridge.node.tsx diff --git a/desktop/app/src/utils/__tests__/adbConfig.node.tsx b/desktop/app/src/server/utils/__tests__/adbConfig.node.tsx similarity index 100% rename from desktop/app/src/utils/__tests__/adbConfig.node.tsx rename to desktop/app/src/server/utils/__tests__/adbConfig.node.tsx diff --git a/desktop/app/src/utils/__tests__/environmentVariables.node.tsx b/desktop/app/src/server/utils/__tests__/environmentVariables.node.tsx similarity index 100% rename from desktop/app/src/utils/__tests__/environmentVariables.node.tsx rename to desktop/app/src/server/utils/__tests__/environmentVariables.node.tsx diff --git a/desktop/app/src/utils/__tests__/iOSContainerUtility.node.tsx b/desktop/app/src/server/utils/__tests__/iOSContainerUtility.node.tsx similarity index 100% rename from desktop/app/src/utils/__tests__/iOSContainerUtility.node.tsx rename to desktop/app/src/server/utils/__tests__/iOSContainerUtility.node.tsx diff --git a/desktop/app/src/utils/adbClient.tsx b/desktop/app/src/server/utils/adbClient.tsx similarity index 84% rename from desktop/app/src/utils/adbClient.tsx rename to desktop/app/src/server/utils/adbClient.tsx index cf6da2012..382b89126 100644 --- a/desktop/app/src/utils/adbClient.tsx +++ b/desktop/app/src/server/utils/adbClient.tsx @@ -7,20 +7,23 @@ * @format */ -import {reportPlatformFailures} from './metrics'; +import {reportPlatformFailures} from '../../utils/metrics'; import {execFile} from 'promisify-child-process'; import promiseRetry from 'promise-retry'; import adbConfig from '../utils/adbConfig'; import adbkit, {Client} from 'adbkit'; -import {Store} from '../reducers/index'; import path from 'path'; const MAX_RETRIES = 5; let instance: Promise; -export function getAdbClient(store: Store): Promise { +type Config = { + androidHome: string; +}; + +export function getAdbClient(config: Config): Promise { if (!instance) { - instance = reportPlatformFailures(createClient(store), 'createADBClient'); + instance = reportPlatformFailures(createClient(config), 'createADBClient'); } return instance; } @@ -28,8 +31,8 @@ export function getAdbClient(store: Store): Promise { /* Adbkit will attempt to start the adb server if it's not already running, however, it sometimes fails with ENOENT errors. So instead, we start it manually before requesting a client. */ -function createClient(store: Store): Promise { - const androidHome = store.getState().settingsState.androidHome; +function createClient(config: Config): Promise { + const androidHome = config.androidHome; const adbPath = path.resolve(androidHome, 'platform-tools/adb'); return reportPlatformFailures( execFile(adbPath, ['start-server']).then(() => diff --git a/desktop/app/src/utils/adbConfig.tsx b/desktop/app/src/server/utils/adbConfig.tsx similarity index 100% rename from desktop/app/src/utils/adbConfig.tsx rename to desktop/app/src/server/utils/adbConfig.tsx diff --git a/desktop/app/src/utils/androidContainerUtility.tsx b/desktop/app/src/server/utils/androidContainerUtility.tsx similarity index 100% rename from desktop/app/src/utils/androidContainerUtility.tsx rename to desktop/app/src/server/utils/androidContainerUtility.tsx diff --git a/desktop/app/src/utils/androidContainerUtilityInternal.tsx b/desktop/app/src/server/utils/androidContainerUtilityInternal.tsx similarity index 98% rename from desktop/app/src/utils/androidContainerUtilityInternal.tsx rename to desktop/app/src/server/utils/androidContainerUtilityInternal.tsx index 8acece114..93eb2a410 100644 --- a/desktop/app/src/utils/androidContainerUtilityInternal.tsx +++ b/desktop/app/src/server/utils/androidContainerUtilityInternal.tsx @@ -12,7 +12,7 @@ * opaque types will ensure the commands are only ever run on validated * arguments. */ -import {UnsupportedError} from './metrics'; +import {UnsupportedError} from '../../utils/metrics'; import adbkit, {Client} from 'adbkit'; const allowedAppNameRegex = /^[\w.-]+$/; diff --git a/desktop/app/src/utils/environmentVariables.tsx b/desktop/app/src/server/utils/environmentVariables.tsx similarity index 100% rename from desktop/app/src/utils/environmentVariables.tsx rename to desktop/app/src/server/utils/environmentVariables.tsx diff --git a/desktop/app/src/utils/iOSContainerUtility.tsx b/desktop/app/src/server/utils/iOSContainerUtility.tsx similarity index 98% rename from desktop/app/src/utils/iOSContainerUtility.tsx rename to desktop/app/src/server/utils/iOSContainerUtility.tsx index 5223ff3d5..d7571cbd8 100644 --- a/desktop/app/src/utils/iOSContainerUtility.tsx +++ b/desktop/app/src/server/utils/iOSContainerUtility.tsx @@ -11,7 +11,7 @@ import React from 'react'; import {Mutex} from 'async-mutex'; import {exec as unsafeExec, Output} from 'promisify-child-process'; import {killOrphanedInstrumentsProcesses} from './processCleanup'; -import {reportPlatformFailures} from './metrics'; +import {reportPlatformFailures} from '../../utils/metrics'; import {promises, constants} from 'fs'; import memoize from 'lodash.memoize'; import {notNull} from './typeUtils'; @@ -19,7 +19,7 @@ import {promisify} from 'util'; import child_process from 'child_process'; import fs from 'fs-extra'; import path from 'path'; -import fbConfig from '../fb-stubs/config'; +import fbConfig from '../../fb-stubs/config'; import {notification, Typography} from 'antd'; const exec = promisify(child_process.exec); diff --git a/desktop/app/src/utils/js-client-server-utils/serverUtils.tsx b/desktop/app/src/server/utils/js-client-server-utils/serverUtils.tsx similarity index 95% rename from desktop/app/src/utils/js-client-server-utils/serverUtils.tsx rename to desktop/app/src/server/utils/js-client-server-utils/serverUtils.tsx index 0195e9474..75c2104be 100644 --- a/desktop/app/src/utils/js-client-server-utils/serverUtils.tsx +++ b/desktop/app/src/server/utils/js-client-server-utils/serverUtils.tsx @@ -7,7 +7,7 @@ * @format */ -import Client, {ClientQuery} from '../../Client'; +import Client, {ClientQuery} from '../../../Client'; import { ClientConnection, ConnectionStatus, @@ -16,11 +16,11 @@ import { } from '../../comms/ClientConnection'; import {ipcRenderer, remote, IpcRendererEvent} from 'electron'; import JSDevice from '../../devices/JSDevice'; -import {Store} from '../../reducers'; -import {Logger} from '../../fb-interfaces/Logger'; +import {Store} from '../../../reducers'; +import {Logger} from '../../../fb-interfaces/Logger'; import ServerController from '../../comms/ServerController'; -import {buildClientId} from '../clientUtils'; -import {destroyDevice} from '../../reducers/connections'; +import {buildClientId} from '../../../utils/clientUtils'; +import {destroyDevice} from '../../../reducers/connections'; const connections: Map = new Map(); diff --git a/desktop/app/src/utils/openssl-wrapper-with-promises.tsx b/desktop/app/src/server/utils/openssl-wrapper-with-promises.tsx similarity index 100% rename from desktop/app/src/utils/openssl-wrapper-with-promises.tsx rename to desktop/app/src/server/utils/openssl-wrapper-with-promises.tsx diff --git a/desktop/app/src/utils/processCleanup.tsx b/desktop/app/src/server/utils/processCleanup.tsx similarity index 100% rename from desktop/app/src/utils/processCleanup.tsx rename to desktop/app/src/server/utils/processCleanup.tsx diff --git a/desktop/app/src/server/utils/typeUtils.tsx b/desktop/app/src/server/utils/typeUtils.tsx new file mode 100644 index 000000000..4f15d79c6 --- /dev/null +++ b/desktop/app/src/server/utils/typeUtils.tsx @@ -0,0 +1,14 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @format + */ + +// Typescript doesn't know Array.filter(Boolean) won't contain nulls. +// So use Array.filter(notNull) instead. +export function notNull(x: T | null | undefined): x is T { + return x !== null && x !== undefined; +} diff --git a/desktop/app/src/test-utils/MockFlipper.tsx b/desktop/app/src/test-utils/MockFlipper.tsx index b6fe8dc11..7c26f76b7 100644 --- a/desktop/app/src/test-utils/MockFlipper.tsx +++ b/desktop/app/src/test-utils/MockFlipper.tsx @@ -8,14 +8,14 @@ */ import {createStore} from 'redux'; -import BaseDevice from '../devices/BaseDevice'; +import BaseDevice from '../server/devices/BaseDevice'; import {createRootReducer} from '../reducers'; import {Store} from '../reducers/index'; import Client, {ClientQuery} from '../Client'; import { ClientConnection, ConnectionStatusChange, -} from '../comms/ClientConnection'; +} from '../server/comms/ClientConnection'; import {buildClientId} from '../utils/clientUtils'; import {Logger} from '../fb-interfaces/Logger'; import {PluginDefinition} from '../plugin'; @@ -24,7 +24,7 @@ import {getInstance} from '../fb-stubs/Logger'; import {initializeFlipperLibImplementation} from '../utils/flipperLibImplementation'; import pluginManager from '../dispatcher/pluginManager'; import {PluginDetails} from 'flipper-plugin-lib'; -import ArchivedDevice from '../devices/ArchivedDevice'; +import ArchivedDevice from '../server/devices/ArchivedDevice'; export interface AppOptions { plugins?: PluginDefinition[]; diff --git a/desktop/app/src/test-utils/createMockFlipperWithPlugin.tsx b/desktop/app/src/test-utils/createMockFlipperWithPlugin.tsx index 131cdd381..ded769f24 100644 --- a/desktop/app/src/test-utils/createMockFlipperWithPlugin.tsx +++ b/desktop/app/src/test-utils/createMockFlipperWithPlugin.tsx @@ -21,7 +21,7 @@ import { selectDevice, selectClient, } from '../reducers/connections'; -import BaseDevice from '../devices/BaseDevice'; +import BaseDevice from '../server/devices/BaseDevice'; import {Store} from '../reducers/index'; import Client, {ClientQuery} from '../Client'; @@ -29,7 +29,9 @@ import Client, {ClientQuery} from '../Client'; import {Logger} from '../fb-interfaces/Logger'; import {FlipperDevicePlugin, FlipperPlugin, PluginDefinition} from '../plugin'; import PluginContainer from '../PluginContainer'; -import {getPluginKey, isDevicePluginDefinition} from '../utils/pluginUtils'; +import {isDevicePluginDefinition} from '../utils/pluginUtils'; +import {getPluginKey} from '../utils/pluginKey'; + import MockFlipper from './MockFlipper'; import {switchPlugin} from '../reducers/pluginManager'; import {createSandyPluginFromClassicPlugin} from '../dispatcher/plugins'; diff --git a/desktop/app/src/utils/__tests__/exportData.node.tsx b/desktop/app/src/utils/__tests__/exportData.node.tsx index 3ed1b311f..ae14cfbbb 100644 --- a/desktop/app/src/utils/__tests__/exportData.node.tsx +++ b/desktop/app/src/utils/__tests__/exportData.node.tsx @@ -9,8 +9,8 @@ import {State} from '../../reducers/index'; import configureStore from 'redux-mock-store'; -import {default as BaseDevice} from '../../devices/BaseDevice'; -import {default as ArchivedDevice} from '../../devices/ArchivedDevice'; +import {default as BaseDevice} from '../../server/devices/BaseDevice'; +import {default as ArchivedDevice} from '../../server/devices/ArchivedDevice'; import { processStore, determinePluginsToProcess, diff --git a/desktop/app/src/utils/__tests__/messageQueueSandy.node.tsx b/desktop/app/src/utils/__tests__/messageQueueSandy.node.tsx index 609a5ab9a..490e5148e 100644 --- a/desktop/app/src/utils/__tests__/messageQueueSandy.node.tsx +++ b/desktop/app/src/utils/__tests__/messageQueueSandy.node.tsx @@ -19,7 +19,7 @@ import { selectDevice, } from '../../reducers/connections'; import {processMessageQueue} from '../messageQueue'; -import {getPluginKey} from '../pluginUtils'; +import {getPluginKey} from '../pluginKey'; import {TestIdler} from '../Idler'; import {registerPlugins} from '../../reducers/plugins'; import { diff --git a/desktop/app/src/utils/__tests__/pluginUtils.node.tsx b/desktop/app/src/utils/__tests__/pluginUtils.node.tsx index 7167aaf20..a47fceabf 100644 --- a/desktop/app/src/utils/__tests__/pluginUtils.node.tsx +++ b/desktop/app/src/utils/__tests__/pluginUtils.node.tsx @@ -7,7 +7,7 @@ * @format */ -import {getPluginKey} from '../pluginUtils'; +import {getPluginKey} from '../pluginKey'; import {FlipperPlugin, FlipperDevicePlugin} from '../../plugin'; import {createMockFlipperWithPlugin} from '../../test-utils/createMockFlipperWithPlugin'; import {getExportablePlugins} from '../../selectors/connections'; diff --git a/desktop/app/src/utils/clientUtils.tsx b/desktop/app/src/utils/clientUtils.tsx index 8ad37d379..9775d97c8 100644 --- a/desktop/app/src/utils/clientUtils.tsx +++ b/desktop/app/src/utils/clientUtils.tsx @@ -8,7 +8,7 @@ */ import type Client from '../Client'; -import type BaseDevice from '../devices/BaseDevice'; +import type BaseDevice from '../server/devices/BaseDevice'; /* A Client uniuely identifies an app running on some device. diff --git a/desktop/app/src/utils/exportData.tsx b/desktop/app/src/utils/exportData.tsx index 29c39a33f..eafce0f1d 100644 --- a/desktop/app/src/utils/exportData.tsx +++ b/desktop/app/src/utils/exportData.tsx @@ -12,15 +12,15 @@ import path from 'path'; import electron from 'electron'; import {getInstance as getLogger} from '../fb-stubs/Logger'; import {Store, MiddlewareAPI} from '../reducers'; -import {DeviceExport} from '../devices/BaseDevice'; +import {DeviceExport} from '../server/devices/BaseDevice'; import {State as PluginsState} from '../reducers/plugins'; import {PluginNotification} from '../reducers/notifications'; import Client, {ClientExport, ClientQuery} from '../Client'; import {getAppVersion} from './info'; -import {pluginKey} from '../utils/pluginUtils'; +import {pluginKey} from '../utils/pluginKey'; import {DevicePluginMap, ClientPluginMap} from '../plugin'; -import {default as BaseDevice} from '../devices/BaseDevice'; -import {default as ArchivedDevice} from '../devices/ArchivedDevice'; +import {default as BaseDevice} from '../server/devices/BaseDevice'; +import {default as ArchivedDevice} from '../server/devices/ArchivedDevice'; import fs from 'fs'; import {v4 as uuidv4} from 'uuid'; import {remote, OpenDialogOptions} from 'electron'; diff --git a/desktop/app/src/utils/flipperLibImplementation.tsx b/desktop/app/src/utils/flipperLibImplementation.tsx index 00d547c4a..f62e20545 100644 --- a/desktop/app/src/utils/flipperLibImplementation.tsx +++ b/desktop/app/src/utils/flipperLibImplementation.tsx @@ -12,7 +12,7 @@ import type {Logger} from '../fb-interfaces/Logger'; import type {Store} from '../reducers'; import createPaste from '../fb-stubs/createPaste'; import GK from '../fb-stubs/GK'; -import type BaseDevice from '../devices/BaseDevice'; +import type BaseDevice from '../server/devices/BaseDevice'; import {clipboard, shell} from 'electron'; import constants from '../fb-stubs/constants'; import {addNotification} from '../reducers/notifications'; diff --git a/desktop/app/src/utils/pluginKey.tsx b/desktop/app/src/utils/pluginKey.tsx new file mode 100644 index 000000000..adb0588d6 --- /dev/null +++ b/desktop/app/src/utils/pluginKey.tsx @@ -0,0 +1,27 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @format + */ + +export function getPluginKey( + selectedAppId: string | null | undefined, + baseDevice: {serial: string} | null | undefined, + pluginID: string, +): string { + if (selectedAppId) { + return `${selectedAppId}#${pluginID}`; + } + if (baseDevice) { + // If selected App is not defined, then the plugin is a device plugin + return `${baseDevice.serial}#${pluginID}`; + } + return `unknown#${pluginID}`; +} + +export const pluginKey = (serial: string, pluginName: string): string => { + return `${serial}#${pluginName}`; +}; diff --git a/desktop/app/src/utils/pluginUtils.tsx b/desktop/app/src/utils/pluginUtils.tsx index 7418839fa..7cdf881cf 100644 --- a/desktop/app/src/utils/pluginUtils.tsx +++ b/desktop/app/src/utils/pluginUtils.tsx @@ -10,7 +10,7 @@ import type {PluginDefinition} from '../plugin'; import type {State} from '../reducers'; import type {State as PluginsState} from '../reducers/plugins'; -import type BaseDevice from '../devices/BaseDevice'; +import type BaseDevice from '../server/devices/BaseDevice'; import type Client from '../Client'; import type { ActivatablePluginDetails, @@ -19,6 +19,7 @@ import type { PluginDetails, } from 'flipper-plugin-lib'; import {getLatestCompatibleVersionOfEachPlugin} from '../dispatcher/plugins'; +import {getPluginKey} from './pluginKey'; export type PluginLists = { devicePlugins: PluginDefinition[]; @@ -63,25 +64,6 @@ export function pluginsClassMap( ]); } -export function getPluginKey( - selectedAppId: string | null | undefined, - baseDevice: {serial: string} | null | undefined, - pluginID: string, -): string { - if (selectedAppId) { - return `${selectedAppId}#${pluginID}`; - } - if (baseDevice) { - // If selected App is not defined, then the plugin is a device plugin - return `${baseDevice.serial}#${pluginID}`; - } - return `unknown#${pluginID}`; -} - -export const pluginKey = (serial: string, pluginName: string): string => { - return `${serial}#${pluginName}`; -}; - export function computeExportablePlugins( state: Pick, device: BaseDevice | null, diff --git a/desktop/app/src/utils/promiseTimeout.tsx b/desktop/app/src/utils/promiseTimeout.tsx index 432477adc..5ad78ccd3 100644 --- a/desktop/app/src/utils/promiseTimeout.tsx +++ b/desktop/app/src/utils/promiseTimeout.tsx @@ -7,21 +7,22 @@ * @format */ -import {sleep} from 'flipper-plugin'; +import {timeout} from 'flipper-plugin'; import {StatusMessageType} from '../reducers/application'; +/** + * @deprecated use timeout from flipper-plugin + * @param ms @ + * @param promise + * @param timeoutMessage + * @returns + */ export default function promiseTimeout( ms: number, promise: Promise, timeoutMessage?: string, ): Promise { - // Create a promise that rejects in milliseconds - const timeout = sleep(ms).then(() => { - throw new Error(timeoutMessage || `Timed out in ${ms} ms.`); - }); - - // Returns a race between our timeout and the passed in promise - return Promise.race([promise, timeout]); + return timeout(ms, promise, timeoutMessage); } export function showStatusUpdatesForPromise( diff --git a/desktop/app/src/utils/reduxDevToolsConfig.tsx b/desktop/app/src/utils/reduxDevToolsConfig.tsx index 0d8e446c1..251b10259 100644 --- a/desktop/app/src/utils/reduxDevToolsConfig.tsx +++ b/desktop/app/src/utils/reduxDevToolsConfig.tsx @@ -8,7 +8,7 @@ */ import {State} from '../reducers/index'; -import {DeviceExport} from '../devices/BaseDevice'; +import {DeviceExport} from '../server/devices/BaseDevice'; export const stateSanitizer = (state: State) => { if (state.connections && state.connections.devices) { diff --git a/desktop/app/src/utils/screenshot.tsx b/desktop/app/src/utils/screenshot.tsx index 0b07b8297..d0de9a1a3 100644 --- a/desktop/app/src/utils/screenshot.tsx +++ b/desktop/app/src/utils/screenshot.tsx @@ -9,7 +9,7 @@ import fs from 'fs'; import path from 'path'; -import BaseDevice from '../devices/BaseDevice'; +import BaseDevice from '../server/devices/BaseDevice'; import {reportPlatformFailures} from './metrics'; import expandTilde from 'expand-tilde'; import {remote} from 'electron'; diff --git a/desktop/flipper-plugin/src/__tests__/api.node.tsx b/desktop/flipper-plugin/src/__tests__/api.node.tsx index 787c5ff30..7f2946ce3 100644 --- a/desktop/flipper-plugin/src/__tests__/api.node.tsx +++ b/desktop/flipper-plugin/src/__tests__/api.node.tsx @@ -61,6 +61,7 @@ test('Correct top level API exposed', () => { "styled", "textContent", "theme", + "timeout", "useLocalStorageState", "useLogger", "useMemoize", diff --git a/desktop/flipper-plugin/src/index.ts b/desktop/flipper-plugin/src/index.ts index 0ce137713..60b653cee 100644 --- a/desktop/flipper-plugin/src/index.ts +++ b/desktop/flipper-plugin/src/index.ts @@ -76,6 +76,8 @@ export { export {DataFormatter} from './ui/DataFormatter'; export {sleep} from './utils/sleep'; +export {timeout} from './utils/timeout'; + export { LogTypes, TrackType, diff --git a/desktop/flipper-plugin/src/utils/timeout.tsx b/desktop/flipper-plugin/src/utils/timeout.tsx new file mode 100644 index 000000000..5ae943658 --- /dev/null +++ b/desktop/flipper-plugin/src/utils/timeout.tsx @@ -0,0 +1,24 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @format + */ + +import {sleep} from './sleep'; + +export function timeout( + ms: number, + promise: Promise, + timeoutMessage?: string, +): Promise { + // Create a promise that rejects in milliseconds + const timeout = sleep(ms).then(() => { + throw new Error(timeoutMessage || `Timed out in ${ms} ms.`); + }); + + // Returns a race between our timeout and the passed in promise + return Promise.race([promise, timeout]); +} diff --git a/docs/extending/flipper-plugin.mdx b/docs/extending/flipper-plugin.mdx index 27a2bc3a1..5664d34fe 100644 --- a/docs/extending/flipper-plugin.mdx +++ b/docs/extending/flipper-plugin.mdx @@ -1044,6 +1044,10 @@ Usage: `await sleep(1000)` Creates a promise that automatically resolves after the specified amount of milliseconds. +## timeout + +Usage `await timeout(1000, promise, message?)` + ## styled A convenience re-export of `styled` from [emotion](https://emotion.sh/docs/styled).