From 8c2ef5738e565a93562dc7b97d9b54e12a78f7bf Mon Sep 17 00:00:00 2001 From: Andrey Goncharov Date: Thu, 30 Jun 2022 07:50:06 -0700 Subject: [PATCH] Remove Tail Summary: We no longer need to Tail the logs as we stream the logs over WebSockets (see D37459924 (https://github.com/facebook/flipper/commit/dcbc7c40bb79399eccf6b36f569a7ed55e3afbe8)) Reviewed By: lblasa Differential Revision: D37550482 fbshipit-source-id: 92a87f2ba1ecec140bbbb9e71df107341765ad46 --- desktop/app/src/init.tsx | 19 --- desktop/flipper-server-core/src/index.tsx | 1 - .../flipper-server-core/src/utils/tail.tsx | 144 ------------------ 3 files changed, 164 deletions(-) delete mode 100644 desktop/flipper-server-core/src/utils/tail.tsx diff --git a/desktop/app/src/init.tsx b/desktop/app/src/init.tsx index df78b3584..9c7ad9c30 100644 --- a/desktop/app/src/init.tsx +++ b/desktop/app/src/init.tsx @@ -28,12 +28,10 @@ import { setupPrefetcher, startFlipperServer, startServer, - Tail, } from 'flipper-server-core'; import { FlipperServer, getLogger, - LoggerInfo, isTest, Logger, parseEnvironmentVariables, @@ -168,11 +166,6 @@ async function getFlipperServer( await server.connect(); await readyForIncomingConnections(server, companionEnv); - } else { - console.info('flipper-server: already running'); - const loggerOutputFile = 'flipper-server-log.out'; - - tailServerLogs(path.join(staticPath, loggerOutputFile)); } return getExternalServer(socketPath); @@ -237,18 +230,6 @@ function getStaticDir(appPath: string) { return _staticPath; } -function tailServerLogs(logsPath: string) { - console.info('flipper-server logs located at: ', logsPath); - const tail = new Tail(logsPath); - tail.on('line', (line: any) => { - try { - const loggerInfo: LoggerInfo = JSON.parse(line); - console[loggerInfo.type](loggerInfo.msg); - } catch (_) {} - }); - tail.watch(); -} - // getLogger() is not yet created when the electron app starts. // we can't create it here yet, as the real logger is wired up to // the redux store and the rest of the world. So we create a delegating logger diff --git a/desktop/flipper-server-core/src/index.tsx b/desktop/flipper-server-core/src/index.tsx index 1b3fe2729..e8dcc900e 100644 --- a/desktop/flipper-server-core/src/index.tsx +++ b/desktop/flipper-server-core/src/index.tsx @@ -12,7 +12,6 @@ export {loadSettings} from './utils/settings'; export {loadLauncherSettings} from './utils/launcherSettings'; export {loadProcessConfig} from './utils/processConfig'; export {getEnvironmentInfo} from './utils/environmentInfo'; -export * from './utils/tail'; export {getGatekeepers} from './gk'; export {setupPrefetcher} from './fb-stubs/Prefetcher'; export * from './server/attachSocketServer'; diff --git a/desktop/flipper-server-core/src/utils/tail.tsx b/desktop/flipper-server-core/src/utils/tail.tsx deleted file mode 100644 index 2c78b8fe4..000000000 --- a/desktop/flipper-server-core/src/utils/tail.tsx +++ /dev/null @@ -1,144 +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 EventEmitter from 'events'; -import fs, {FSWatcher} from 'fs-extra'; -import path from 'path'; - -export type TailOptions = { - separator: RegExp; - encoding: BufferEncoding; - fromBeginning: boolean; -}; - -type TailBlock = { - start: number; - end: number; -}; - -export class Tail extends EventEmitter { - absPath: string; - dispatcher = new EventEmitter(); - buffer = ''; - queue: TailBlock[] = []; - isWatching = false; - currentCursorPosition = 0; - watcher: FSWatcher | undefined = undefined; - - constructor( - private readonly filename: string, - private readonly options: TailOptions = { - separator: /[\r]{0,1}\n/, - fromBeginning: true, - encoding: 'utf8', - }, - ) { - super(); - - this.absPath = path.dirname(this.filename); - this.dispatcher.on('next', () => { - this.read_(); - }); - } - - async watch() { - if (this.isWatching) { - return; - } - this.isWatching = true; - - let startingCursor = 0; - if (!this.options.fromBeginning) { - startingCursor = await this.latestPosition_(); - } - - this.watch_(startingCursor, this.options.fromBeginning); - } - - unwatch() { - if (this.watcher) { - this.watcher.close(); - } - this.isWatching = false; - } - - private async latestPosition_(): Promise { - return (await fs.stat(this.filename)).size; - } - - private read_() { - if (this.queue.length >= 1) { - const block = this.queue[0]; - if (block.end > block.start) { - const stream = fs.createReadStream(this.filename, { - start: block.start, - end: block.end - 1, - encoding: this.options.encoding, - }); - stream.on('error', (error) => { - this.emit('error', error); - }); - stream.on('end', () => { - this.queue.shift(); - if (this.queue.length > 0) { - this.dispatcher.emit('next'); - } - if (this.buffer.length > 0) { - this.emit('line', this.buffer); - this.buffer = ''; - } - }); - stream.on('data', (d) => { - this.buffer += d; - const parts = this.buffer.split(this.options.separator); - // The last part may be an incomplete chunk, so - // push that back into the buffer. Otherwise, reset buffer. - this.buffer = parts.pop() || ''; - for (const chunk of parts) { - this.emit('line', chunk); - } - }); - } - } - } - - private async fileUpdated_() { - const latestPosition = await this.latestPosition_(); - // Case where text is not appended but it's actually a w+ - if (latestPosition < this.currentCursorPosition) { - this.currentCursorPosition = latestPosition; - } else if (latestPosition > this.currentCursorPosition) { - this.queue.push({start: this.currentCursorPosition, end: latestPosition}); - this.currentCursorPosition = latestPosition; - // Only emit if the queue was empty and now is not. - if (this.queue.length == 1) { - this.dispatcher.emit('next'); - } - } - } - - private watch_(cursor: number, readPrevious: boolean) { - this.currentCursorPosition = cursor; - if (readPrevious) { - this.fileUpdated_(); - } - - this.watcher = fs.watch(this.filename, {}, (eventType, filename) => { - this.watchEvent_(eventType, filename); - }); - } - - private watchEvent_(eventType: string, _filename: string) { - try { - if (eventType === 'change') { - this.fileUpdated_(); - } - } catch (err) {} - } -}