import React from 'react' import Table from 'react-bootstrap/Table' import { Base64 } from 'js-base64' import './App.css' const isTextResponse = response => { if (!response) return false if (!response.header) return false if (!response.header['Content-Type']) return false return /text|javascript|json/.test(response.header['Content-Type'].join('')) } class App extends React.Component { constructor(props) { super(props) this.state = { flows: [], flow: null, flowTab: 'Headers', // Headers, Preview, Response } this.ws = null } componentDidMount() { this.initWs() } componentWillUnmount() { if (this.ws) { this.ws.close() } } initWs() { if (this.ws) return this.ws = new WebSocket("ws://localhost:9081/echo") this.ws.onopen = () => { console.log('OPEN') } this.ws.onclose = () => { console.log('CLOSE') } this.ws.onmessage = evt => { const data = JSON.parse(evt.data) console.log(data) const flow = data.flow const id = flow.id if (data.on === 'request') { this.setState({ flows: this.state.flows.concat(flow) }) } else if (data.on === 'response') { const flows = this.state.flows.map(f => { if (f.id === id) return flow return f }) this.setState({ flows }) } } this.ws.onerror = evt => { console.log('ERROR: ' + evt.data) } // this.ws.send('msg') // this.ws.close() } renderFlow() { const { flow, flowTab } = this.state if (!flow) return null const request = flow.request const response = flow.response || {} return (
{ this.setState({ flow: null }) }}>x { this.setState({ flowTab: 'Headers' }) }}>Headers { this.setState({ flowTab: 'Preview' }) }}>Preview { this.setState({ flowTab: 'Response' }) }}>Response
{ !(flowTab === 'Headers') ? null :

General

Request URL: {request.url}

Request Method: {request.method}

Status Code: {`${response.statusCode || '(pending)'}`}

Response Headers

{ !(response.header) ? null : Object.keys(response.header).map(key => { return (

{key}: {response.header[key].join(' ')}

) }) }

Request Headers

{ !(request.header) ? null : Object.keys(request.header).map(key => { return (

{key}: {request.header[key].join(' ')}

) }) }
} { !(flowTab === 'Response') ? null : !(response.body && response.body.length) ?
No response
: !(isTextResponse(response)) ?
Not text response
:
{Base64.decode(response.body)}
}
) } render() { const { flows } = this.state return (
{ flows.map(f => { const url = f.request.url const u = new URL(url) let path = u.pathname + u.search if (path.length > 60) path = path.slice(0, 60) + '...' const request = f.request const response = f.response || {} return ( { this.setState({ flow: f }) }}> ) }) }
Host Path Method Status
{u.host} {path} {request.method} {response.statusCode || '(pending)'}
{this.renderFlow()}
) } } export default App