format import { DeviceLogLevel , MetroReportableEvent } from 'flipper-common' ; import util from 'util' ; import { FlipperServerImpl } from '../../FlipperServerImpl' ; import { ServerDevice } from '../ServerDevice' ; import WebSocket from 'ws' ; const metroLogLevelMapping = { trace : 'verbose' , info : 'info' , warn : 'warn' , error : 'error' , log : 'info' , group : 'info' , groupCollapsed : 'info' , groupEnd : 'info' , debug : 'debug' , } ; function getLoglevelFromMessageType ( type ) { switch ( type ) { case 'bundle_build_done' : case 'bundle_build_started' : case 'initialize_done' : return 'debug' ; case 'bundle_build_failed' : case 'bundling_error' : case 'global_cache_error' : case 'hmr_client_error' : return 'error' ; case 'bundle_transform_progressed' : return null ; case 'client_log' : return null ; case 'dep_graph_loaded' : case 'dep_graph_loading' : case 'global_cache_disabled' : default : return 'verbose' ; } } export default class MetroDevice extends ServerDevice { ws ? : WebSocket ; constructor ( flipperServer , serial , ws ) { super ( flipperServer , { serial , deviceType : 'emulator' , title : 'React Native' , os : 'Metro' , icon : 'mobile' , } ) ; if ( ws ) { this . ws = ws ; ws . onmessage = this . _handleWSMessage ; } } private _handleWSMessage = ( { data } ) => { const message = JSON . parse ( data ) ; if ( message . type === 'client_log' ) { const type = metroLogLevelMapping [ message . level ] || 'unknown' ; this . addLogEntry ( { date : new Date ( ) , pid : 0 , tid : 0 , type , tag : message . type , message : util . format ( ... message . data . map ( ( v ) => v && typeof v === 'object' ? JSON . stringify ( v , null , 2 ) : v ) ) , } ) ; } else { const level = getLoglevelFromMessageType ( message . type ) ; if ( level !== null ) { this . addLogEntry ( { date : new Date ( ) , pid : 0 , tid : 0 , type : level , tag : message . type , message : JSON . stringify ( message , null , 2 ) , } ) ; } } } ; sendCommand ( command , params ? ) { if ( this . ws ) { this . ws . send ( JSON . stringify ( { version : 2 , type : 'command' , command , params , } ) ) ; } else { console . warn ( 'Cannot send command, no connection' , command ) ; } } }