diff --git a/src/plugins/network/RequestDetails.js b/src/plugins/network/RequestDetails.js index bb6caa46f..78bdaa6b1 100644 --- a/src/plugins/network/RequestDetails.js +++ b/src/plugins/network/RequestDetails.js @@ -643,6 +643,30 @@ class GraphQLBatchFormatter { } class GraphQLFormatter { + parsedServerTimeForFirstFlush = (data: any) => { + const firstResponse = + Array.isArray(data) && data.length > 0 ? data[0] : data; + if (!firstResponse) { + return null; + } + + const extensions = firstResponse['extensions']; + if (!extensions) { + return null; + } + const serverMetadata = extensions['server_metadata']; + if (!serverMetadata) { + return null; + } + const requestStartMs = serverMetadata['request_start_time_ms']; + const timeAtFlushMs = serverMetadata['time_at_flush_ms']; + return ( + + {'Server wall time for initial response (ms): ' + + (timeAtFlushMs - requestStartMs)} + + ); + }; formatRequest = (request: Request) => { if (request.url.indexOf('graphql') > 0) { const data = querystring.parse(decodeBody(request)); @@ -674,21 +698,30 @@ class GraphQLFormatter { try { const data = JSON.parse(body); return ( - +
+ {this.parsedServerTimeForFirstFlush(data)} + +
); } catch (SyntaxError) { // Multiple top level JSON roots, map them one by one - const roots = body.replace(/}{/g, '}\r\n{').split('\n'); + const parsedResponses = body + .replace(/}{/g, '}\r\n{') + .split('\n') + .map(json => JSON.parse(json)); return ( - JSON.parse(json))} - /> +
+ {this.parsedServerTimeForFirstFlush(parsedResponses)} + +
); } }