diff --git a/src/plugins/network/RequestDetails.js b/src/plugins/network/RequestDetails.js index 366049470..3544933ca 100644 --- a/src/plugins/network/RequestDetails.js +++ b/src/plugins/network/RequestDetails.js @@ -5,7 +5,7 @@ * @format */ -import type {Request, Response, Header} from './types.js'; +import type {Request, Response, Header, Insights} from './types.js'; import { Component, @@ -19,6 +19,7 @@ import { colors, } from 'flipper'; import {decodeBody, getHeaderValue} from './utils.js'; +import {formatBytes} from './index.js'; import querystring from 'querystring'; // $FlowFixMe @@ -198,6 +199,11 @@ export default class RequestDetails extends Component< options={RequestDetails.BodyOptions} /> + {response && response.insights ? ( + + + + ) : null} ); } @@ -715,3 +721,60 @@ const BodyFormatters: Array = [ ]; const TextBodyFormatters: Array = [new JSONTextFormatter()]; + +class InsightsInspector extends Component<{insights: Insights}> { + formatTime(value: number): string { + return `${value} ms`; + } + + formatSpeed(value: number): string { + return `${formatBytes(value)}/sec`; + } + + buildRow(name: string, value: ?T, formatter: T => string): any { + return value + ? { + columns: { + key: { + value: {name}, + }, + value: { + value: {formatter(value)}, + }, + }, + copyText: `${name}: ${formatter(value)}`, + key: name, + } + : null; + } + + render() { + const insights = this.props.insights; + const {buildRow, formatTime, formatSpeed} = this; + + const rows = [ + buildRow('DNS lookup time', insights.dnsLookupTime, formatTime), + buildRow('Connect time', insights.connectTime, formatTime), + buildRow('SSL handshake time', insights.sslHandshakeTime, formatTime), + buildRow('Pretransfer time', insights.preTransferTime, formatTime), + buildRow('Redirect time', insights.redirectsTime, formatTime), + buildRow('First byte wait time', insights.timeToFirstByte, formatTime), + buildRow('Data transfer time', insights.transferTime, formatTime), + buildRow('Post processing time', insights.postProcessingTime, formatTime), + buildRow('Bytes transfered', insights.bytesTransfered, formatBytes), + buildRow('Transfer speed', insights.transferSpeed, formatSpeed), + ].filter(r => r != null); + + return rows.length > 0 ? ( + + ) : null; + } +} diff --git a/src/plugins/network/types.js b/src/plugins/network/types.js index e764ad322..e3c254e0f 100644 --- a/src/plugins/network/types.js +++ b/src/plugins/network/types.js @@ -23,9 +23,24 @@ export type Response = {| reason: string, headers: Array
, data: ?string, + insights: ?Insights, |}; export type Header = {| key: string, value: string, |}; + +export type Insights = {| + dnsLookupTime: ?number, + connectTime: ?number, + sslHandshakeTime: ?number, + preTransferTime: ?number, + redirectsTime: ?number, + timeToFirstByte: ?number, + transferTime: ?number, + postProcessingTime: ?number, + // Amount of transferred data can be different from total size of payload. + bytesTransfered: ?number, + transferSpeed: ?number, +|};