From eed19b3a3d96e592a33217a937a6b36a18a0eaec Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Wed, 8 Dec 2021 04:25:28 -0800 Subject: [PATCH] Move FlipperServer initialisation out of flipper-core Summary: This diff makes sure flipper-ui-core no longer depends on flipper-server-core. Currently server config is still transferred from UI to server, which doesn't really make sense in future scenarios where server might start before client, but will address that separately Reviewed By: timur-valiev, aigoncharov Differential Revision: D32462835 fbshipit-source-id: 498a944256ba1aabbf963b896953e64d11e27214 --- .../app/src/electron/initializeElectron.tsx | 19 +++++++++-- desktop/flipper-common/src/server-types.tsx | 1 + desktop/flipper-dump/src/index.tsx | 2 +- .../src/test-utils/test-utils.tsx | 29 ++++++++++++++++- .../src/FlipperServerConfig.tsx | 4 +-- .../src/devices/ios/IOSBridge.tsx | 2 +- desktop/flipper-ui-core/package.json | 1 - desktop/flipper-ui-core/src/RenderHost.tsx | 14 +++++++- .../createMockFlipperWithPlugin.node.tsx.snap | 1 + .../src/devices/ArchivedDevice.tsx | 1 + .../src/dispatcher/flipperServer.tsx | 23 +++++-------- .../__tests__/LaunchEmulator.spec.tsx | 7 ++-- .../src/test-utils/MockFlipper.tsx | 4 +-- .../src/test-utils/TestDevice.tsx | 1 + .../test-utils/createFlipperServerMock.tsx | 32 ------------------- desktop/flipper-ui-core/tsconfig.json | 3 -- 16 files changed, 79 insertions(+), 65 deletions(-) delete mode 100644 desktop/flipper-ui-core/src/test-utils/createFlipperServerMock.tsx diff --git a/desktop/app/src/electron/initializeElectron.tsx b/desktop/app/src/electron/initializeElectron.tsx index 37b1aacf5..03f4cce4c 100644 --- a/desktop/app/src/electron/initializeElectron.tsx +++ b/desktop/app/src/electron/initializeElectron.tsx @@ -26,9 +26,12 @@ import type {RenderHost} from 'flipper-ui-core'; import fs from 'fs'; import {setupMenuBar} from './setupMenuBar'; import os from 'os'; +import {FlipperServerImpl} from 'flipper-server-core'; declare global { interface Window { + // We store this as a global, to make sure the renderHost is available + // before flipper-ui-core is loaded and needs those during module initialisation FlipperRenderHostInstance: RenderHost; } } @@ -46,6 +49,8 @@ export function initializeElectron() { const app = remote.app; const execPath = process.execPath || remote.process.execPath; const isProduction = !/node_modules[\\/]electron[\\/]/.test(execPath); + const staticPath = getStaticDir(); + const tempPath = app.getPath('temp'); function restart(update: boolean = false) { if (isProduction) { @@ -192,11 +197,21 @@ export function initializeElectron() { appPath: app.getAppPath(), homePath: app.getPath('home'), execPath, - staticPath: getStaticDir(), - tempPath: app.getPath('temp'), + staticPath, + tempPath, desktopPath: app.getPath('desktop'), }, loadDefaultPlugins: getDefaultPluginsIndex, + startFlipperServer({logger, ...config}) { + return new FlipperServerImpl( + { + ...config, + staticPath, + tempPath, + }, + logger, + ); + }, }; setupMenuBar(); diff --git a/desktop/flipper-common/src/server-types.tsx b/desktop/flipper-common/src/server-types.tsx index ec71cdae1..4e67125bf 100644 --- a/desktop/flipper-common/src/server-types.tsx +++ b/desktop/flipper-common/src/server-types.tsx @@ -154,6 +154,7 @@ export type FlipperServerCommands = { }; export interface FlipperServer { + start(): Promise; on( event: Event, callback: (payload: FlipperServerEvents[Event]) => void, diff --git a/desktop/flipper-dump/src/index.tsx b/desktop/flipper-dump/src/index.tsx index f51a5f69e..629d17573 100644 --- a/desktop/flipper-dump/src/index.tsx +++ b/desktop/flipper-dump/src/index.tsx @@ -74,7 +74,7 @@ async function start(deviceTitle: string, appName: string, pluginId: string) { enableIOS: true, enablePhysicalIOS: true, staticPath: path.resolve(__dirname, '..', '..', 'static'), - tmpPath: os.tmpdir(), + tempPath: os.tmpdir(), validWebSocketOrigins: [], }, logger, diff --git a/desktop/flipper-plugin/src/test-utils/test-utils.tsx b/desktop/flipper-plugin/src/test-utils/test-utils.tsx index aca614e98..86c8fe328 100644 --- a/desktop/flipper-plugin/src/test-utils/test-utils.tsx +++ b/desktop/flipper-plugin/src/test-utils/test-utils.tsx @@ -40,7 +40,11 @@ import {stubLogger} from '../utils/Logger'; import {Idler} from '../utils/Idler'; import {createState} from '../state/atom'; import baseMockConsole from 'jest-mock-console'; -import {DeviceLogEntry} from 'flipper-common'; +import { + DeviceLogEntry, + FlipperServer, + FlipperServerCommands, +} from 'flipper-common'; type Renderer = RenderResult; @@ -581,3 +585,26 @@ export function mockConsole() { } export type MockedConsole = ReturnType; + +export function createFlipperServerMock( + overrides?: Partial, +): FlipperServer { + return { + async start() {}, + on: jest.fn(), + off: jest.fn(), + exec: jest + .fn() + .mockImplementation( + (cmd: keyof FlipperServerCommands, ...args: any[]) => { + if (overrides?.[cmd]) { + return (overrides[cmd] as any)(...args); + } + return Promise.reject( + new Error(`FlipperServerMock exec not implemented: ${cmd}}`), + ); + }, + ), + close: jest.fn(), + }; +} diff --git a/desktop/flipper-server-core/src/FlipperServerConfig.tsx b/desktop/flipper-server-core/src/FlipperServerConfig.tsx index d4d05491f..ced983527 100644 --- a/desktop/flipper-server-core/src/FlipperServerConfig.tsx +++ b/desktop/flipper-server-core/src/FlipperServerConfig.tsx @@ -18,7 +18,7 @@ export interface FlipperServerConfig { enablePhysicalIOS: boolean; validWebSocketOrigins: string[]; staticPath: string; - tmpPath: string; + tempPath: string; } // defaultConfig should be used for testing only, and disables by default all features @@ -30,7 +30,7 @@ const testConfig: FlipperServerConfig = { idbPath: '', validWebSocketOrigins: [], staticPath: '/static/', - tmpPath: '/temp/', + tempPath: '/temp/', }; let currentConfig: FlipperServerConfig | undefined = undefined; diff --git a/desktop/flipper-server-core/src/devices/ios/IOSBridge.tsx b/desktop/flipper-server-core/src/devices/ios/IOSBridge.tsx index 9f918ebff..f9c4bea10 100644 --- a/desktop/flipper-server-core/src/devices/ios/IOSBridge.tsx +++ b/desktop/flipper-server-core/src/devices/ios/IOSBridge.tsx @@ -98,7 +98,7 @@ export function xcrunStartLogListener(udid: string, deviceType: DeviceType) { function makeTempScreenshotFilePath() { const imageName = uuid() + '.png'; - return path.join(getFlipperServerConfig().tmpPath, imageName); + return path.join(getFlipperServerConfig().tempPath, imageName); } async function runScreenshotCommand( diff --git a/desktop/flipper-ui-core/package.json b/desktop/flipper-ui-core/package.json index f7050e5e3..4760c3372 100644 --- a/desktop/flipper-ui-core/package.json +++ b/desktop/flipper-ui-core/package.json @@ -34,7 +34,6 @@ "flipper-doctor": "0.0.0", "flipper-plugin": "0.0.0", "flipper-plugin-lib": "0.0.0", - "flipper-server-core": "0.0.0", "flipper-ui-core": "0.0.0", "fs-extra": "^10.0.0", "immer": "^9.0.6", diff --git a/desktop/flipper-ui-core/src/RenderHost.tsx b/desktop/flipper-ui-core/src/RenderHost.tsx index 391d50ce6..63bf118f5 100644 --- a/desktop/flipper-ui-core/src/RenderHost.tsx +++ b/desktop/flipper-ui-core/src/RenderHost.tsx @@ -10,8 +10,9 @@ import type {NotificationEvents} from './dispatcher/notifications'; import type {PluginNotification} from './reducers/notifications'; import type {NotificationConstructorOptions} from 'electron'; -import type {FlipperLib} from 'flipper-plugin'; +import {FlipperLib, TestUtils} from 'flipper-plugin'; import path from 'path'; +import {FlipperServer, Logger} from 'flipper-common'; type ENVIRONMENT_VARIABLES = 'NODE_ENV' | 'DEV_SERVER_URL' | 'CONFIG'; type ENVIRONMENT_PATHS = @@ -106,6 +107,16 @@ export interface RenderHost { paths: Record; openLink(url: string): void; loadDefaultPlugins(): Record; + startFlipperServer(config: { + // TODO: this config is temporarily, settings should be loaded/stored by server, not client + logger: Logger; + enableAndroid: boolean; + androidHome: string; + enableIOS: boolean; + enablePhysicalIOS: boolean; + idbPath: string; + validWebSocketOrigins: string[]; + }): FlipperServer; } export function getRenderHostInstance(): RenderHost { @@ -154,5 +165,6 @@ if (process.env.NODE_ENV === 'test') { loadDefaultPlugins() { return {}; }, + startFlipperServer: () => TestUtils.createFlipperServerMock(), }; } diff --git a/desktop/flipper-ui-core/src/__tests__/__snapshots__/createMockFlipperWithPlugin.node.tsx.snap b/desktop/flipper-ui-core/src/__tests__/__snapshots__/createMockFlipperWithPlugin.node.tsx.snap index 4c51eb724..2cd6f85e5 100644 --- a/desktop/flipper-ui-core/src/__tests__/__snapshots__/createMockFlipperWithPlugin.node.tsx.snap +++ b/desktop/flipper-ui-core/src/__tests__/__snapshots__/createMockFlipperWithPlugin.node.tsx.snap @@ -40,6 +40,7 @@ Object { "exec": [MockFunction], "off": [MockFunction], "on": [MockFunction], + "start": [Function], }, "pluginMenuEntries": Array [], "selectedAppId": "TestApp#Android#MockAndroidDevice#serial", diff --git a/desktop/flipper-ui-core/src/devices/ArchivedDevice.tsx b/desktop/flipper-ui-core/src/devices/ArchivedDevice.tsx index 366ee8b13..74b668485 100644 --- a/desktop/flipper-ui-core/src/devices/ArchivedDevice.tsx +++ b/desktop/flipper-ui-core/src/devices/ArchivedDevice.tsx @@ -26,6 +26,7 @@ export default class ArchivedDevice extends BaseDevice { }) { super( { + async start() {}, close() {}, exec(command, ..._args: any[]) { throw new Error( diff --git a/desktop/flipper-ui-core/src/dispatcher/flipperServer.tsx b/desktop/flipper-ui-core/src/dispatcher/flipperServer.tsx index ac7d493ce..a8bdb5cf8 100644 --- a/desktop/flipper-ui-core/src/dispatcher/flipperServer.tsx +++ b/desktop/flipper-ui-core/src/dispatcher/flipperServer.tsx @@ -14,15 +14,12 @@ import { Logger, NoLongerConnectedToClientError, } from 'flipper-common'; -import {FlipperServerImpl} from 'flipper-server-core'; -import {selectClient} from '../reducers/connections'; import Client from '../Client'; import {notification} from 'antd'; import BaseDevice from '../devices/BaseDevice'; import {ClientDescription, timeout} from 'flipper-common'; import {reportPlatformFailures} from 'flipper-common'; import {sideEffect} from '../utils/sideEffect'; -import {getStaticPath} from '../utils/pathUtils'; import constants from '../fb-stubs/constants'; import {getRenderHostInstance} from '../RenderHost'; @@ -30,19 +27,15 @@ 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, - staticPath: getStaticPath(), - tmpPath: getRenderHostInstance().paths.tempPath, - validWebSocketOrigins: constants.VALID_WEB_SOCKET_REQUEST_ORIGIN_PREFIXES, - }, + const server = getRenderHostInstance().startFlipperServer({ logger, - ); + enableAndroid, + androidHome, + idbPath, + enableIOS, + enablePhysicalIOS, + validWebSocketOrigins: constants.VALID_WEB_SOCKET_REQUEST_ORIGIN_PREFIXES, + }); store.dispatch({ type: 'SET_FLIPPER_SERVER', diff --git a/desktop/flipper-ui-core/src/sandy-chrome/appinspect/__tests__/LaunchEmulator.spec.tsx b/desktop/flipper-ui-core/src/sandy-chrome/appinspect/__tests__/LaunchEmulator.spec.tsx index 9e50bfaf8..b707103e4 100644 --- a/desktop/flipper-ui-core/src/sandy-chrome/appinspect/__tests__/LaunchEmulator.spec.tsx +++ b/desktop/flipper-ui-core/src/sandy-chrome/appinspect/__tests__/LaunchEmulator.spec.tsx @@ -14,12 +14,11 @@ import {createStore} from 'redux'; import {LaunchEmulatorDialog} from '../LaunchEmulator'; import {createRootReducer} from '../../../reducers'; -import {sleep} from 'flipper-plugin'; -import {createFlipperServerMock} from '../../../test-utils/createFlipperServerMock'; +import {sleep, TestUtils} from 'flipper-plugin'; test('Can render and launch android apps - empty', async () => { const store = createStore(createRootReducer()); - const mockServer = createFlipperServerMock({ + const mockServer = TestUtils.createFlipperServerMock({ 'ios-get-simulators': () => Promise.resolve([]), 'android-get-emulators': () => Promise.resolve([]), }); @@ -49,7 +48,7 @@ test('Can render and launch android apps', async () => { const store = createStore(createRootReducer()); const launch = jest.fn().mockImplementation(() => Promise.resolve()); - const mockServer = createFlipperServerMock({ + const mockServer = TestUtils.createFlipperServerMock({ 'ios-get-simulators': () => Promise.resolve([]), 'android-get-emulators': () => (p = Promise.resolve(['emulator1', 'emulator2'])), diff --git a/desktop/flipper-ui-core/src/test-utils/MockFlipper.tsx b/desktop/flipper-ui-core/src/test-utils/MockFlipper.tsx index d62eb2070..ebe6632f5 100644 --- a/desktop/flipper-ui-core/src/test-utils/MockFlipper.tsx +++ b/desktop/flipper-ui-core/src/test-utils/MockFlipper.tsx @@ -27,8 +27,8 @@ import {PluginDetails} from 'flipper-plugin-lib'; import ArchivedDevice from '../devices/ArchivedDevice'; import {ClientQuery, DeviceOS} from 'flipper-common'; import {TestDevice} from './TestDevice'; -import {createFlipperServerMock} from './createFlipperServerMock'; import {getRenderHostInstance} from '../RenderHost'; +import {TestUtils} from 'flipper-plugin'; export interface AppOptions { plugins?: PluginDefinition[]; @@ -58,7 +58,7 @@ export default class MockFlipper { private _clients: Client[] = []; private _deviceCounter: number = 0; private _clientCounter: number = 0; - flipperServer: FlipperServer = createFlipperServerMock(); + flipperServer: FlipperServer = TestUtils.createFlipperServerMock(); public get store(): Store { return this._store; diff --git a/desktop/flipper-ui-core/src/test-utils/TestDevice.tsx b/desktop/flipper-ui-core/src/test-utils/TestDevice.tsx index f8b9d6c56..3fcec6728 100644 --- a/desktop/flipper-ui-core/src/test-utils/TestDevice.tsx +++ b/desktop/flipper-ui-core/src/test-utils/TestDevice.tsx @@ -21,6 +21,7 @@ export class TestDevice extends BaseDevice { ) { super( { + async start() {}, on: jest.fn(), off: jest.fn(), exec: jest.fn(), diff --git a/desktop/flipper-ui-core/src/test-utils/createFlipperServerMock.tsx b/desktop/flipper-ui-core/src/test-utils/createFlipperServerMock.tsx deleted file mode 100644 index 0a9756758..000000000 --- a/desktop/flipper-ui-core/src/test-utils/createFlipperServerMock.tsx +++ /dev/null @@ -1,32 +0,0 @@ -/** - * 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 {FlipperServer, FlipperServerCommands} from 'flipper-common'; - -export function createFlipperServerMock( - overrides?: Partial, -): FlipperServer { - return { - on: jest.fn(), - off: jest.fn(), - exec: jest - .fn() - .mockImplementation( - (cmd: keyof FlipperServerCommands, ...args: any[]) => { - if (overrides?.[cmd]) { - return (overrides[cmd] as any)(...args); - } - return Promise.reject( - new Error(`FlipperServerMock exec not implemented: ${cmd}}`), - ); - }, - ), - close: jest.fn(), - }; -} diff --git a/desktop/flipper-ui-core/tsconfig.json b/desktop/flipper-ui-core/tsconfig.json index 98e11fe87..ef90c5401 100644 --- a/desktop/flipper-ui-core/tsconfig.json +++ b/desktop/flipper-ui-core/tsconfig.json @@ -16,9 +16,6 @@ { "path": "../flipper-plugin" }, - { - "path": "../flipper-server-core" - }, { "path": "../plugin-lib" },