diff --git a/desktop/app/package.json b/desktop/app/package.json index a1b11e175..d509562ad 100644 --- a/desktop/app/package.json +++ b/desktop/app/package.json @@ -22,7 +22,6 @@ "@tanishiking/aho-corasick": "^0.0.1", "@types/archiver": "^5.1.1", "@types/uuid": "^8.3.1", - "JSONStream": "^1.3.1", "adbkit": "^2.11.1", "adbkit-logcat": "^2.0.1", "antd": "4.16.8", @@ -69,12 +68,7 @@ "redux": "^4.1.1", "redux-persist": "^6.0.0", "reselect": "^4.0.0", - "rsocket-core": "^0.0.27", - "rsocket-flowable": "^0.0.27", - "rsocket-tcp-server": "^0.0.25", - "rsocket-types": "^0.0.25", "semver": "^7.3.5", - "split2": "^3.2.2", "tmp": "^0.2.1", "uuid": "^8.3.2", "which": "^2.0.1", diff --git a/desktop/app/src/Client.tsx b/desktop/app/src/Client.tsx index 80b34f234..96306cf32 100644 --- a/desktop/app/src/Client.tsx +++ b/desktop/app/src/Client.tsx @@ -94,7 +94,7 @@ const handleError = ( crashReporterPlugin.instanceApi.reportCrash(payload); }; -interface ClientConnection { +export interface ClientConnection { send(data: any): void; sendExpectResponse(data: any): Promise; } diff --git a/desktop/app/src/__tests__/__snapshots__/createMockFlipperWithPlugin.node.tsx.snap b/desktop/app/src/__tests__/__snapshots__/createMockFlipperWithPlugin.node.tsx.snap index 2e1878ed3..8c3cd2c7f 100644 --- a/desktop/app/src/__tests__/__snapshots__/createMockFlipperWithPlugin.node.tsx.snap +++ b/desktop/app/src/__tests__/__snapshots__/createMockFlipperWithPlugin.node.tsx.snap @@ -35,7 +35,12 @@ Object { "TestPlugin", ], }, - "flipperServer": undefined, + "flipperServer": Object { + "close": [MockFunction], + "exec": [MockFunction], + "off": [MockFunction], + "on": [MockFunction], + }, "selectedAppId": "TestApp#Android#MockAndroidDevice#serial", "selectedAppPluginListRevision": 0, "selectedDevice": Object { diff --git a/desktop/app/src/chrome/MetroButton.tsx b/desktop/app/src/chrome/MetroButton.tsx index 950dd4a0e..1dad79063 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 {MetroReportableEvent} from '../server/devices/metro/MetroDevice'; +import {MetroReportableEvent} from 'flipper-common'; 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/SettingsSheet.tsx b/desktop/app/src/chrome/SettingsSheet.tsx index 19d51779e..1cb835666 100644 --- a/desktop/app/src/chrome/SettingsSheet.tsx +++ b/desktop/app/src/chrome/SettingsSheet.tsx @@ -38,7 +38,6 @@ type OwnProps = { type StateFromProps = { settings: Settings; launcherSettings: LauncherSettings; - isXcodeDetected: boolean; }; type DispatchFromProps = { @@ -356,11 +355,9 @@ class SettingsSheet extends Component { } export default connect( - ({settingsState, launcherSettingsState, connections}) => ({ + ({settingsState, launcherSettingsState}) => ({ settings: settingsState, launcherSettings: launcherSettingsState, - isXcodeDetected: - connections.flipperServer?.ios.xcodeCommandLineToolsDetected ?? false, }), {updateSettings, updateLauncherSettings}, )(withTrackingScope(SettingsSheet)); diff --git a/desktop/app/src/server/devices/__tests__/BaseDevice.node.tsx b/desktop/app/src/devices/__tests__/BaseDevice.node.tsx similarity index 96% rename from desktop/app/src/server/devices/__tests__/BaseDevice.node.tsx rename to desktop/app/src/devices/__tests__/BaseDevice.node.tsx index 82d5e89cd..ffba287ef 100644 --- a/desktop/app/src/server/devices/__tests__/BaseDevice.node.tsx +++ b/desktop/app/src/devices/__tests__/BaseDevice.node.tsx @@ -7,11 +7,11 @@ * @format */ -import * as DeviceTestPluginModule from '../../../test-utils/DeviceTestPlugin'; +import * as DeviceTestPluginModule from '../../test-utils/DeviceTestPlugin'; import {TestUtils, _SandyPluginDefinition} from 'flipper-plugin'; -import {createMockFlipperWithPlugin} from '../../../test-utils/createMockFlipperWithPlugin'; -import {TestDevice} from '../../../test-utils/TestDevice'; -import ArchivedDevice from '../../../devices/ArchivedDevice'; +import {createMockFlipperWithPlugin} from '../../test-utils/createMockFlipperWithPlugin'; +import {TestDevice} from '../../test-utils/TestDevice'; +import ArchivedDevice from '../../devices/ArchivedDevice'; const physicalDevicePluginDetails = TestUtils.createMockPluginDetails({ id: 'physicalDevicePlugin', diff --git a/desktop/app/src/dispatcher/application.tsx b/desktop/app/src/dispatcher/application.tsx index 70ff82485..1e7244c04 100644 --- a/desktop/app/src/dispatcher/application.tsx +++ b/desktop/app/src/dispatcher/application.tsx @@ -12,7 +12,6 @@ import {remote, ipcRenderer, IpcRendererEvent} from 'electron'; import {Store} from '../reducers/index'; import {Logger} from 'flipper-common'; -import {parseFlipperPorts} from '../server/utils/environmentVariables'; import { importFileToStore, IMPORT_FLIPPER_TRACE_EVENT, @@ -80,36 +79,4 @@ export default (store: Store, logger: Logger) => { }, `${IMPORT_FLIPPER_TRACE_EVENT}:Deeplink`); }, ); - - if (process.env.FLIPPER_PORTS) { - const portOverrides = parseFlipperPorts(process.env.FLIPPER_PORTS); - if (portOverrides) { - store.dispatch({ - type: 'SET_SERVER_PORTS', - payload: portOverrides, - }); - } else { - console.error( - `Ignoring malformed FLIPPER_PORTS env variable: - "${process.env.FLIPPER_PORTS || ''}". - Example expected format: "1111,2222".`, - ); - } - } - - if (process.env.FLIPPER_ALT_PORTS) { - const portOverrides = parseFlipperPorts(process.env.FLIPPER_ALT_PORTS); - if (portOverrides) { - store.dispatch({ - type: 'SET_ALT_SERVER_PORTS', - payload: portOverrides, - }); - } else { - console.error( - `Ignoring malformed FLIPPER_ALT_PORTS env variable: - "${process.env.FLIPPER_ALT_PORTS || ''}". - Example expected format: "1111,2222".`, - ); - } - } }; diff --git a/desktop/app/src/dispatcher/flipperServer.tsx b/desktop/app/src/dispatcher/flipperServer.tsx index 38b3d3571..daefe6d10 100644 --- a/desktop/app/src/dispatcher/flipperServer.tsx +++ b/desktop/app/src/dispatcher/flipperServer.tsx @@ -10,10 +10,7 @@ import React from 'react'; import {State, Store} from '../reducers/index'; import {Logger} from 'flipper-common'; -import { - FlipperServerConfig, - FlipperServerImpl, -} from '../server/FlipperServerImpl'; +import {FlipperServerImpl, setFlipperServerConfig} from 'flipper-server-core'; import {selectClient} from '../reducers/connections'; import Client from '../Client'; import {notification} from 'antd'; @@ -21,22 +18,23 @@ import BaseDevice from '../devices/BaseDevice'; import {ClientDescription, timeout} from 'flipper-common'; import {reportPlatformFailures} from 'flipper-common'; import {sideEffect} from '../utils/sideEffect'; +import {getAppTempPath, getStaticPath} from '../utils/pathUtils'; +import constants from '../fb-stubs/constants'; export default async (store: Store, logger: Logger) => { const {enableAndroid, androidHome, idbPath, enableIOS, enablePhysicalIOS} = store.getState().settingsState; - const server = new FlipperServerImpl( - { - enableAndroid, - androidHome, - idbPath, - enableIOS, - enablePhysicalIOS, - serverPorts: store.getState().application.serverPorts, - altServerPorts: store.getState().application.altServerPorts, - } as FlipperServerConfig, - logger, - ); + setFlipperServerConfig({ + enableAndroid, + androidHome, + idbPath, + enableIOS, + enablePhysicalIOS, + staticPath: getStaticPath(), + tmpPath: getAppTempPath(), + validWebSocketOrigins: constants.VALID_WEB_SOCKET_REQUEST_ORIGIN_PREFIXES, + }); + const server = new FlipperServerImpl(logger); store.dispatch({ type: 'SET_FLIPPER_SERVER', diff --git a/desktop/app/src/dispatcher/pluginManager.tsx b/desktop/app/src/dispatcher/pluginManager.tsx index 604dde909..118239d55 100644 --- a/desktop/app/src/dispatcher/pluginManager.tsx +++ b/desktop/app/src/dispatcher/pluginManager.tsx @@ -43,7 +43,7 @@ import { getClientsByAppName, getAllClients, } from '../reducers/connections'; -import {deconstructClientId} from '../utils/clientUtils'; +import {deconstructClientId} from 'flipper-common'; import {clearMessageQueue} from '../reducers/pluginMessageQueue'; import { isDevicePluginDefinition, diff --git a/desktop/app/src/dispatcher/tracking.tsx b/desktop/app/src/dispatcher/tracking.tsx index 621411fac..5393fdc92 100644 --- a/desktop/app/src/dispatcher/tracking.tsx +++ b/desktop/app/src/dispatcher/tracking.tsx @@ -27,7 +27,7 @@ import { } from '../reducers/usageTracking'; import produce from 'immer'; import BaseDevice from '../devices/BaseDevice'; -import {deconstructClientId} from '../utils/clientUtils'; +import {deconstructClientId} from 'flipper-common'; import {getCPUUsage} from 'process'; import {sideEffect} from '../utils/sideEffect'; import {getSelectionInfo} from '../utils/info'; diff --git a/desktop/app/src/index.tsx b/desktop/app/src/index.tsx index 800877761..c0bbc81f0 100644 --- a/desktop/app/src/index.tsx +++ b/desktop/app/src/index.tsx @@ -126,7 +126,6 @@ export {Rect} from './utils/geometry'; export {Logger} from 'flipper-common'; export {getLogger} from 'flipper-common'; export {callVSCode} from './utils/vscodeUtils'; -export {checkIdbIsInstalled} from './server/devices/ios/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/init.tsx b/desktop/app/src/init.tsx index cdd935628..7d8dd5700 100644 --- a/desktop/app/src/init.tsx +++ b/desktop/app/src/init.tsx @@ -51,12 +51,13 @@ import {getVersionString} from './utils/versionString'; import {PersistGate} from 'redux-persist/integration/react'; // eslint-disable-next-line flipper/no-electron-remote-imports import {ipcRenderer, remote} from 'electron'; -import {helloWorld} from 'flipper-server-core'; -import {setLoggerInstance, setUserSessionManagerInstance} from 'flipper-common'; +import { + setLoggerInstance, + setUserSessionManagerInstance, + GK as flipperCommonGK, +} from 'flipper-common'; import {internGraphPOSTAPIRequest} from './fb-stubs/user'; -helloWorld(); - if (process.env.NODE_ENV === 'development' && os.platform() === 'darwin') { // By default Node.JS has its internal certificate storage and doesn't use // the system store. Because of this, it's impossible to access ondemand / devserver @@ -186,6 +187,8 @@ function setProcessState(store: Store) { } function init() { + // TODO: centralise all those initialisations in a single configuration call + flipperCommonGK.get = (name) => GK.get(name); const store = getStore(); const logger = initLogger(store); setLoggerInstance(logger); diff --git a/desktop/app/src/reducers/application.tsx b/desktop/app/src/reducers/application.tsx index 618c9f5fb..4ea11e819 100644 --- a/desktop/app/src/reducers/application.tsx +++ b/desktop/app/src/reducers/application.tsx @@ -17,10 +17,6 @@ export type LauncherMsg = { message: string; severity: 'warning' | 'error'; }; -export type ServerPorts = { - insecure: number; - secure: number; -}; export type StatusMessageType = { msg: string; @@ -49,8 +45,6 @@ export type State = { windowIsFocused: boolean; share: ShareType | null; sessionId: string | null; - serverPorts: ServerPorts; - altServerPorts: ServerPorts; launcherMsg: LauncherMsg; statusMessages: Array; }; @@ -69,20 +63,6 @@ export type Action = type: 'windowIsFocused'; payload: {isFocused: boolean; time: number}; } - | { - type: 'SET_SERVER_PORTS'; - payload: { - insecure: number; - secure: number; - }; - } - | { - type: 'SET_ALT_SERVER_PORTS'; - payload: { - insecure: number; - secure: number; - }; - } | { type: 'LAUNCHER_MSG'; payload: { @@ -107,14 +87,6 @@ export const initialState: () => State = () => ({ activeSheet: null, share: null, sessionId: uuidv1(), - serverPorts: { - insecure: 8089, - secure: 8088, - }, - altServerPorts: { - insecure: 9089, - secure: 9088, - }, launcherMsg: { severity: 'warning', message: '', @@ -163,16 +135,6 @@ export default function reducer( ...state, windowIsFocused: action.payload.isFocused, }; - } else if (action.type === 'SET_SERVER_PORTS') { - return { - ...state, - serverPorts: action.payload, - }; - } else if (action.type === 'SET_ALT_SERVER_PORTS') { - return { - ...state, - altServerPorts: action.payload, - }; } else if (action.type === 'LAUNCHER_MSG') { return { ...state, diff --git a/desktop/app/src/reducers/connections.tsx b/desktop/app/src/reducers/connections.tsx index e3c6aa29e..0c385b797 100644 --- a/desktop/app/src/reducers/connections.tsx +++ b/desktop/app/src/reducers/connections.tsx @@ -12,16 +12,20 @@ import {produce} from 'immer'; import type BaseDevice from '../devices/BaseDevice'; import type Client from '../Client'; -import type {UninitializedClient, DeviceOS, Logger} from 'flipper-common'; +import type { + UninitializedClient, + DeviceOS, + Logger, + FlipperServer, +} from 'flipper-common'; import {performance} from 'perf_hooks'; import type {Actions} from '.'; import {WelcomeScreenStaticView} from '../sandy-chrome/WelcomeScreen'; import {isDevicePluginDefinition} from '../utils/pluginUtils'; import {getPluginKey} from '../utils/pluginKey'; -import {deconstructClientId} from '../utils/clientUtils'; +import {deconstructClientId} from 'flipper-common'; import type {RegisterPluginAction} from './plugins'; -import {FlipperServerImpl} from '../server/FlipperServerImpl'; import {shallowEqual} from 'react-redux'; export type StaticViewProps = {logger: Logger}; @@ -74,7 +78,7 @@ type StateV2 = { deepLinkPayload: unknown; staticView: StaticView; selectedAppPluginListRevision: number; - flipperServer: FlipperServerImpl | undefined; + flipperServer: FlipperServer | undefined; }; type StateV1 = Omit & { @@ -158,7 +162,7 @@ export type Action = } | { type: 'SET_FLIPPER_SERVER'; - payload: FlipperServerImpl; + payload: FlipperServer; } | RegisterPluginAction; diff --git a/desktop/app/src/reducers/pluginMessageQueue.tsx b/desktop/app/src/reducers/pluginMessageQueue.tsx index 8ae45bc6f..728fea0ec 100644 --- a/desktop/app/src/reducers/pluginMessageQueue.tsx +++ b/desktop/app/src/reducers/pluginMessageQueue.tsx @@ -8,7 +8,7 @@ */ import produce from 'immer'; -import {deconstructPluginKey} from '../utils/clientUtils'; +import {deconstructPluginKey} from 'flipper-common'; export const DEFAULT_MAX_QUEUE_SIZE = 10000; diff --git a/desktop/app/src/reducers/supportForm.tsx b/desktop/app/src/reducers/supportForm.tsx index 0cbea179b..193792dfc 100644 --- a/desktop/app/src/reducers/supportForm.tsx +++ b/desktop/app/src/reducers/supportForm.tsx @@ -9,7 +9,7 @@ import {Actions, Store} from './'; import {setStaticView} from './connections'; -import {deconstructClientId} from '../utils/clientUtils'; +import {deconstructClientId} from 'flipper-common'; import {switchPlugin} from './pluginManager'; import {showStatusUpdatesForDuration} from '../utils/promiseTimeout'; import {selectedPlugins as setSelectedPlugins} from './plugins'; diff --git a/desktop/app/src/sandy-chrome/appinspect/LaunchEmulator.tsx b/desktop/app/src/sandy-chrome/appinspect/LaunchEmulator.tsx index bc17c5e2e..d7522a1a4 100644 --- a/desktop/app/src/sandy-chrome/appinspect/LaunchEmulator.tsx +++ b/desktop/app/src/sandy-chrome/appinspect/LaunchEmulator.tsx @@ -17,13 +17,9 @@ import { } from '@ant-design/icons'; import {Store} from '../../reducers'; import {useStore} from '../../utils/useStore'; -import {launchEmulator} from '../../server/devices/android/AndroidDevice'; import {Layout, renderReactRoot, withTrackingScope} from 'flipper-plugin'; import {Provider} from 'react-redux'; -import { - launchSimulator, // TODO: move to iOSDeviceManager - IOSDeviceParams, -} from '../../server/devices/ios/iOSDeviceManager'; +import {IOSDeviceParams} from 'flipper-common'; const COLD_BOOT = 'cold-boot'; @@ -36,26 +32,12 @@ export function showEmulatorLauncher(store: Store) { } function LaunchEmulatorContainer({onClose}: {onClose: () => void}) { - const flipperServer = useStore((state) => state.connections.flipperServer); - return ( - flipperServer!.ios.getSimulators(false)} - getEmulators={() => flipperServer!.android.getAndroidEmulators()} - /> - ); + return ; } export const LaunchEmulatorDialog = withTrackingScope( - function LaunchEmulatorDialog({ - onClose, - getSimulators, - getEmulators, - }: { - onClose: () => void; - getSimulators: () => Promise; - getEmulators: () => Promise; - }) { + function LaunchEmulatorDialog({onClose}: {onClose: () => void}) { + const flipperServer = useStore((state) => state.connections.flipperServer); const iosEnabled = useStore((state) => state.settingsState.enableIOS); const androidEnabled = useStore( (state) => state.settingsState.enableAndroid, @@ -63,12 +45,12 @@ export const LaunchEmulatorDialog = withTrackingScope( const [iosEmulators, setIosEmulators] = useState([]); const [androidEmulators, setAndroidEmulators] = useState([]); - const store = useStore(); useEffect(() => { if (!iosEnabled) { return; } - getSimulators() + flipperServer! + .exec('ios-get-simulators', false) .then((emulators) => { setIosEmulators( emulators.filter( @@ -81,20 +63,21 @@ export const LaunchEmulatorDialog = withTrackingScope( .catch((e) => { console.warn('Failed to find simulators', e); }); - }, [iosEnabled, getSimulators, store]); + }, [iosEnabled, flipperServer]); useEffect(() => { if (!androidEnabled) { return; } - getEmulators() + flipperServer! + .exec('android-get-emulators') .then((emulators) => { setAndroidEmulators(emulators); }) .catch((e) => { console.warn('Failed to find emulators', e); }); - }, [androidEnabled, getEmulators]); + }, [androidEnabled, flipperServer]); const items = [ ...(androidEmulators.length > 0 @@ -102,7 +85,8 @@ export const LaunchEmulatorDialog = withTrackingScope( : []), ...androidEmulators.map((name) => { const launch = (coldBoot: boolean) => { - launchEmulator(name, coldBoot) + flipperServer! + .exec('android-launch-emulator', name, coldBoot) .then(onClose) .catch((e) => { console.error('Failed to start emulator: ', e); @@ -139,7 +123,8 @@ export const LaunchEmulatorDialog = withTrackingScope(