You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1 line
28 KiB
Plaintext
1 line
28 KiB
Plaintext
{"version":3,"sources":["components/BreakPoint.js","flow.js","utils.js","message.js","App.js","reportWebVitals.js","index.js"],"names":["BreakPoint","props","state","show","rule","method","url","action","handleClose","bind","handleShow","handleSave","this","setState","rules","push","parseInt","onSave","Button","size","onClick","Modal","onHide","Header","closeButton","Title","Body","Form","Group","as","Row","Label","column","sm","Col","Control","value","onChange","e","target","Footer","variant","React","Component","FlowManager","items","_map","Map","filterText","filterTimer","num","max","filter","item","request","includes","no","set","id","length","oldest","shift","delete","get","text","callback","clearTimeout","setTimeout","isTextResponse","response","header","test","join","getSize","len","body","byteLength","isNaN","toFixed","messageEnum","allMessageBytes","Object","keys","map","k","messageByteMap","reduce","m","sendMessageEnum","App","flowMgr","flows","showList","flow","flowTab","ws","initWs","close","host","URL","document","WebSocket","binaryType","onopen","console","log","onclose","onmessage","evt","msg","data","meta","Int8Array","slice","type","TextDecoder","decode","waitIntercept","resp","content","JSON","parse","err","parseMessage","add","error","onerror","className","messageType","Error","headerBytes","TextEncoder","encode","stringify","ArrayBuffer","view","Uint8Array","view2","DataView","setUint32","buildMessageEdit","send","style","padding","statusCode","key","clear","placeholder","changeFilterLazy","rulesBytes","buildMessageMeta","Table","striped","bordered","f","u","path","pathname","search","classNames","renderFlow","reportWebVitals","onPerfEntry","Function","then","getCLS","getFID","getFCP","getLCP","getTTFB","ReactDOM","render","StrictMode","getElementById"],"mappings":"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","file":"static/js/main.c16ab123.chunk.js","sourcesContent":["import React from 'react'\nimport Button from 'react-bootstrap/Button'\nimport Modal from 'react-bootstrap/Modal'\nimport Form from 'react-bootstrap/Form'\nimport Row from 'react-bootstrap/Row'\nimport Col from 'react-bootstrap/Col'\n\nclass BreakPoint extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n show: false,\n\n rule: {\n method: 'ALL',\n url: '',\n action: '1',\n }\n }\n\n this.handleClose = this.handleClose.bind(this)\n this.handleShow = this.handleShow.bind(this)\n this.handleSave = this.handleSave.bind(this)\n }\n\n handleClose() {\n this.setState({ show: false })\n }\n\n handleShow() {\n this.setState({ show: true })\n }\n\n handleSave() {\n const { rule } = this.state\n const rules = []\n if (rule.url) {\n rules.push({\n method: rule.method === 'ALL' ? '' : rule.method,\n url: rule.url,\n action: parseInt(rule.action)\n })\n }\n\n this.props.onSave(rules)\n this.handleClose()\n }\n\n render() {\n const { rule } = this.state\n\n return (\n <div>\n <Button size=\"sm\" onClick={this.handleShow}>BreakPoint</Button>\n\n <Modal show={this.state.show} onHide={this.handleClose}>\n <Modal.Header closeButton>\n <Modal.Title>Set BreakPoint</Modal.Title>\n </Modal.Header>\n\n <Modal.Body>\n <Form>\n <Form.Group as={Row}>\n <Form.Label column sm={2}>Method</Form.Label>\n <Col sm={10}>\n <Form.Control as=\"select\" value={rule.method} onChange={e => { this.setState({ rule: { ...rule, method: e.target.value } }) }}>\n <option>ALL</option>\n <option>GET</option>\n <option>POST</option>\n <option>PUT</option>\n <option>DELETE</option>\n </Form.Control>\n </Col>\n </Form.Group>\n\n <Form.Group as={Row}>\n <Form.Label column sm={2}>URL</Form.Label>\n <Col sm={10}><Form.Control value={rule.url} onChange={e => { this.setState({ rule: { ...rule, url: e.target.value } }) }} /></Col>\n </Form.Group>\n\n <Form.Group as={Row}>\n <Form.Label column sm={2}>Action</Form.Label>\n <Col sm={10}>\n <Form.Control as=\"select\" value={rule.action} onChange={e => { this.setState({ rule: { ...rule, action: e.target.value } }) }}>\n <option value=\"1\">Request</option>\n <option value=\"2\">Response</option>\n <option value=\"3\">Both</option>\n </Form.Control>\n </Col>\n </Form.Group>\n </Form>\n </Modal.Body>\n\n <Modal.Footer>\n <Button variant=\"secondary\" onClick={this.handleClose}>\n Close\n </Button>\n <Button variant=\"primary\" onClick={this.handleSave}>\n Save Changes\n </Button>\n </Modal.Footer>\n </Modal>\n </div>\n )\n }\n}\n\nexport default BreakPoint\n","export class FlowManager {\n constructor() {\n this.items = []\n this._map = new Map()\n this.filterText = ''\n this.filterTimer = null\n this.num = 0\n\n this.max = 1000\n }\n\n showList() {\n if (!this.filterText) return this.items\n return this.items.filter(item => {\n return item.request.url.includes(this.filterText)\n })\n }\n\n add(item) {\n item.no = ++this.num\n this.items.push(item)\n this._map.set(item.id, item)\n \n if (this.items.length > this.max) {\n const oldest = this.items.shift()\n this._map.delete(oldest.id)\n }\n }\n\n get(id) {\n return this._map.get(id)\n }\n\n changeFilter(text) {\n this.filterText = text\n }\n\n changeFilterLazy(text, callback) {\n if (this.filterTimer) {\n clearTimeout(this.filterTimer)\n this.filterTimer = null\n }\n\n this.filterTimer = setTimeout(() => {\n this.filterText = text\n callback()\n }, 300)\n }\n\n clear() {\n this.items = []\n this._map = new Map()\n }\n}\n","export const isTextResponse = response => {\n if (!response) return false\n if (!response.header) return false\n if (!response.header['Content-Type']) return false\n\n return /text|javascript|json/.test(response.header['Content-Type'].join(''))\n}\n\nexport const getSize = response => {\n if (!response) return '0'\n if (!response.header) return '0'\n\n let len\n if (response.header['Content-Length']) {\n len = parseInt(response.header['Content-Length'][0])\n } else if (response && response.body) {\n len = response.body.byteLength\n }\n if (!len) return '0'\n if (isNaN(len)) return '0'\n if (len <= 0) return '0'\n \n if (len < 1024) return `${len} B`\n if (len < 1024*1024) return `${(len/1024).toFixed(2)} KB`\n return `${(len/(1024*1024)).toFixed(2)} MB`\n}\n","const messageEnum = {\n 'request': 1,\n 'requestBody': 2,\n 'response': 3,\n 'responseBody': 4,\n}\n\nconst allMessageBytes = Object.keys(messageEnum).map(k => messageEnum[k])\n\nconst messageByteMap = Object.keys(messageEnum).reduce((m, k) => {\n m[messageEnum[k]] = k\n return m\n}, {})\n\n\n// type: 1/2/3/4\n// messageFlow\n// version 1 byte + type 1 byte + id 36 byte + waitIntercept 1 byte + content left bytes\nexport const parseMessage = data => {\n if (data.byteLength < 39) return null\n const meta = new Int8Array(data.slice(0, 39))\n const version = meta[0]\n if (version !== 1) return null\n const type = meta[1]\n if (!allMessageBytes.includes(type)) return null\n const id = new TextDecoder().decode(data.slice(2, 38))\n const waitIntercept = meta[38] === 1\n\n const resp = {\n type: messageByteMap[type],\n id,\n waitIntercept,\n }\n if (data.byteLength === 39) return resp\n if (type === messageEnum['requestBody'] || type === messageEnum['responseBody']) {\n resp.content = data.slice(39)\n return resp\n }\n\n let content = new TextDecoder().decode(data.slice(39))\n try {\n content = JSON.parse(content)\n } catch (err) {\n return null\n }\n\n resp.content = content\n return resp\n}\n\n\nexport const sendMessageEnum = {\n 'changeRequest': 11,\n 'changeResponse': 12,\n 'changeBreakPointRules': 21,\n}\n\n// type: 11/12\n// messageEdit\n// version 1 byte + type 1 byte + id 36 byte + header len 4 byte + header content bytes + body len 4 byte + [body content bytes]\nexport const buildMessageEdit = (messageType, flow) => {\n let header, body\n \n if (messageType === sendMessageEnum.changeRequest) {\n ({ body, ...header } = flow.request)\n } else if (messageType === sendMessageEnum.changeResponse) {\n ({ body, ...header } = flow.response)\n } else {\n throw new Error('invalid message type')\n }\n \n const headerBytes = new TextEncoder().encode(JSON.stringify(header))\n const len = 2 + 36 + 4 + headerBytes.byteLength + 4 + body.byteLength\n const data = new ArrayBuffer(len)\n const view = new Uint8Array(data)\n view[0] = 1\n view[1] = messageType\n view.set(new TextEncoder().encode(flow.id), 3)\n view.set(headerBytes, 2 + 36 + 4)\n view.set(body, 2 + 36 + 4 + headerBytes.byteLength + 4)\n\n const view2 = new DataView(data)\n view2.setUint32(2 + 36, headerBytes.byteLength)\n view2.setUint32(2 + 36 + 4 + headerBytes.byteLength, body.byteLength)\n\n return view\n}\n\n\n// type: 21\n// messageMeta\n// version 1 byte + type 1 byte + content left bytes\nexport const buildMessageMeta = (messageType, rules) => {\n if (messageType !== sendMessageEnum.changeBreakPointRules) {\n throw new Error('invalid message type')\n }\n\n const rulesBytes = new TextEncoder().encode(JSON.stringify(rules))\n const view = new Uint8Array(2 + rulesBytes.byteLength)\n view[0] = 1\n view[1] = messageType\n view.set(rulesBytes, 2)\n\n return view\n}\n","import React from 'react'\nimport Table from 'react-bootstrap/Table'\nimport Form from 'react-bootstrap/Form'\nimport Button from 'react-bootstrap/Button'\nimport './App.css'\n\nimport BreakPoint from './components/BreakPoint'\n\nimport { FlowManager } from './flow'\nimport { isTextResponse, getSize } from './utils'\nimport { parseMessage, sendMessageEnum, buildMessageEdit, buildMessageMeta } from './message'\n\nclass App extends React.Component {\n\n constructor(props) {\n super(props)\n\n this.flowMgr = new FlowManager()\n\n this.state = {\n flows: this.flowMgr.showList(),\n flow: null,\n\n flowTab: 'Headers', // Headers, Preview, Response\n }\n\n this.ws = null\n }\n\n componentDidMount() {\n this.initWs()\n }\n\n componentWillUnmount() {\n if (this.ws) {\n this.ws.close()\n }\n }\n\n initWs() {\n if (this.ws) return\n\n let host\n if (process.env.NODE_ENV === 'development') {\n host = 'localhost:9081'\n } else {\n host = new URL(document.URL).host\n }\n this.ws = new WebSocket(`ws://${host}/echo`)\n this.ws.binaryType = 'arraybuffer'\n this.ws.onopen = () => { console.log('OPEN') }\n this.ws.onclose = () => { console.log('CLOSE') }\n this.ws.onmessage = evt => {\n const msg = parseMessage(evt.data)\n if (!msg) {\n console.error('parse error:', evt.data)\n return\n }\n // console.log('msg:', msg)\n\n if (msg.type === 'request') {\n const flow = { id: msg.id, request: msg.content, waitIntercept: msg.waitIntercept }\n this.flowMgr.add(flow)\n this.setState({ flows: this.flowMgr.showList() })\n }\n else if (msg.type === 'requestBody') {\n const flow = this.flowMgr.get(msg.id)\n if (!flow) return\n flow.request.body = msg.content\n this.setState({ flows: this.state.flows })\n }\n else if (msg.type === 'response') {\n const flow = this.flowMgr.get(msg.id)\n if (!flow) return\n flow.waitIntercept = msg.waitIntercept\n flow.response = msg.content\n this.setState({ flows: this.state.flows })\n }\n else if (msg.type === 'responseBody') {\n const flow = this.flowMgr.get(msg.id)\n if (!flow || !flow.response) return\n flow.waitIntercept = msg.waitIntercept\n flow.response.body = msg.content\n this.setState({ flows: this.state.flows })\n }\n }\n this.ws.onerror = evt => {\n console.log('ERROR:', evt)\n }\n }\n\n renderFlow() {\n const { flow, flowTab } = this.state\n if (!flow) return null\n\n const request = flow.request\n const response = flow.response || {}\n\n return (\n <div className=\"flow-detail\">\n <div className=\"header-tabs\">\n <span onClick={() => { this.setState({ flow: null }) }}>x</span>\n <span className={flowTab === 'Headers' ? 'selected' : null} onClick={() => { this.setState({ flowTab: 'Headers' }) }}>Headers</span>\n <span className={flowTab === 'Preview' ? 'selected' : null} onClick={() => { this.setState({ flowTab: 'Preview' }) }}>Preview</span>\n <span className={flowTab === 'Response' ? 'selected' : null} onClick={() => { this.setState({ flowTab: 'Response' }) }}>Response</span>\n {\n !flow.waitIntercept ? null :\n <div className=\"flow-wait-area\">\n <Button size=\"sm\" onClick={() => {\n const msg = buildMessageEdit(sendMessageEnum.changeRequest, flow)\n this.ws.send(msg)\n flow.waitIntercept = false\n this.setState({ flows: this.state.flows })\n }}>Continue</Button>\n <Button size=\"sm\">Drop</Button>\n </div>\n }\n </div>\n\n <div style={{ padding: '20px' }}>\n {\n !(flowTab === 'Headers') ? null :\n <div>\n <div className=\"header-block\">\n <p>General</p>\n <div className=\"header-block-content\">\n <p>Request URL: {request.url}</p>\n <p>Request Method: {request.method}</p>\n <p>Status Code: {`${response.statusCode || '(pending)'}`}</p>\n </div>\n </div>\n\n {\n !(response.header) ? null :\n <div className=\"header-block\">\n <p>Response Headers</p>\n <div className=\"header-block-content\">\n {\n Object.keys(response.header).map(key => {\n return (\n <p key={key}>{key}: {response.header[key].join(' ')}</p>\n )\n })\n }\n </div>\n </div>\n }\n\n <div className=\"header-block\">\n <p>Request Headers</p>\n <div className=\"header-block-content\">\n {\n !(request.header) ? null :\n Object.keys(request.header).map(key => {\n return (\n <p key={key}>{key}: {request.header[key].join(' ')}</p>\n )\n })\n }\n </div>\n </div>\n\n {\n !(request.body && request.body.byteLength) ? null :\n <div className=\"header-block\">\n <p>Request Body</p>\n <div className=\"header-block-content\">\n <p>\n {\n !(isTextResponse(request)) ? \"Not text\" :\n new TextDecoder().decode(request.body)\n }\n </p>\n </div>\n </div>\n }\n\n </div>\n }\n\n {\n !(flowTab === 'Response') ? null :\n !(response.body && response.body.byteLength) ? <div>No response</div> :\n !(isTextResponse(response)) ? <div>Not text response</div> :\n <div>\n {new TextDecoder().decode(response.body)}\n </div>\n }\n </div>\n\n </div>\n )\n }\n \n render() {\n const { flows } = this.state\n return (\n <div className=\"main-table-wrap\">\n <div className=\"top-control\">\n <div><Button size=\"sm\" onClick={() => {\n this.flowMgr.clear()\n this.setState({ flows: this.flowMgr.showList(), flow: null })\n }}>Clear</Button></div>\n <div>\n <Form.Control\n size=\"sm\" placeholder=\"Filter\"\n onChange={(e) => {\n const value = e.target.value\n this.flowMgr.changeFilterLazy(value, () => {\n this.setState({ flows: this.flowMgr.showList() })\n })\n }}\n >\n </Form.Control>\n </div>\n\n <BreakPoint onSave={rules => {\n const msg = buildMessageMeta(sendMessageEnum.changeBreakPointRules, rules)\n this.ws.send(msg)\n }} />\n </div>\n\n <Table striped bordered size=\"sm\">\n <thead>\n <tr>\n <th>No</th>\n <th>Host</th>\n <th>Path</th>\n <th>Method</th>\n <th>Status</th>\n <th>Size</th>\n </tr>\n </thead>\n <tbody>\n {\n flows.map(f => {\n const url = f.request.url\n const u = new URL(url)\n let host = u.host\n if (host.length > 35) host = host.slice(0, 35) + '...'\n let path = u.pathname + u.search\n if (path.length > 65) path = path.slice(0, 65) + '...'\n\n const request = f.request\n const response = f.response || {}\n\n const classNames = []\n if (this.state.flow && this.state.flow.id === f.id) classNames.push('tr-selected')\n if (f.waitIntercept) classNames.push('tr-wait-intercept')\n\n return (\n <tr className={classNames.length ? classNames.join(' ') : null} key={f.id}\n onClick={() => {\n this.setState({ flow: f })\n }}\n >\n <td>{f.no}</td>\n <td>{host}</td>\n <td>{path}</td>\n <td>{request.method}</td>\n <td>{response.statusCode || '(pending)'}</td>\n <td>{getSize(response)}</td>\n </tr>\n )\n })\n }\n </tbody>\n </Table>\n\n {this.renderFlow()}\n </div>\n )\n }\n}\n\nexport default App\n","const reportWebVitals = onPerfEntry => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n getCLS(onPerfEntry)\n getFID(onPerfEntry)\n getFCP(onPerfEntry)\n getLCP(onPerfEntry)\n getTTFB(onPerfEntry)\n })\n }\n}\n\nexport default reportWebVitals\n","import React from 'react'\nimport ReactDOM from 'react-dom'\nimport 'bootstrap/dist/css/bootstrap.min.css'\nimport App from './App'\nimport reportWebVitals from './reportWebVitals'\n\nReactDOM.render(\n <React.StrictMode>\n <App />\n </React.StrictMode>,\n document.getElementById('root')\n)\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals()\n"],"sourceRoot":""} |