diff --git a/desktop/static/launcher.tsx b/desktop/static/launcher.tsx deleted file mode 100644 index abc597f51..000000000 --- a/desktop/static/launcher.tsx +++ /dev/null @@ -1,100 +0,0 @@ -/** - * Copyright (c) Meta Platforms, Inc. and 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 os from 'os'; -import fs from 'fs'; -import path from 'path'; -import {spawn} from 'child_process'; -import xdg from 'xdg-basedir'; -import mkdirp from 'mkdirp'; - -const isProduction = () => - !/node_modules[\\/]electron[\\/]/.test(process.execPath); - -const isLauncherInstalled = async () => { - if (os.type() == 'Darwin') { - const receipt = 'com.facebook.flipper.launcher'; - const plistLocation = '/Applications/Flipper.app/Contents/Info.plist'; - try { - return ( - (await fs.promises.stat(plistLocation)) && - (await fs.promises.readFile(plistLocation)).indexOf(receipt) > 0 - ); - } catch (e) { - console.error('Error while reading Info.plist', e); - return false; - } - } - - return false; -}; - -const startLauncher = (argv: {file?: string; url?: string}) => { - const args = []; - if (argv.file) { - args.push('--file', argv.file); - } - if (argv.url) { - args.push('--url', argv.url); - } - if (os.type() == 'Darwin') { - spawn('open', ['/Applications/Flipper.app', '--args'].concat(args)); - } -}; - -const checkIsCycle = async () => { - const dir = path.join(xdg.cache!, 'flipper'); - const filePath = path.join(dir, 'last-launcher-run'); - // This isn't monotonically increasing, so there's a change we get time drift - // between the checks, but the worst case here is that we do two roundtrips - // before this check works. - const rightNow = Date.now(); - - let backThen; - try { - backThen = parseInt((await fs.promises.readFile(filePath)).toString(), 10); - } catch (e) { - backThen = 0; - } - - const delta = rightNow - backThen; - await mkdirp(dir); - await fs.promises.writeFile(filePath, '' + rightNow); - - // If the last startup was less than 5s ago, something's not okay. - return Math.abs(delta) < 5000; -}; - -/** - * Runs the launcher if required and returns a boolean based on whether - * it has. You should shut down this instance of the app in that case. - */ -export default async function delegateToLauncher(argv: { - launcher: boolean; - file?: string; - url?: string; -}) { - if (argv.launcher && isProduction() && (await isLauncherInstalled())) { - if (await checkIsCycle()) { - console.error( - 'Launcher cycle detected. Not delegating even though I usually would.', - ); - return false; - } - - console.warn('Delegating to Flipper Launcher ...'); - console.warn( - `You can disable this behavior by passing '--no-launcher' at startup.`, - ); - startLauncher(argv); - return true; - } - - return false; -} diff --git a/desktop/static/main.tsx b/desktop/static/main.tsx index 6b872f636..96d34c4ef 100644 --- a/desktop/static/main.tsx +++ b/desktop/static/main.tsx @@ -28,7 +28,6 @@ import fixPath from 'fix-path'; import {exec} from 'child_process'; import setup, {Config, configPath} from './setup'; import isFB from './fb-stubs/isFB'; -import delegateToLauncher from './launcher'; import yargs from 'yargs'; import {promisify} from 'util'; import process from 'process'; @@ -174,58 +173,50 @@ app.on('ready', async () => { const config = await setup(argv); processConfig(config); - // If we delegate to the launcher, shut down this instance of the app. - delegateToLauncher(argv) - .then(async (hasLauncherInvoked: boolean) => { - if (hasLauncherInvoked) { - app.quit(); - return; - } - appReady = true; - app.commandLine.appendSwitch('scroll-bounce'); - configureSession(); - createWindow(config); + appReady = true; - // if in development install the react devtools extension - if (process.env.NODE_ENV === 'development') { - const { - default: installExtension, - REACT_DEVELOPER_TOOLS, - } = require('electron-devtools-installer'); - // if set, try to download a newever version of the dev tools - const forceDownload = process.env.FLIPPER_UPDATE_DEV_TOOLS === 'true'; - if (forceDownload) { - console.log('Force updating DevTools'); - } - // React - // Fix for extension loading (see D27685981) - // Work around per https://github.com/electron/electron/issues/23662#issuecomment-787420799 - const reactDevToolsPath = `${os.homedir()}/Library/Application Support/Electron/extensions/${ - REACT_DEVELOPER_TOOLS.id - }`; - if (await promisify(fs.exists)(reactDevToolsPath)) { - console.log('Loading React devtools from disk ' + reactDevToolsPath); - try { - await session.defaultSession.loadExtension( - reactDevToolsPath, - // @ts-ignore only supported (and needed) in Electron 12 - {allowFileAccess: true}, - ); - } catch (e) { - console.error('Failed to load React devtools from disk: ', e); - } - } else { - try { - await installExtension(REACT_DEVELOPER_TOOLS.id, { - loadExtensionOptions: {allowFileAccess: true, forceDownload}, - }); - } catch (e) { - console.error('Failed to install React devtools extension', e); - } - } + app.commandLine.appendSwitch('scroll-bounce'); + configureSession(); + createWindow(config); + + // if in development install the react devtools extension + if (process.env.NODE_ENV === 'development') { + const { + default: installExtension, + REACT_DEVELOPER_TOOLS, + } = require('electron-devtools-installer'); + // if set, try to download a newever version of the dev tools + const forceDownload = process.env.FLIPPER_UPDATE_DEV_TOOLS === 'true'; + if (forceDownload) { + console.log('Force updating DevTools'); + } + // React + // Fix for extension loading (see D27685981) + // Work around per https://github.com/electron/electron/issues/23662#issuecomment-787420799 + const reactDevToolsPath = `${os.homedir()}/Library/Application Support/Electron/extensions/${ + REACT_DEVELOPER_TOOLS.id + }`; + if (await promisify(fs.exists)(reactDevToolsPath)) { + console.log('Loading React devtools from disk ' + reactDevToolsPath); + try { + await session.defaultSession.loadExtension( + reactDevToolsPath, + // @ts-ignore only supported (and needed) in Electron 12 + {allowFileAccess: true}, + ); + } catch (e) { + console.error('Failed to load React devtools from disk: ', e); } - }) - .catch((e: any) => console.error('Error while delegating app launch', e)); + } else { + try { + await installExtension(REACT_DEVELOPER_TOOLS.id, { + loadExtensionOptions: {allowFileAccess: true, forceDownload}, + }); + } catch (e) { + console.error('Failed to install React devtools extension', e); + } + } + } }); app.on('web-contents-created', (_event, contents) => {