davechri 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of davechri might be problematic. Click here for more details.

Files changed (113) hide show
  1. package/README.md +277 -0
  2. package/bin/proxyall +5 -0
  3. package/build/app.js +89 -0
  4. package/build/app.js.map +1 -0
  5. package/build/common/Message.js +34 -0
  6. package/build/common/Message.js.map +1 -0
  7. package/build/common/ProxyConfig.js +27 -0
  8. package/build/common/ProxyConfig.js.map +1 -0
  9. package/build/node-http-mitm-proxy/.gitattributes +2 -0
  10. package/build/node-http-mitm-proxy/.travis.yml +10 -0
  11. package/build/node-http-mitm-proxy/README.md +539 -0
  12. package/build/node-http-mitm-proxy/bin/mitm-proxy.js +36 -0
  13. package/build/node-http-mitm-proxy/examples/forwardHttps.js +62 -0
  14. package/build/node-http-mitm-proxy/examples/modifyGoogle.js +44 -0
  15. package/build/node-http-mitm-proxy/examples/onCertificateMissing.js +30 -0
  16. package/build/node-http-mitm-proxy/examples/onCertificateRequired.js +23 -0
  17. package/build/node-http-mitm-proxy/examples/preventRequest.js +20 -0
  18. package/build/node-http-mitm-proxy/examples/processFullResponseBody.js +36 -0
  19. package/build/node-http-mitm-proxy/examples/removeProxyToServerContentLength.js +17 -0
  20. package/build/node-http-mitm-proxy/examples/websocket.js +31 -0
  21. package/build/node-http-mitm-proxy/examples/wildcard.js +17 -0
  22. package/build/node-http-mitm-proxy/index.d.ts +233 -0
  23. package/build/node-http-mitm-proxy/index.js +3 -0
  24. package/build/node-http-mitm-proxy/lib/ca.js +245 -0
  25. package/build/node-http-mitm-proxy/lib/middleware/gunzip.js +19 -0
  26. package/build/node-http-mitm-proxy/lib/middleware/wildcard.js +22 -0
  27. package/build/node-http-mitm-proxy/lib/proxy.js +1137 -0
  28. package/build/node-http-mitm-proxy/package-lock.json +1406 -0
  29. package/build/node-http-mitm-proxy/package.json +45 -0
  30. package/build/node-http-mitm-proxy/test/01_proxy.js +449 -0
  31. package/build/node-http-mitm-proxy/test/www/1024.bin +64 -0
  32. package/build/node-http-mitm-proxy/test/wwwA/1024.bin +64 -0
  33. package/build/node-http-mitm-proxy/test/wwwA/example.com.html +8 -0
  34. package/build/node-http-mitm-proxy/test/wwwA/index.html +0 -0
  35. package/build/node-http-mitm-proxy/test/wwwB/1024.bin +64 -0
  36. package/build/node-http-mitm-proxy/test/wwwB/index.html +0 -0
  37. package/build/private/keys/README.md +2 -0
  38. package/build/private/keys/server.crt +20 -0
  39. package/build/private/keys/server.key +28 -0
  40. package/build/private/keys/ssl.conf +25 -0
  41. package/build/server/src/Global.js +38 -0
  42. package/build/server/src/Global.js.map +1 -0
  43. package/build/server/src/Http2Proxy.js +197 -0
  44. package/build/server/src/Http2Proxy.js.map +1 -0
  45. package/build/server/src/HttpMessage.js +99 -0
  46. package/build/server/src/HttpMessage.js.map +1 -0
  47. package/build/server/src/HttpProxy.js +196 -0
  48. package/build/server/src/HttpProxy.js.map +1 -0
  49. package/build/server/src/HttpsProxy.js +110 -0
  50. package/build/server/src/HttpsProxy.js.map +1 -0
  51. package/build/server/src/LogProxy.js +115 -0
  52. package/build/server/src/LogProxy.js.map +1 -0
  53. package/build/server/src/Paths.js +28 -0
  54. package/build/server/src/Paths.js.map +1 -0
  55. package/build/server/src/Ping.js +21 -0
  56. package/build/server/src/Ping.js.map +1 -0
  57. package/build/server/src/ProxyAllApp.js +70 -0
  58. package/build/server/src/ProxyAllApp.js.map +1 -0
  59. package/build/server/src/Resend.js +89 -0
  60. package/build/server/src/Resend.js.map +1 -0
  61. package/build/server/src/SocketIoManager.js +312 -0
  62. package/build/server/src/SocketIoManager.js.map +1 -0
  63. package/build/server/src/SocketMessage.js +68 -0
  64. package/build/server/src/SocketMessage.js.map +1 -0
  65. package/build/server/src/TcpProxy.js +202 -0
  66. package/build/server/src/TcpProxy.js.map +1 -0
  67. package/build/server/src/formatters/HexFormatter.js +33 -0
  68. package/build/server/src/formatters/HexFormatter.js.map +1 -0
  69. package/build/server/src/formatters/MongoFormatter.js +97 -0
  70. package/build/server/src/formatters/MongoFormatter.js.map +1 -0
  71. package/build/server/src/formatters/MongoOpCode.js +51 -0
  72. package/build/server/src/formatters/MongoOpCode.js.map +1 -0
  73. package/build/server/src/formatters/RedisFormatter.js +25 -0
  74. package/build/server/src/formatters/RedisFormatter.js.map +1 -0
  75. package/build/server/src/formatters/SqlCommand.js +111 -0
  76. package/build/server/src/formatters/SqlCommand.js.map +1 -0
  77. package/build/server/src/formatters/SqlFormatter.js +150 -0
  78. package/build/server/src/formatters/SqlFormatter.js.map +1 -0
  79. package/client/README.md +46 -0
  80. package/client/build/asset-manifest.json +26 -0
  81. package/client/build/favicon.ico +0 -0
  82. package/client/build/index.html +1 -0
  83. package/client/build/manifest.json +8 -0
  84. package/client/build/robots.txt +3 -0
  85. package/client/build/static/css/2.bbde182e.chunk.css +12 -0
  86. package/client/build/static/css/2.bbde182e.chunk.css.map +1 -0
  87. package/client/build/static/css/main.5bf489b2.chunk.css +2 -0
  88. package/client/build/static/css/main.5bf489b2.chunk.css.map +1 -0
  89. package/client/build/static/js/2.ba308ba1.chunk.js +3 -0
  90. package/client/build/static/js/2.ba308ba1.chunk.js.LICENSE.txt +100 -0
  91. package/client/build/static/js/2.ba308ba1.chunk.js.map +1 -0
  92. package/client/build/static/js/3.7073b0d8.chunk.js +2 -0
  93. package/client/build/static/js/3.7073b0d8.chunk.js.map +1 -0
  94. package/client/build/static/js/main.494a7501.chunk.js +2 -0
  95. package/client/build/static/js/main.494a7501.chunk.js.map +1 -0
  96. package/client/build/static/js/runtime-main.00264969.js +2 -0
  97. package/client/build/static/js/runtime-main.00264969.js.map +1 -0
  98. package/client/build/static/media/fa-brands-400.2285773e.woff +0 -0
  99. package/client/build/static/media/fa-brands-400.23f19bb0.eot +0 -0
  100. package/client/build/static/media/fa-brands-400.2f517e09.svg +3717 -0
  101. package/client/build/static/media/fa-brands-400.527940b1.ttf +0 -0
  102. package/client/build/static/media/fa-brands-400.d878b0a6.woff2 +0 -0
  103. package/client/build/static/media/fa-regular-400.4689f52c.svg +801 -0
  104. package/client/build/static/media/fa-regular-400.491974d1.ttf +0 -0
  105. package/client/build/static/media/fa-regular-400.77206a6b.eot +0 -0
  106. package/client/build/static/media/fa-regular-400.7a333762.woff2 +0 -0
  107. package/client/build/static/media/fa-regular-400.bb58e57c.woff +0 -0
  108. package/client/build/static/media/fa-solid-900.1551f4f6.woff2 +0 -0
  109. package/client/build/static/media/fa-solid-900.7a8b4f13.svg +5034 -0
  110. package/client/build/static/media/fa-solid-900.9bbb245e.eot +0 -0
  111. package/client/build/static/media/fa-solid-900.be9ee23c.ttf +0 -0
  112. package/client/build/static/media/fa-solid-900.eeccf4f6.woff +0 -0
  113. package/package.json +80 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["components/Request.tsx","components/Response.tsx","common/Message.ts","components/ResendModal.tsx","common/ProxyConfig.ts","store/ProxyConfigStore.ts","ColorPicker.ts","PickIcon.ts","store/SettingsStore.ts","Util.ts","store/MessageStore.ts","store/BreakpointStore.ts","store/SnapshotStore.ts","store/MessageQueueStore.ts","store/MetricsStore.ts","store/NoCaptureStore.ts","store/SocketStore.ts","store/ResendStore.ts","components/SnapshotTabContent.tsx","components/SnapshotTabs.tsx","components/ReachableHostsModal.tsx","components/SettingsTable.tsx","components/SettingsModal.tsx","components/NoCaptureModal.tsx","components/BreakpointModal.tsx","components/MetricsModal.tsx","components/ExportDialog.tsx","components/Header.tsx","App.tsx","reportWebVitals.ts","index.tsx","store/FilterStore.ts"],"names":["formatTimestamp","timestamp","date","Date","hours","getHours","toString","padStart","minutes","getMinutes","seconds","getSeconds","msecs","getMilliseconds","toFixed","replace","Request","observer","isActive","onClick","store","onResend","timeBarPercent","message","getMessage","className","title","elapsedTime","sequenceNumber","style","width","getIconClass","cursor","float","color","getColor","protocol","proxyConfig","method","canResend","isError","isNoResponse","getVisited","getRequestBody","setVisited","isHttpOrHttps","status","endpoint","getRequestLine","hidden","isRequestBodyJson","src","requestBody","name","displayDataTypes","quotesOnKeys","Response","MessageType","LOADING","React","useState","responseBody","setResponseBody","queryParams","url","indexOf","split","forEach","param","keyValue","value","length","unescape","undefined","push","getQueryParams","getResponseBody","then","rb","Fragment","isGrpc","getGrpcStatus","getGrpcMessage","Object","keys","requestHeaders","Accordion","AccordionSummary","expandIcon","AccordionDetails","JSON","stringify","responseHeaders","defaultExpanded","marginTop","display","justifyContent","alignItems","CircularProgress","a","Promise","resolve","response","setTimeout","ResendModal","open","onClose","Modal","rows","cols","onChange","e","setMethodAndUrl","target","getMethodAndUrl","placeholder","isBodyJson","onEdit","props","setBody","updated_src","onAdd","onDelete","getBody","getError","type","doResend","disabled","NO_RESPONSE","Message","REQUEST_AND_RESPONSE","clientIp","serverHost","path","ProxyConfig","isSecure","hostname","port","recording","hostReachable","logProxyProcess","_server","comment","makeAutoObservable","this","config","proxyConfigs","getFromLocalStorage","localStorage","proxyDirectives","parse","directive","filter","updateProxyConfigs","socketStore","emitConfig","headers","document","location","host","fetch","json","data","setProxyConfigs","splice","sortConfigs","c","sort","b","rc","localeCompare","action","colors","count","colorMap","Map","pickIcon","iconClass","userAgent","icon","toLowerCase","includes","window","opr","addons","opera","navigator","InstallTrigger","isIE","documentMode","StyleMedia","isChrome","chrome","browserIcon","HostStatus","Util","str","endsWith","Array","isArray","errors","MessageStore","_isError","visited","tooltip","formatUrl","isErrorResponse","key","tokens","trim","get","set","console","error","colorPicker","getUrl","body","jsonBody","params","Number","grpcMessage","urlStr","fixNewlines","join","isGraphQlError","LOCAL_STORAGE","breakpointStore","breakpointList","_editing","editing","save","breakpointListJson","getItem","map","entry","breakpoint","FilterStore","setEnabled","enabled","setFilter","searchFilter","setRegex","_regex","setMatchCase","_matchCase","setLogical","_logical","getFilter","setItem","isEnabled","isFiltered","index","ACTIVE_SNAPSHOT_NAME","Snapshots","snapshots","names","selectedReqSeqNumbers","scrollTop","fileNameMap","snapshot","fileName","MAX_SAFE_INTEGER","delete","snapshotStore","selectedSnapshotName","getNames","getSelectedReqSeqNumbers","getScrollTop","getFileName","padTime","num","activeSnapshot","slice","deleteSnapshot","element","createElement","messages","getSelectedMessages","messageStore","file","Blob","href","URL","createObjectURL","download","appendChild","click","parsedBlob","messageStores","ms","newSnapshot","LOCAL_STORAGE_LIMIT","messageQueueStore","limit","_getLimit","stopped","autoScroll","DEFAULT_LIMIT","isActiveSnapshotSelected","getActiveSnapshot","pop","copyMessages","l","r","m","sn","Math","floor","findMatchingBreakpoint","prototype","apply","changed","ConfigProtocols","TOOLTIP","settingsStore","targetHost","targetPort","statusUpdating","entries","messageQueueLimit","getLimit","proxyConfigStore","getProxyConfigs","retrieveProxyConfigs","configs","setConfig","isProxyOrLog","isNaN","hostStatus","All","hostPorts","Reachable","hostPort","setLimit","load","mapProtocolToIndex","values","i","MetricsByProtocol","requestCount","responseCount","totalTime","maximumTime","minimumTime","metricsStore","metricsByProtocol","noCaptureStore","clientList","init","client","needle","haystack","search","isMatch","socket","socketConnected","queuedCount","connect","io","on","log","setSocketConnected","callback","countMetrics","filteredMessages","contains","filterStore","deleteFiltered","insertBatch","first","REQUEST","RESPONSE","messageTypeTOString","row","getMetrics","clear","event","emit","forwardProxy","ResendStore","methodAndUrl","startsWith","emitResend","SnapshotTabContent","selectedReqSeqNum","setSelectedReqSeqNum","setScrollTop","openModal","setOpenModal","resendStore","setResendStore","ref","useRef","useEffect","shouldResetScroll","setResetScroll","setScrollTo","getAutoScroll","getMessages","lastMessage","parent","current","childNodes","restoreScrollTop","maxElapsedTime","et","max","activeRequestIndex","matchCount","onScroll","seqNum","isActiveRequest","handleClick","bind","handleResend","Fade","in","curSeqNum","offset","children","clientHeight","SnapshotTabs","TabContext","getSelectedSnapshotName","Tabs","_e","setSelectedSnapshotName","indicatorColor","textColor","getSnapshotNames","Tab","label","getStopped","getSnapshotName","getSnapshotSize","marginLeft","pointerEvents","opacity","stopPropagation","handleDeleteTab","TabPanel","ReachableHostsModal","initTabValue","TAB_VALUES","Unreachable","tabValue","setTabValue","role","borderTop","paddingTop","isStatusUpdating","getEntries","toLocaleLowerCase","SettingsTable","pathLabel","deleteEntry","toggleEntryCapture","Checkbox","checked","isEntrySecure","toggleEntryIsSecure","updateEntryPath","updateEntryHost","updateEntryPort","updateComment","SettingsModal","setProtocol","disableBackdropClick","getProtocols","getTooltip","getProtocol","getPath","setPath","getTargetHost","setTargetHost","getTargetPort","setTargetPort","getComment","setComment","isAddDisabled","addEntry","setMessageQueueLimit","getMessageQueueLimit","isChanged","NoCaptureModal","saveDisabled","setSaveDisabled","close","extend","List","getClientList","clientHost","ListItem","handleDeleteClient","updateEntry","BreakpointModal","getBreakpointList","handleDeleteBreakpoint","toggleEnabled","handleToggleEnable","background","isInvalidFilterSyntax","currentTarget","handleValueChange","matchCase","toggleMatchCase","handleMatchCase","regex","toggleRegex","handleRegex","logical","toggleLogical","handleLogical","MetricsModal","ExportDialog","setFileName","Dialog","DialogTitle","id","Header","showSettingsModal","setShowSettingsModal","showNoCaptureModal","setShowNoCaptureModal","showBreakpointModal","setShowBreakpointModal","showReachableHostsModal","setShowReachableHostsModal","showMetricsModal","setShowMetricsModal","moreMenuIcon","setMoreMenuIcon","settingsMenuIcon","setSettingsMenuIcon","openExportDialog","setOpenExportDialog","useFilePicker","multiple","accept","openFileSelector","filesContent","content","importSnapshot","statusClassName","isConnected","reload","alt","height","clearMetrics","toggleStopped","toggleAutoScroll","getShowErrors","toggleShowErrors","Menu","anchorEl","Boolean","MenuItem","getSnapshotCount","deleteAllSnapshots","toggleDeleteFiltered","getRequestCount","getResponseCount","getQueuedCount","reset","exportSelectedSnapshot","App","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","ReactDOM","render","StrictMode","getElementById","invalidFilterSyntax","boolString","boolOperands","resetScroll","_deleteFiltered","showErrors","updateBoolString","_","debounce","eval","argNum","operand","c1","substr","c2","nonOperand","isMessageFiltered","filtered"],"mappings":"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","file":"static/js/main.494a7501.chunk.js","sourcesContent":["import { observer } from \"mobx-react-lite\";\nimport ReactJson from \"react-json-view\";\nimport MessageStore from '../store/MessageStore';\n\ntype Props = {\n\tisActive: boolean,\n\tonClick: () => void,\n\tonResend: () => void,\n\tstore: MessageStore,\n\ttimeBarPercent: string,\n};\nconst Request = observer(({ isActive, onClick, store, onResend, timeBarPercent }: Props) => {\n\tconst handleClick = () => { onClick(); store.setVisited(true); }\n\tconst message = store.getMessage();\n\n\treturn (\n\t\t<div>\n\t\t\t<div className=\"request__msg-container\">\n\t\t\t\t<div className=\"request__msg-header\">\n\t\t\t\t\t<div className=\"request__msg-time-bar-container\"\n\t\t\t\t\t\ttitle={`${message.elapsedTime} ms, ${formatTimestamp(message.timestamp)}, seqNum=${message.sequenceNumber}`}>\n\t\t\t\t\t\t<div style={{width: `calc(100% - ${timeBarPercent})` }}/>\n\t\t\t\t\t\t<div className={'request__msg-time-bar'}\n\t\t\t\t\t\t\tstyle={{ width: timeBarPercent }} />\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className={`${store.getIconClass()} request__msg-icon`}\n\t\t\t\t\t\tstyle={{ cursor: 'pointer', float: 'left', color: store.getColor() }}\n\t\t\t\t\t>\n\t\t\t\t\t</div>\n\t\t\t\t\t<button className={`request__msg-resend-btn ${isActive && canResend() ? 'active' : ''} btn btn-xs btn-success`}\n\t\t\t\t\t\tonClick={ onResend }\n\t\t\t\t\t>\n\t\t\t\t\t\tResend\n\t\t\t\t\t</button>\n\t\t\t\t\t<div className={`request__msg\n\t\t\t\t\t\t${isActive ? ' active' : ''}\n\t\t\t\t\t\t${store.isError() ? ' error' : ''}\n\t\t\t\t\t\t${store.isNoResponse() ? ' no-response' : ''}\n\t\t\t\t\t\t${store.getVisited() && !store.isError() && !store.isNoResponse()\n\t\t\t\t\t\t\t? ' visited-color' : ''}\n\t\t\t\t\t\t`}\n\t\t\t\t\t\ttitle={store.getRequestBody()}\n\t\t\t\t\t\tonClick={ handleClick }\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className={`fa ${isActive ? 'fa-caret-down' : 'fa-caret-right'} request__msg-caret`} />\n\t\t\t\t\t\t{store.isHttpOrHttps() && !store.isNoResponse() &&\n\t\t\t\t\t\t\tmessage.status + ' '}\n\t\t\t\t\t\t{message.method+' '}\n\t\t\t\t\t\t<b>{message.endpoint+' '}</b>\n\t\t\t\t\t\t{store.getRequestLine()}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"request__body\" hidden={!isActive}>\n\t\t\t\t{!store.isRequestBodyJson()\n\t\t\t\t\t? store.getRequestBody()\n\t\t\t\t\t: <ReactJson\n\t\t\t\t\t\tsrc={message.requestBody as object}\n\t\t\t\t\t\tname={false}\n\t\t\t\t\t\tdisplayDataTypes={false}\n\t\t\t\t\t\tquotesOnKeys={false}\n\t\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t</div>\n\t\t</div>\n\t)\n\n\tfunction canResend() {\n\t\treturn ((message.protocol === 'http:' || message.protocol === 'https:') && message.proxyConfig?.protocol !== 'grpc:')\n\t\t\t&& (message.method === 'GET' || message.method === 'POST' || message.method === 'HEAD');\n\t}\n})\n\nfunction formatTimestamp(timestamp: number) {\n\t// return json.sequenceNumber; // used for testing only\n\tconst date = new Date(timestamp);\n\tconst hours = date.getHours().toString().padStart(2,'0');\n\tconst minutes = date.getMinutes().toString().padStart(2,'0');\n\tconst seconds = date.getSeconds().toString().padStart(2,'0');\n\tconst msecs = (date.getMilliseconds()/1000).toFixed(3).toString().replace('0.', '');\n\treturn `${hours}:${minutes}:${seconds}.${msecs}`;\n}\n\nexport default Request;","import React, { ReactElement } from 'react';\nimport Message from '../common/Message';\nimport { Accordion, AccordionSummary, AccordionDetails, CircularProgress } from '@material-ui/core';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport ReactJson from 'react-json-view';\nimport MessageStore from '../store/MessageStore';\n\ntype Props = {\n\tmessage: Message,\n\tstore: MessageStore,\n};\nconst Response = ({ message, store }: Props) => {\n\tconst LOADING = 'Loading...';\n\tconst [responseBody, setResponseBody] = React.useState<string | ReactElement<any,any>>(LOADING);\n\n\tconst queryParams = getQueryParams(message);\n\tgetResponseBody(message)\n\t\t.then((rb) => setResponseBody(rb));\n\treturn (\n\t\t<div>\n\t\t\t<React.Fragment>\n\t\t\t\t<div className={message.status < 400 ? '' : 'error'}>\n\t\t\t\t\t<b>Status:&nbsp;</b>{message.status}\n\t\t\t\t</div>\n\t\t\t\t{store.isGrpc() && (\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<div className={store.getGrpcStatus() === 0 ? '' : 'error'}>\n\t\t\t\t\t\t\t<b>GRPC Status:&nbsp;</b>{store.getGrpcStatus()}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{store.getGrpcMessage().length > 0 && (\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<b>GRPC Message:&nbsp;</b>{store.getGrpcMessage()}\n\t\t\t\t\t\t</div>)}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t\t<div>\n\t\t\t\t\t<b>Elapsed time:&nbsp;</b>{message.elapsedTime} ms\n\t\t\t\t</div>\n\t\t\t\t{ Object.keys(message.requestHeaders).length > 0 ?\n\t\t\t\t\t< Accordion >\n\t\t\t\t\t\t<AccordionSummary expandIcon={<ExpandMoreIcon />}>\n\t\t\t\t\t\t\t<b>Request Headers:</b>\n\t\t\t\t\t\t</AccordionSummary>\n\t\t\t\t\t\t<AccordionDetails>\n\t\t\t\t\t\t\t<pre>\n\t\t\t\t\t\t\t\t{JSON.stringify(message.requestHeaders, null, 2)}\n\t\t\t\t\t\t\t</pre>\n\t\t\t\t\t\t</AccordionDetails>\n\t\t\t\t\t</Accordion>\n\t\t\t\t\t: null}\n\t\t\t\t{ Object.keys(message.responseHeaders).length > 0 ?\n\t\t\t\t\t<Accordion>\n\t\t\t\t\t\t<AccordionSummary expandIcon={<ExpandMoreIcon />}>\n\t\t\t\t\t\t\t<b>Response Headers:</b>\n\t\t\t\t\t\t</AccordionSummary>\n\t\t\t\t\t\t<AccordionDetails>\n\t\t\t\t\t\t\t<pre>\n\t\t\t\t\t\t\t\t{JSON.stringify(message.responseHeaders, null, 2)}\n\t\t\t\t\t\t\t</pre>\n\t\t\t\t\t\t</AccordionDetails>\n\t\t\t\t\t</Accordion>\n\t\t\t\t\t: null}\n\t\t\t\t{ queryParams ?\n\t\t\t\t\t<Accordion>\n\t\t\t\t\t\t<AccordionSummary expandIcon={<ExpandMoreIcon />}>\n\t\t\t\t\t\t\t<b>Query Parameters:</b>\n\t\t\t\t\t\t</AccordionSummary>\n\t\t\t\t\t\t<AccordionDetails>\n\t\t\t\t\t\t\t<pre>\n\t\t\t\t\t\t\t\t{ JSON.stringify(queryParams, null, 2) }\n\t\t\t\t\t\t\t</pre>\n\t\t\t\t\t\t</AccordionDetails>\n\t\t\t\t\t</Accordion>\n\t\t\t\t: null}\n\n\t\t\t\t<Accordion defaultExpanded={true}>\n\t\t\t\t\t<AccordionSummary expandIcon={<ExpandMoreIcon />}>\n\t\t\t\t\t\t<b>Response Data:</b>\n\t\t\t\t\t</AccordionSummary>\n\t\t\t\t\t<AccordionDetails>\n\t\t\t\t\t\t{typeof responseBody === 'string'\n\t\t\t\t\t\t\t? <pre>{responseBody}</pre>\n\t\t\t\t\t\t\t: responseBody\n\t\t\t\t\t\t}\n\t\t\t\t\t</AccordionDetails>\n\t\t\t\t</Accordion>\n\t\t\t\t{responseBody === LOADING &&\n\t\t\t\t\t<div style={{\n\t\t\t\t\t\twidth: '100%',\n\t\t\t\t\t\tmarginTop: '1rem',\n\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\tjustifyContent: 'center',\n\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t}}>\n\t\t\t\t\t\t<CircularProgress />\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t</React.Fragment>\n\t\t</div>\n\t);\n\n\tasync function getResponseBody(message: Message): Promise<string | ReactElement<any,any>> {\n\t\treturn new Promise((resolve) => {\n\t\t\tlet response: string | ReactElement<any,any>;\n\t\t\tif(typeof message.responseBody === 'object') {\n\t\t\t\tresponse = <ReactJson\n\t\t\t\t\t\t\t\tsrc={message.responseBody}\n\t\t\t\t\t\t\t\tname={false}\n\t\t\t\t\t\t\t\tdisplayDataTypes={false}\n\t\t\t\t\t\t\t\tquotesOnKeys={false}\n\t\t\t\t\t\t\t\t/>;\n\t\t\t} else {\n\t\t\t\tresponse = message.responseBody;\n\t\t\t}\n\t\t\tsetTimeout(() => resolve(response));\n\t\t});\n\t}\n}\n\nfunction getQueryParams(message: Message): string[]|null {\n\t// Format query parameters\n\tlet queryParams: string[] = [];\n\tif(message.url && message.url.indexOf('?') !== -1) {\n\t\t\tvar temp = message.url!.split('?')[1];\n\t\t\ttemp.split('&').forEach(function(param) {\n\t\t\t\t\tvar keyValue = param.split('=');\n\t\t\t\t\tvar value = keyValue.length > 1 ? unescape(keyValue[1]) : undefined;\n\t\t\t\t\tqueryParams.push(keyValue[0]+' = '+value);\n\t\t\t})\n\t}\n\treturn queryParams.length === 0 ? null : queryParams;\n}\n\nexport default Response;","import ProxyConfig from \"./ProxyConfig\";\n\nexport const NO_RESPONSE = 'No Response';\nexport enum MessageType {\n\tREQUEST,\n\tRESPONSE,\n\tREQUEST_AND_RESPONSE,\n}\n\nexport type MessageProtocol =\n | 'http:'\n | 'https:'\n | 'log:'\n | 'mongo:'\n | 'redis:'\n | 'sql:'\n | 'tcp:';\n\nexport default class Message {\n\ttype: MessageType = MessageType.REQUEST_AND_RESPONSE;\n\ttimestamp: number = 0;\n\tsequenceNumber: number = 0;\n\trequestHeaders: {[key: string]: string} = {};\n\tresponseHeaders: {[key: string]: string} = {};\n\tmethod: string | undefined = '';\n\tprotocol: MessageProtocol | '' = '';\n\turl: string|undefined = '';\n\tendpoint: string = '';\n\trequestBody: string|{[key: string]:any} = '';\n\tresponseBody: {[key: string]:any}|string = '';\n\tclientIp: string|undefined = '';\n\tserverHost: string = '';\n\tpath: string = '';\n\telapsedTime: number = 0;\n\tstatus: number = 0;\n\tproxyConfig?: ProxyConfig = undefined;\n};","import { observer } from 'mobx-react-lite';\nimport { Modal } from '@material-ui/core'\nimport ResendStore from '../store/ResendStore';\nimport ReactJson, { InteractionProps } from 'react-json-view';\n\ntype Props = {\n\topen: boolean,\n\tonClose: () => void,\n\tstore: ResendStore,\n};\nconst ResendModal = observer(({ open, onClose, store }: Props) => {\n\tconst message = store.getMessage();\n\treturn (\n\t\t<Modal\n\t\t\tclassName=\"modal-window\"\n\t\t\topen={open}\n\t\t\tonClose={onClose}\n\t\t\taria-labelledby=\"simple-modal-title\"\n \t\taria-describedby=\"simple-modal-description\"\n\t\t>\n\t <div className=\"settings-modal\">\n\t <div>\n\t <h3 className=\"modal-title\">Edit Request and Send</h3>\n\t <div className=\"modal-body\">\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<label>URL:</label>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"resend-modal__url-container\">\n\t\t\t\t\t\t\t<textarea className=\"resend-modal__url form-control\" rows={2} cols={300}\n\t\t\t\t\t\t\t\tonChange={ (e) => store.setMethodAndUrl(e.target.value) }\n\t\t\t\t\t\t\t\tvalue={ store.getMethodAndUrl() }\n\t\t\t\t\t\t\t\tplaceholder=\"<method> <url>\"/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div style={{marginTop: '10px'}}>\n\t\t\t\t\t\t\t<label>Body:&nbsp;</label>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"resend-modal__body-container\">\n\t\t\t\t\t\t\t{typeof message.requestBody === 'object' && store.isBodyJson() ?\n\t\t\t\t\t\t\t\t<ReactJson\n\t\t\t\t\t\t\t\t\tsrc={message.requestBody}\n\t\t\t\t\t\t\t\t\tname={false}\n\t\t\t\t\t\t\t\t\tdisplayDataTypes={false}\n\t\t\t\t\t\t\t\t\tquotesOnKeys={false}\n\t\t\t\t\t\t\t\t\tonEdit={handleEdit}\n\t\t\t\t\t\t\t\t\tonAdd={handleAdd}\n\t\t\t\t\t\t\t\t\tonDelete={handleDelete}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t:\n\t\t\t\t\t\t\t\t<textarea className=\"resend-modal__body form-control\" rows={10} cols={300}\n\t\t\t\t\t\t\t\t\tonChange={ (e) => store.setBody(e.target.value) }\n\t\t\t\t\t\t\t\t\tvalue={ store.getBody() as string }\n\t\t\t\t\t\t\t\t\tplaceholder=\"Enter request body\"/>\n\t\t\t\t\t\t}\n\t \t</div>\n\t </div>\n\t <div className=\"modal-footer\">\n\t\t\t\t\t\t<label className=\"resend-modal__error-message\">{ store.getError() }</label>\n\t\t\t\t\t\t<button type=\"button\" className=\"settings-modal__cancel btn btn-default btn-default\"\n\t\t\t\t\t\t\tonClick={ onClose }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tCancel\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<button type=\"button\" className=\"resend-modal__send btn btn-default btn-success\"\n\t\t\t\t\t\t\tonClick={() => { store.doResend(); onClose() }}\n\t\t\t\t\t\t\tdisabled={ store.getError().length > 0 }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tSend\n\t\t\t\t\t\t</button>\n\t </div>\n\t </div>\n\t </div>\n\t </Modal>\n\t);\n\n\tfunction handleEdit(props: InteractionProps) {\n\t\tstore.setBody(props.updated_src);\n\t\treturn true;\n\t}\n\n\tfunction handleAdd(props: InteractionProps) {\n\t\tstore.setBody(props.updated_src);\n\t\treturn true;\n\t}\n\n\tfunction handleDelete(props: InteractionProps) {\n\t\tstore.setBody(props.updated_src);\n\t\treturn true;\n\t}\n})\n\nexport default ResendModal;","import { makeAutoObservable } from 'mobx';\nimport net from \"net\";\nimport tls from 'tls';\n\nexport type ConfigProtocol =\n 'browser:'\n | 'grpc:'\n | 'http:'\n | 'https:'\n | 'log:'\n | 'mongo:'\n | 'redis:'\n | 'sql:'\n | 'tcp:';\n\nexport default class ProxyConfig {\n\tisSecure: boolean = false;\n\tpath: string = '';\n\tprotocol: ConfigProtocol = 'http:';\n\thostname: string = '';\n\tport: number = 0;\n\trecording: boolean = true;\n\thostReachable: boolean = true;\n\tlogProxyProcess?: any = undefined; // not used by client\n\t_server?: net.Server | tls.Server; // not used by client\n\tcomment = '';\n\n\tconstructor(proxyConfig?: ProxyConfig) {\n\t\tmakeAutoObservable(this);\n\t\tif (proxyConfig) {\n\t\t\tthis.isSecure = proxyConfig.isSecure || proxyConfig.protocol === 'https:';\n\t\t\tthis.path = proxyConfig.path;\n\t\t\tthis.protocol = proxyConfig.protocol;\n\t\t\tthis.hostname = proxyConfig.hostname;\n\t\t\tthis.port = proxyConfig.port;\n\t\t\tthis.recording = proxyConfig.recording;\n\t\t\tthis.hostReachable = proxyConfig.hostReachable;\n\t\t\tthis.comment = proxyConfig.comment;\n\t\t}\n\t}\n\n\tstatic isHttpOrHttps(config: ProxyConfig): boolean {\n\t\tswitch (config.protocol) {\n\t\t\tcase 'http:':\n\t\t\tcase 'https:':\n\t\t\tcase 'browser:':\n\t\t\t\treturn true;\n\t\t\tdefault:\n\t\t\t\treturn false;\n\t\t}\n\t}\n}","import { makeAutoObservable, action } from \"mobx\"\nimport ProxyConfig from '../common/ProxyConfig';\nimport { socketStore } from './SocketStore'\n\nclass ProxyConfigStore {\n\tprivate proxyConfigs: ProxyConfig[] = this.getFromLocalStorage();\n\n\tconstructor() {\n\t\tmakeAutoObservable(this);\n\t}\n\n\t/**\n\t * Local storage is deprecated.\n\t */\n\tprivate getFromLocalStorage(): ProxyConfig[] {\n\t\tlet proxyConfigs: ProxyConfig[] = [];\n\t\tif (localStorage.proxyDirectives) {\n\t\t\ttry {\n\t\t\t\tproxyConfigs = JSON.parse(localStorage.proxyDirectives);\n\t\t\t\tlocalStorage.proxyDirectives = undefined; // stop using local storage\n\t\t\t} catch (e) {\n\t\t\t}\n\t\t}\n\t\treturn proxyConfigs;\n\t}\n\n // @deprecated\n\t@action public merge(proxyConfigs: ProxyConfig[]) {\n\t\tconst proxyDirectives = this.proxyConfigs;\n\t\tfor (let directive of proxyDirectives) {\n\t\t\tif (proxyConfigs.filter(proxyConfig => {\n\t\t\t\treturn directive.protocol === proxyConfig.protocol\n\t\t\t\t\t&& directive.path === proxyConfig.path\n\t\t\t\t\t&&\n\t\t\t\t\t(\n\t\t\t\t\t\tdirective.protocol === 'browser:'\n\t\t\t\t\t\t|| directive.protocol === 'log:'\n\t\t\t\t\t\t|| (directive.hostname === proxyConfig.hostname\n\t\t\t\t\t\t\t&& directive.port === proxyConfig.port)\n\t\t\t\t\t);\n\t\t\t}).length === 0) {\n\t\t\t\tproxyConfigs.push(directive);\n\t\t\t}\n\t\t}\n\n\t\tthis.updateProxyConfigs(proxyConfigs);\n\t}\n\n\t/**\n\t * Load config on server\n\t */\n\tpublic load() {\n\t\tconst proxyDirectives: ProxyConfig[] = this.proxyConfigs;\n\t\tproxyDirectives.forEach(proxyConfig => {\n\t\t\t// backwards compatible with previously supported 'any:'\n\t\t\tif(proxyConfig.protocol as string === 'any:' || proxyConfig.protocol as string === 'other:') {\n\t\t\t\tproxyConfig.protocol = 'tcp:';\n\t\t\t}\n\t\t});\n\t\t// Send configs to server\n\t\tsocketStore.emitConfig('proxy config', proxyDirectives);\n\t}\n\n\tpublic retrieveProxyConfigs(): Promise<ProxyConfig[]> {\n\t\tconst headers: {[key: string]: string} = {};\n\t\theaders['proxyall'] = 'config';\n\t\treturn new Promise((resolve) => {\n\t\t\tconst url = document.location.protocol + '//' + document.location.host\n\t\t\t+ '/api/proxyall/config';\n\t\t\tfetch(url, headers)\n\t\t\t\t.then((response) => response.json())\n\t\t\t\t.then(data => {\n\t\t\t\t\tresolve(data);\n\t\t\t\t\tthis.setProxyConfigs(data);\n\t\t\t\t});\n\t\t})\n\t}\n\n\tpublic getProxyConfigs() {\n\t\treturn this.proxyConfigs;\n\t}\n\n\t@action public setProxyConfigs(proxyConfigs: ProxyConfig[]) {\n\t\tthis.updateProxyConfigs(proxyConfigs);\n\t}\n\n\tprivate updateProxyConfigs(proxyConfigs: ProxyConfig[]) {\n\t\tthis.proxyConfigs.splice(0, this.proxyConfigs.length);\n\t\tthis.sortConfigs(proxyConfigs).forEach(c => {\n\t\t\tthis.proxyConfigs.push(new ProxyConfig(c));\n\t\t});\n\t}\n\n\tprivate sortConfigs(proxyConfigs: ProxyConfig[]): ProxyConfig[] {\n\t\tproxyConfigs.sort((a, b) => {\n\t\t\tlet rc = a.protocol.localeCompare(b.protocol);\n\t\t\tif (rc === 0) {\n\t\t\t\t\trc = a.hostname.localeCompare(b.hostname)\n\t\t\t\t\tif (rc === 0) {\n\t\t\t\t\t\trc = a.path.localeCompare(b.path);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn rc;\n\t\t});\n\t\treturn proxyConfigs;\n\t}\n}\n\nconst proxyConfigs = new ProxyConfigStore();\nexport default proxyConfigs;","import Message from './common/Message';\n\nconst firefoxColor = 'orangered';\nconst colors = ['blue', 'green', 'purple', 'brown', 'darkpink', 'slateblue', 'darkorange'];\nlet count = 0;\nlet colorMap: Map<string, string> = new Map();\n\nexport default function colorPicker(message: Message): string {\n\tconst protocol = message.proxyConfig!.protocol;\n\n\tif (protocol === 'browser:') {\n\t\treturn firefoxColor;\n\t}\n\n\tlet key = '';\n\tswitch (protocol) {\n\t\tcase 'log:':\n\t\t\tconst command = message.proxyConfig!.path.trim();\n\t\t\tconst tokens = command.split(' ');\n\t\t\tkey = tokens[tokens.length-1];\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tif (message.clientIp) {\n\t\t\t\tkey = message.clientIp.trim();\n\t\t\t}\n\t}\n\n\tlet color = colorMap.get(key);\n\tif (color === undefined) {\n\t\tif (key === 'error') {\n\t\t\tcolor = 'red';\n\t\t} else {\n\t\t\tcolor = colors[count % colors.length];\n\t\t\t++count;\n\t\t\tcolorMap.set(key, color);\n\n\t\t\tif (!colors.includes(color)) {\n\t\t\t\tconsole.error(`Color is undefined key=${key} count=${count}, ${colorMap}`);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn color;\n}","import { ConfigProtocol } from \"./common/ProxyConfig\";\n\nexport default function pickIcon(protocol: ConfigProtocol): string {\n\tlet iconClass = '';\n\tswitch (protocol) {\n\t\tcase 'http:':\n\t\tcase 'https:':\n\t\t\ticonClass = 'fa fa-paper-plane';\n\t\t\tbreak;\n\t\tcase 'browser:':\n\t\t\ticonClass = browserIcon();\n\t\t\tbreak;\n\t\tcase 'sql:':\n\t\t\ticonClass = 'fa fa-database';\n\t\t\tbreak;\n\t\tcase 'mongo:':\n\t\t\ticonClass = 'fa fa-leaf';\n\t\t\tbreak;\n\t\tcase 'redis:':\n\t\t\ticonClass = 'fa fa-cube';\n\t\t\tbreak;\n\t\tcase 'grpc:':\n\t\t\ticonClass = 'fa fa-bahai';\n\t\t\tbreak;\n\t\tcase 'log:':\n\t\t\ticonClass = 'fa fa-exclamation-triangle';\n\t\t\tbreak;\n\t\tdefault:\n\t\t\ticonClass = 'fa fa-arrows-alt-h';\n\t}\n\treturn iconClass;\n}\n\ndeclare global {\n\tinterface Window {\n\t\topr: any | undefined;\n\t\topera: any | undefined;\n\t\tchrome: any | undefined;\n\t\tHTMLElement: any | undefined;\n\t\tStyleMedia: any | undefined;\n\t}\n\n\tinterface Document {\n\t\tdocumentMode:string;\n\t}\n}\n\ndeclare const InstallTrigger: any;\n\nfunction browserIcon(userAgent?: string): string {\n\tlet icon = 'fa fa-window-maximize';\n\n\tif (userAgent) {\n\t\tuserAgent = userAgent.toLowerCase();\n\t\tif (userAgent.includes('firefox')) {\n\t\t\treturn 'fab fa-firefox';\n\t\t}\n\t\tif (userAgent.includes('chrome') || userAgent.includes('chromium')) {\n\t\t\treturn 'fab fa-chrome';\n\t\t}\n\t}\n\n\t// Opera 8.0+\n\tconst isOpera = (!!window.opr && !!window.opr.addons) || !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;\n\tif (isOpera) {\n\t\ticon = 'fab fa-opera';\n\t}\n\n\t// Firefox 1.0+\n\tconst isFirefox = typeof InstallTrigger !== 'undefined';\n\tif (isFirefox) {\n\t\ticon = 'fab fa-firefox';\n\t}\n\n\t// Safari 3.0+ \"[object HTMLElementConstructor]\"\n\t// const isSafari = /constructor/i.test(window.HTMLElement) || (function (p) { return p.toString() === \"[object SafariRemoteNotification]\"; })(!window['safari'] || (typeof safari !== 'undefined' && window['safari'].pushNotification));\n\t// if (isSafari) {\n\t// \ticon = 'fa-safari';\n\t// }\n\n\t// Internet Explorer 6-11\n\tconst isIE = /*@cc_on!@*/false || !!document.documentMode;\n\tif (isIE) {\n\t\ticon = 'fab fa-edge-legacy';\n\t}\n\n\t// Edge 20+\n\tconst isEdge = !isIE && !!window.StyleMedia;\n\tif (isEdge) {\n\t\ticon = 'fab fa-edge';\n\t}\n\n\t// Chrome 1 - 79\n\tconst isChrome = !!window.chrome /*&& (!!window.chrome.webstore || !!window.chrome.runtime)*/;\n\tif (isChrome) {\n\t\ticon = 'fab fa-chrome';\n\t}\n\n\t// Edge (based on chromium) detection\n\tconst isEdgeChromium = isChrome && (navigator.userAgent.indexOf(\"Edg\") !== -1);\n\tif (isEdgeChromium) {\n\t\ticon = 'fab fa-edge';\n\t}\n\n\t// Blink engine detection\n\t// const isBlink = (isChrome || isOpera) && !!window.CSS;\n\n\treturn icon;\n}","import { makeAutoObservable, action } from \"mobx\";\nimport ProxyConfig, { ConfigProtocol } from '../common/ProxyConfig';\nimport { messageQueueStore } from './MessageQueueStore';\nimport proxyConfigStore from './ProxyConfigStore';\n\nexport const ConfigProtocols: ConfigProtocol[] = [\n\t'browser:',\n\t'grpc:',\n\t'http:',\n\t'https:',\n\t'log:',\n\t'mongo:',\n\t'redis:',\n\t'sql:',\n\t'tcp:',\n];\n\nconst TOOLTIP: Map<string, string> = new Map([\n\t['browser:', `Forward proxy for HTTP and HTTPS. Listen on port 8888 (default) for HTTP requests, and port 9999 (default) for HTTPS requests. Your browser must be configured to proxy HTTP and HTTPS messages to localhost:8888 and localhost:9999, respectively.`],\n\t['grpc:', 'Proxy and capture Remote Procedure Call messages. Listen on the specified port for gRPC requests, and pass the requests to the target gRPC service.'],\n\t['http:', `Reverse proxy for HTTP messages. Listen on port 8888 (default) for HTTP requests, and pass the requests to the target host having the best matching URL path.\tThe path can be regex a expression.`],\n\t['https:', `Reverse proxy for HTTPS messages. Listen on port 9999 (default) for HTTPS requests, and pass the requests to the target host having the best matching URL path. \tThe path can be a regex expression.`],\n\t['log:', `Monitor dockers log. The \"docker logs -f CONTAINER\" command will pull log messages from a dockers container.`],\n\t['mongo:', `Proxy and capture MongoDB messages. Listen on the specified port for MongoDB requests, and pass the requests to the target MongoDB service.`],\n\t['redis:', `Proxy and capture Redis messages. Listen on the specified port for Redis requests, and pass the requests to the target Redis service.`],\n\t['sql:', `Proxy and capture SQL messages. Listen on the specified port for SQL requests, and pass the requests to the target SQL service. It has only been tested with MariaDB (MySQL).`],\n\t['tcp:', `TCP proxy. Can proxy and capture any TCP request/response protocol.`],\n]);\n\nexport enum HostStatus {\n\tAll = 'All',\n\tReachable = 'Reachable',\n\tUnreachable = 'Unreachable',\n}\n\nexport default class SettingsStore {\n\tprivate changed = false;\n\tprivate protocol: ConfigProtocol | '' = '';\n\tprivate path = '';\n\tprivate targetHost = '';\n\tprivate targetPort = '';\n\tprivate comment = '';\n\n\tprivate statusUpdating = true;\n\tprivate entries: ProxyConfig[] = [];\n\tprivate messageQueueLimit = messageQueueStore.getLimit();\n\tprivate error = '';\n\n\tpublic constructor() {\n\t\tmakeAutoObservable(this);\n\t}\n\n\tpublic isStatusUpdating() {\n\t\treturn this.statusUpdating;\n\t}\n\n\tpublic setConfig() {\n\t\tthis.entries.splice(0, this.entries.length);\n\t\tconst configs = proxyConfigStore.getProxyConfigs();\n\t\tconfigs.forEach((config) => {\n\t\t\tthis.entries.push(config);\n\t\t});\n\n\t\tthis.statusUpdating = true;\n\t\tproxyConfigStore.retrieveProxyConfigs()\n\t\t\t.then((configs) => {\n\t\t\t\tconfigs.forEach(config => {\n\t\t\t\t\tif (config.protocol === 'log:' || config.protocol === 'browser:') return;\n\t\t\t\t\tfor (const entry of this.entries) {\n\t\t\t\t\t\tif (entry.hostname === config.hostname && entry.port === config.port) {\n\t\t\t\t\t\t\tentry.hostReachable = config.hostReachable;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tthis.statusUpdating = false;\n\t\t\t\t})\n\t\t})\n\t}\n\n\t@action public async reset() {\n\t\tthis.changed = false;\n\t\tthis.protocol = 'http:';\n\t\tthis.path = '';\n\t\tthis.targetHost = '';\n\t\tthis.targetPort = '';\n\t\tthis.comment = '';\n\t\tthis.messageQueueLimit = messageQueueStore.getLimit();\n\t\tthis.setConfig();\n\t\tthis.error = '';\n\t}\n\n\tpublic isChanged() {\n\t\treturn this.changed;\n\t}\n\n\tpublic getProtocols(): ConfigProtocol[] {\n\t\treturn ConfigProtocols;\n\t}\n\n\tpublic getTooltip(protocol: ConfigProtocol): string {\n\t\tconst tooltip = TOOLTIP.get(protocol);\n\t\treturn tooltip ? tooltip : 'Tooltip text not found!';\n\t}\n\n\tpublic getProtocol() {\n\t\treturn this.protocol;\n\t}\n\n\t@action public setProtocol(protocol: ConfigProtocol) {\n\t\tthis.protocol = protocol;\n\t\tthis.error = '';\n\t}\n\n\tpublic isProxyOrLog() {\n\t\treturn this.protocol === 'browser:' || this.protocol === 'log:';\n\t}\n\n\tpublic getPath() {\n\t\treturn this.path;\n\t}\n\n\t@action public setPath(path: string) {\n\t\tthis.path = path;\n\t\tthis.error = '';\n\t}\n\n\tpublic getTargetHost() {\n\t\treturn this.targetHost;\n\t}\n\n\t@action public setTargetHost(host: string) {\n\t\tthis.targetHost = host;\n\t\tthis.error = '';\n\t}\n\n\tpublic getTargetPort() {\n\t\treturn this.targetPort;\n\t}\n\n\t@action public setTargetPort(port: string) {\n\t\tthis.targetPort = port;\n\t\tthis.error = '';\n\t}\n\n\tpublic getComment() {\n\t\treturn this.comment;\n\t}\n\n\t@action public setComment(comment: string) {\n\t\tthis.comment = comment;\n\t\tthis.error = '';\n\t}\n\n\tpublic isAddDisabled(): boolean {\n\t\tif (this.isProxyOrLog()) {\n\t\t\treturn this.path.length === 0;\n\t\t} else {\n\t\t\treturn this.path.length === 0 || this.targetHost.length === 0 || this.targetPort.length === 0;\n\t\t}\n\t}\n\n\t@action public addEntry(): void {\n\t\tif (this.protocol === 'http:' || this.protocol === 'https:' || this.protocol === 'browser:') {\n\t\t\t// if (!this.path.startsWith('/')) {\n\t\t\t// \tthis.error = `When protocol \"${this.protocol}\" is selected the path must begin with \"/\"`;\n\t\t\t// }\n\t\t} else if (this.protocol === 'log:') {\n\t\t} else {\n\t\t\tif (isNaN(+this.path)) {\n\t\t\t\tthis.error = `'When protocol \"${this.protocol}\" is selected port number must be specified`;\n\t\t\t}\n\t\t}\n\n\t\tif (this.error.length === 0 && this.protocol !== 'browser:' && this.protocol !== 'log:') {\n\t\t\tif (isNaN(+this.targetPort)) {\n\t\t\t\tthis.error = `Invalid target port number`;\n\t\t\t}\n\t\t}\n\n\t\tif (this.error.length === 0) {\n\t\t\tconst proxyConfig = new ProxyConfig();\n\t\t\tproxyConfig.protocol = this.protocol as ConfigProtocol;\n\t\t\tproxyConfig.path = this.path;\n\t\t\tproxyConfig.hostname = this.targetHost;\n\t\t\tproxyConfig.port = +this.targetPort;\n\t\t\tproxyConfig.comment = this.comment;\n\t\t\tthis.entries.push(proxyConfig);\n\n\t\t\tthis.path = '';\n\t\t\tthis.targetHost = '';\n\t\t\tthis.targetPort = '';\n\t\t\tthis.comment = '';\n\t\t\tthis.changed = true;\n\t\t}\n\t}\n\n\t@action public deleteEntry(index: number) {\n\t\tthis.entries.splice(index, 1);\n\t\tthis.changed = true;\n\t}\n\n\t@action public updateEntryProtocol(index: number, value: ConfigProtocol) {\n\t\tconst entry = { ...this.entries[index] };\n\t\tentry.protocol = value;\n\t\tthis.entries.splice(index, 1, entry);\n\t\tthis.changed = true;\n\t}\n\n\t@action public updateEntryPath(index: number, value: string) {\n\t\tconst entry = { ...this.entries[index] };\n\t\tentry.path = value;\n\t\tthis.entries.splice(index, 1, entry);\n\t\tthis.changed = true;\n\t}\n\n\t@action public updateEntryHost(index: number, value: string) {\n\t\tconst entry = { ...this.entries[index] };\n\t\tentry.hostname = value;\n\t\tthis.entries.splice(index, 1, entry);\n\t\tthis.changed = true;\n\t}\n\n\t@action public updateEntryPort(index: number, value: string) {\n\t\tif (isNaN(+this.targetPort)) {\n\t\t\tthis.error = `Invalid port number: ${this.targetPort}`;\n\t\t} else {\n\t\t\tconst entry = { ...this.entries[index] };\n\t\t\tentry.port = +value;\n\t\t\tthis.entries.splice(index, 1, entry);\n\t\t\tthis.changed = true;\n\t\t}\n\t}\n\n\t@action public updateComment(index: number, value: string) {\n\t\tconst entry = { ...this.entries[index] };\n\t\tentry.comment = value;\n\t\tthis.entries.splice(index, 1, entry);\n\t\tthis.changed = true;\n\t}\n\n\t@action public toggleEntryCapture(index: number) {\n\t\tconst entry = { ...this.entries[index] };\n\t\tentry.recording = !entry.recording;\n\t\tthis.entries.splice(index, 1, entry);\n\t\tthis.changed = true;\n\t}\n\n\tpublic isEntrySecure(index: number) {\n\t\tconst entry = { ...this.entries[index] };\n\t\treturn entry.isSecure;\n\t}\n\n\t@action public toggleEntryIsSecure(index: number) {\n\t\tconst entry = { ...this.entries[index] };\n\t\tentry.isSecure = !entry.isSecure;\n\t\tthis.entries.splice(index, 1, entry);\n\t\tthis.changed = true;\n\t}\n\n\tpublic getEntries(hostStatus: HostStatus = HostStatus.All): ProxyConfig[] {\n\t\tif (hostStatus === HostStatus.All) {\n\t\t\treturn this.entries;\n\t\t} else {\n\t\t\tconst hostPorts: Map<string, boolean> = new Map();\n\t\t\tconst hostReachable = (hostStatus === HostStatus.Reachable);\n\t\t\treturn this.entries\n\t\t\t\t.filter(entry => {\n\t\t\t\t\tif (\n\t\t\t\t\t\tentry.hostReachable !== hostReachable\n\t\t\t\t\t\t|| entry.protocol === 'browser:'\n\t\t\t\t\t\t|| entry.protocol === 'log:'\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst hostPort = entry.hostname + ':' + entry.port;\n\t\t\t\t\tif (hostPorts.get(hostPort)) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\thostPorts.set(hostPort, true);\n\t\t\t\t\treturn true;\n\t\t\t\t});\n\t\t}\n\t}\n\n\tpublic getMessageQueueLimit() {\n\t\treturn this.messageQueueLimit;\n\t}\n\n\t@action setMessageQueueLimit(messageQueueLimit: number) {\n\t\tthis.messageQueueLimit = messageQueueLimit;\n\t\tthis.changed = true;\n\t}\n\n\tpublic getError(): string {\n\t\treturn this.error;\n\t}\n\n\t@action public save() {\n\t\tthis.changed = false;\n\t\tproxyConfigStore.setProxyConfigs(this.entries);\n\t\tmessageQueueStore.setLimit(this.messageQueueLimit);\n\t\tproxyConfigStore.load();\n\t}\n}\n\nexport const settingsStore = new SettingsStore();","import Message from './common/Message';\n\nexport default class Util {\n\n\tstatic fixNewlines(str: string) {\n return str.replace(/\\\\n/g, '\\n') // fix up line breaks\n .replace(/\\\\/g, '')\n .replace(/\"\"/g, '\"'); // remove consecutive quotes\n\t}\n\n static isGraphQlError(message: Message) {\n if ((message.url?.endsWith('/graphql') || message.url?.endsWith('/graphql-public'))\n && Array.isArray(message.responseBody)) {\n for(const entry of message.responseBody) {\n if(entry.errors) {\n return true;\n }\n }\n }\n return false;\n }\n\n}","import { makeAutoObservable, action } from \"mobx\"\nimport colorPicker from '../ColorPicker';\nimport Message, { NO_RESPONSE } from '../common/Message';\nimport pickIcon from '../PickIcon';\nimport Util from '../Util';\n\nexport default class MessageStore {\n private message: Message = new Message();\n private url = '';\n private _isError = false;\n private visited = false;\n private color = '';\n private iconClass = '';\n private tooltip = '';\n\n public constructor(message: Message) {\n this.message = message;\n this.url = this.formatUrl(message.url!);\n this._isError = this.isErrorResponse(message);\n this.visited = false;\n this.color = colorPicker(message);\n if (message.requestHeaders['proxyall'] === 'resend') {\n this.iconClass = 'fa fa-clone';\n this.iconClass += ' resend-icon';\n }\n else {\n this.iconClass = pickIcon(message.proxyConfig!.protocol);\n }\n this.tooltip = message.method ? 'Click to resend request' : '';\n makeAutoObservable(this);\n }\n\n public getMessage(): Message {\n return this.message!;\n }\n\n public getUrl(): string {\n return this.url;\n }\n\n public isNoResponse(): boolean {\n return this.message.responseBody === NO_RESPONSE;\n }\n\n public isError(): boolean {\n return this._isError;\n }\n\n public getColor(): string {\n return this.color;\n }\n\n public getIconClass(): string {\n return this.iconClass;\n }\n\n public getTooltip(): string {\n return this.tooltip;\n }\n\n public getVisited(): boolean {\n return this.visited;\n }\n\n public getRequestLine(): string {\n let str;\n if (this.message.proxyConfig && this.message.proxyConfig.protocol === 'browser:') {\n str = `${this.message.clientIp}->${this.getUrl()}`;\n } else {\n str = `(${this.message.clientIp}->${this.message.serverHost}) ${this.getUrl()}`;\n }\n return str;\n }\n\n @action public setVisited(value: boolean) {\n this.visited = value;\n }\n\n public isRequestBodyJson() {\n return this.message.requestBody\n && typeof this.message.requestBody === 'object'\n && (this.message.protocol === 'http:' || this.message.protocol === 'https:');\n }\n\n public getRequestBody(): string {\n let body = this.message.method && this.message.method.length > 0 ? this.url + '\\n' : '';\n\n if(this.message.requestBody) {\n let jsonBody = (this.message.requestBody as any);\n if(jsonBody['proxyall_inner_body']) {\n body += jsonBody['proxyall_inner_body'];\n }\n else if(\n typeof this.message.requestBody === 'string' &&\n this.message.requestHeaders['content-type'] &&\n this.message.requestHeaders['content-type'].includes('application/x-www-form-urlencoded')) {\n const params = this.message.requestBody.split('&');\n body += JSON.stringify(params, null, 2);\n } else if (typeof this.message.requestBody === 'string') {\n body += this.message.requestBody as string;\n } else {\n body += JSON.stringify(this.message.requestBody, null, 2);\n }\n // body = Util.fixNewlines(body);\n }\n return body;\n }\n\n public isHttpOrHttps() {\n return this.message.protocol === 'http:'\n || this.message.protocol === 'https:';\n }\n\n public isGrpc(): boolean {\n return this.message.proxyConfig?.protocol === 'grpc:';\n }\n\n public getGrpcStatus(): number {\n const status = this.message.responseHeaders['grpc-status'];\n return status ? Number(status) : 0;\n }\n\n public getGrpcMessage(): string {\n const grpcMessage = this.message.responseHeaders['grpc-message'];\n return grpcMessage ? grpcMessage : '';\n }\n\n private formatUrl(urlStr: string): string {\n //var url = urlStr.indexOf('?') !== -1 ? urlStr.split('?')[0] : urlStr;\n let url = unescape(urlStr);\n url = Util.fixNewlines(url);\n return url.split(/\\s+/).join(' ');\n }\n\n private isErrorResponse(message: Message): boolean {\n // Set error class to make text red\n return message.status >= 400\n || (message.proxyConfig?.protocol === 'grpc:'\n && message.responseHeaders['grpc-status']\n && Number(message.responseHeaders['grpc-status']) > 0)\n || (message.protocol === 'sql:' && message.status !== 0)\n || Util.isGraphQlError(message);\n }\n}","import { makeAutoObservable, action } from \"mobx\"\nimport Message from \"../common/Message\";\nimport FilterStore from \"./FilterStore\";\nimport MessageStore from \"./MessageStore\";\n\nconst LOCAL_STORAGE = 'proxyall-breakpoints';\n\nexport default class BreakpointStore {\n\tprivate breakpointList: FilterStore[] = [];\n\tprivate _editing = false;\n\n\tpublic constructor() {\n\t\tmakeAutoObservable(this);\n\t}\n\n\t@action public editing(editing: boolean) {\n\t\tthis._editing = editing;\n\t}\n\n\t@action public changed() {\n\t\tthis.save();\n\t}\n\n\t@action public init() {\n\t\tconst breakpointListJson = localStorage.getItem(LOCAL_STORAGE);\n\t\tif (breakpointListJson) {\n\t\t\tconst breakpointList = JSON.parse(breakpointListJson);\n\t\t\tthis.breakpointList = breakpointList.map((entry: {\n\t\t\t\tenabled: boolean,\n\t\t\t\tsearchFilter: string,\n\t\t\t\t_matchCase: boolean,\n\t\t\t\t_regex: boolean,\n\t\t\t\t_logical: boolean }) => {\n\t\t\t\tconst breakpoint = new FilterStore();\n\t\t\t\tbreakpoint.setEnabled(entry.enabled);\n\t\t\t\tbreakpoint.setFilter(entry.searchFilter);\n\t\t\t\tbreakpoint.setRegex(entry._regex);\n\t\t\t\tbreakpoint.setMatchCase(!!entry._matchCase);\n\t\t\t\tbreakpoint.setLogical(!!entry._logical);\n\t\t\t\treturn breakpoint;\n\t\t\t})\n\t\t} else {\n\t\t\tthis.breakpointList = [];\n\t\t}\n\t}\n\n\t@action private save() {\n\t\tconst breakpointList = this.breakpointList.filter(breakpoint => breakpoint.getFilter().length > 0);\n\t\tlocalStorage.setItem(LOCAL_STORAGE, JSON.stringify(breakpointList));\n\t}\n\n\tpublic findMatchingBreakpoint(message: Message): FilterStore | null {\n\t\tif (this.breakpointList.length === 0 || this._editing) return null;\n\t\tfor(const breakpoint of this.breakpointList) {\n\t\t\tif(breakpoint.isEnabled() && !breakpoint.isFiltered(new MessageStore(message))) {\n\t\t\t\treturn breakpoint;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\tpublic getBreakpointList() {\n\t\treturn this.breakpointList;\n\t}\n\n\t@action public extend() {\n\t\tthis.breakpointList.push(new FilterStore());\n\t}\n\n\t@action public deleteEntry(index: number) {\n\t\tthis.breakpointList.splice(index, 1);\n\t\tthis.save();\n\t}\n }\n\nexport const breakpointStore = new BreakpointStore();\n","import { makeAutoObservable, action } from \"mobx\"\nimport Message from '../common/Message';\nimport MessageStore from './MessageStore';\n\nexport const ACTIVE_SNAPSHOT_NAME = 'Active';\n\nclass Snapshots {\n\tprivate snapshots: Map<string, MessageStore[]> = new Map();\n\tprivate names: string[] = [];\n\tprivate selectedReqSeqNumbers: number[] = [];\n\tprivate scrollTop: number[] = [];\n\tprivate fileNameMap: Map<string, string> = new Map();\n\n\tconstructor() {\n\t\tmakeAutoObservable(this);\n\t}\n\n\tpublic get(key: string): MessageStore[] {\n\t\treturn this.snapshots.get(key)!;\n\t}\n\n\tpublic set(key: string, snapshot: MessageStore[], fileName?: string) {\n\t\tthis.snapshots.set(key, snapshot);\n\t\tthis.names.push(key);\n\t\tthis.selectedReqSeqNumbers.push(Number.MAX_SAFE_INTEGER);\n\t\tthis.scrollTop.push(0);\n\t\tif (fileName) {\n\t\t\tthis.fileNameMap.set(key, fileName);\n\t\t}\n\t}\n\n\tpublic delete(key: string) {\n\t\tthis.snapshots.delete(key);\n\t\tconst index = this.names.indexOf(key);\n\t\tthis.names.splice(index, 1);\n\t\tthis.selectedReqSeqNumbers.splice(index, 1);\n\t\tthis.scrollTop.splice(index, 1);\n\t\tthis.fileNameMap.delete(key);\n\t}\n\n\tpublic count() {\n\t\treturn this.names.length;\n\t}\n\n\tpublic getNames(): string[] {\n\t\treturn this.names;\n\t}\n\n\tpublic getSelectedReqSeqNumbers(): number[] {\n\t\treturn this.selectedReqSeqNumbers;\n\t}\n\n\tpublic getScrollTop(): number[] {\n\t\treturn this.scrollTop;\n\t}\n\n\tpublic getFileName(key: string): string | undefined {\n\t\treturn this.fileNameMap.get(key);\n\t}\n}\n\nexport default class SnapshotStore {\n\tprivate selectedSnapshotName = ACTIVE_SNAPSHOT_NAME;\n\tprivate snapshots: Snapshots = new Snapshots();\n\n\tpublic constructor() {\n\t\tthis.snapshots.set(ACTIVE_SNAPSHOT_NAME, []);\n\t\tmakeAutoObservable(this);\n\t}\n\n\tpublic isActiveSnapshotSelected() {\n\t\treturn this.selectedSnapshotName === ACTIVE_SNAPSHOT_NAME;\n\t}\n\n\tpublic getActiveSnapshot(): MessageStore[] {\n\t\treturn this.snapshots.get(ACTIVE_SNAPSHOT_NAME);\n\t}\n\n\tpublic getSnapshotNames(): string[] {\n\t\treturn this.snapshots.getNames();\n\t}\n\n\tpublic getSelectedReqSeqNumbers(): number[] {\n\t\treturn this.snapshots.getSelectedReqSeqNumbers();\n\t}\n\n\tpublic getScrollTop(): number[] {\n\t\treturn this.snapshots.getScrollTop();\n\t}\n\n\tpublic getSnapshotName(name: string): string {\n\t\tconst fileName = this.snapshots.getFileName(name);\n\t\tif (fileName) {\n\t\t\treturn fileName.replace('.proxyall', '');\n\t\t} else {\n\t\t\treturn 'SNAPSHOT';\n\t\t}\n\t}\n\n\tpublic getSnapshotCount() {\n\t\treturn this.snapshots.count();\n\t}\n\n\tpublic getSnapshotSize(name: string) {\n\t\treturn this.snapshots.get(name).length;\n\t}\n\n\tpublic getSelectedSnapshotName(): string {\n\t\treturn this.selectedSnapshotName;\n\t}\n\n\t@action public setSelectedSnapshotName(name: string) {\n\t\tthis.selectedSnapshotName = name;\n\t}\n\n\t@action public newSnapshot(fileName?: string, snapshot?: MessageStore[]): string {\n\t\tconst padTime = (num: number) => (num+'').padStart(2, '0');\n\t\tconst activeSnapshot = this.snapshots.get(ACTIVE_SNAPSHOT_NAME);\n\t\tconst date = new Date();\n\t\tconst hours = (date.getHours() >= 12 ? date.getHours() - 12 : date.getHours()) + 1;\n\t\tconst name = 'Snapshot ' + padTime(hours) + ':' + padTime(date.getMinutes()) + '.' + padTime(date.getSeconds());\n\t\tif(snapshot) {\n\t\t\tthis.snapshots.set(name, snapshot, fileName);\n\t\t} else {\n\t\t\tthis.snapshots.set(name, activeSnapshot.slice(), fileName);\n\t\t\tactiveSnapshot.splice(0, activeSnapshot.length);\n\t\t}\n\t\treturn name;\n\t}\n\n\tpublic deleteSnapshot(name: string) {\n\t\tthis.snapshots.delete(name);\n\t\tif (this.selectedSnapshotName === name) {\n\t\t\tthis.selectedSnapshotName = ACTIVE_SNAPSHOT_NAME;\n\t\t}\n\t}\n\n\tpublic deleteAllSnapshots() {\n\t\tfor(const name of this.snapshots.getNames().slice()) {\n\t\t\tif(name !== ACTIVE_SNAPSHOT_NAME) {\n\t\t\t\tthis.deleteSnapshot(name);\n\t\t\t}\n\t\t}\n\t\tthis.selectedSnapshotName = ACTIVE_SNAPSHOT_NAME;\n\t}\n\n\tpublic exportSelectedSnapshot(fileName: string) {\n\t\tconst element = document.createElement(\"a\");\n\t\tlet messages: Message[] = [];\n\t\tfor (const messageStore of this.getSelectedMessages()) {\n\t\t\tmessages.push(messageStore.getMessage());\n\t\t}\n\t\tconst file = new Blob([JSON.stringify(messages, null, 2)], {type: 'text/plain'});\n\t\telement.href = URL.createObjectURL(file);\n\t\telement.download = fileName + '.proxyall';\n\t\tdocument.body.appendChild(element); // Required for this to work in FireFox\n\t\telement.click();\n\t}\n\n\tpublic importSnapshot(fileName: string, snapshot: string) {\n\t\tconst parsedBlob = JSON.parse(snapshot);\n\t\tconst messageStores: MessageStore[] = [];\n\t\tfor (const message of parsedBlob) {\n\t\t\tconst ms = new MessageStore(message);\n\t\t\tmessageStores.push(ms);\n\t\t}\n\t\tthis.newSnapshot(fileName, messageStores);\n\t}\n\n\tpublic getSelectedMessages(): MessageStore[] {\n\t\tconst snapshot = this.snapshots.get(this.selectedSnapshotName);\n\t\treturn snapshot;\n\t}\n}\n\nexport const snapshotStore = new SnapshotStore();","import { makeAutoObservable, action } from \"mobx\"\nimport Message, { NO_RESPONSE } from '../common/Message';\nimport { breakpointStore } from \"./BreakpointStore\";\nimport MessageStore from './MessageStore';\nimport { snapshotStore } from './SnapshotStore';\n\nconst DEFAULT_LIMIT = 1000;\nconst LOCAL_STORAGE_LIMIT = 'proxyall-limit';\n\nexport default class MessageQueueStore {\n\tprivate limit: number = this._getLimit();\n\tprivate stopped: boolean = false;\n\tprivate autoScroll: boolean = false;\n\n\tpublic constructor() {\n\t\tmakeAutoObservable(this);\n\t}\n\n\tprivate _getLimit(): number {\n\t\tconst limit = localStorage.getItem(LOCAL_STORAGE_LIMIT);\n\t\tif (limit) {\n\t\t\treturn Number(limit);\n\t\t}\n\t\tlocalStorage.setItem(LOCAL_STORAGE_LIMIT, DEFAULT_LIMIT + '');\n\t\treturn DEFAULT_LIMIT;\n\t}\n\n\tpublic getLimit(): number {\n\t\treturn this.limit;\n\t}\n\n\t@action public setLimit(limit: number) {\n\t\tlocalStorage.setItem(LOCAL_STORAGE_LIMIT, limit + '');\n\t\tthis.limit = limit;\n\t}\n\n\tpublic getStopped(): boolean {\n\t\treturn this.stopped;\n\t}\n\n\t@action public setStopped(stopped: boolean) {\n\t\tthis.stopped = stopped;\n\t}\n\n\t@action public toggleStopped() {\n\t\tthis.stopped = !this.stopped;\n\t}\n\n\tpublic getAutoScroll(): boolean {\n\t\treturn snapshotStore.isActiveSnapshotSelected() && this.autoScroll;\n\t}\n\n\t@action public toggleAutoScroll() {\n\t\tthis.autoScroll = !this.autoScroll;\n\t}\n\n\t@action public clear() {\n\t\twhile(snapshotStore.getActiveSnapshot().length > 0) {\n\t\t\tsnapshotStore.getActiveSnapshot().pop();\n\t\t}\n\t\tthis.stopped = false;\n\t}\n\n\tpublic getMessages(): MessageStore[] {\n\t\treturn snapshotStore.getSelectedMessages();\n\t}\n\n\t@action public insertBatch(messages: Message[]) {\n\t\tif (this.stopped) return;\n\n\t\tconst activeSnapshot = snapshotStore.getActiveSnapshot();\n\n\t\tconst copyMessages = activeSnapshot.slice(); // shallow copy\n\t\tfor (const message of messages) {\n\t\t\tif (!message.proxyConfig?.recording) return;\n\n\t\t\tlet l = 0;\n\t\t\tlet r = copyMessages.length - 1;\n\t\t\tlet m: number = 0;\n\n\t\t\tlet sn = 0;\n\t\t\twhile (l <= r) {\n\t\t\t\tm = l + Math.floor((r - l) / 2);\n\t\t\t\tsn = copyMessages[m].getMessage().sequenceNumber;\n\t\t\t\tif (sn === message.sequenceNumber) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif (sn < message.sequenceNumber) {\n\t\t\t\t\tl = m + 1;\n\t\t\t\t} else {\n\t\t\t\t\tr = m - 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// console.log(l,r,m);\n\t\t\tconst messageStore = new MessageStore(message);\n\t\t\tif (copyMessages.length === 0) {\n\t\t\t\tcopyMessages.push(messageStore);\n\t\t\t} else if (sn === message.sequenceNumber) {\n\t\t\t\tif (messageStore.getMessage().responseBody !== NO_RESPONSE) {\n\t\t\t\t\tcopyMessages[m] = messageStore;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (sn < message.sequenceNumber) {\n\t\t\t\tcopyMessages.splice(m + 1, 0, messageStore);\n\t\t\t} else if (sn > message.sequenceNumber) {\n\t\t\t\tcopyMessages.splice(m, 0, messageStore);\n\t\t\t}\n\n\t\t\tconst breakpoint = breakpointStore.findMatchingBreakpoint(message);\n\t\t\tif (breakpoint) {\n\t\t\t\tactiveSnapshot.splice(0, activeSnapshot.length);\n\t\t\t\tArray.prototype.push.apply(activeSnapshot, copyMessages);\n\t\t\t\tcopyMessages.splice(0, copyMessages.length);\n\t\t\t\tsnapshotStore.newSnapshot(breakpoint.getFilter());\n\t\t\t\tbreakpoint.setEnabled(false); // disable breakpoint\n\t\t\t\tbreakpointStore.changed();\n\t\t\t}\n\n\t\t\t// Shrink array\n\t\t\tif (copyMessages.length >= this.limit + this.limit / 2) {\n\t\t\t\tcopyMessages.splice(0, copyMessages.length - this.limit);\n\t\t\t}\n\t\t}\n\n\t\tactiveSnapshot.splice(0, activeSnapshot.length);\n\t\tArray.prototype.push.apply(activeSnapshot, copyMessages);\n\t}\n}\n\nexport const messageQueueStore = new MessageQueueStore();","import { makeAutoObservable, action } from \"mobx\"\nimport { ConfigProtocol } from \"../common/ProxyConfig\";\nimport { ConfigProtocols } from \"./SettingsStore\";\n\nexport const mapProtocolToIndex: Map<ConfigProtocol, number> =\n\tnew Map(Object.values(ConfigProtocols).map((protocol, i) => [protocol, i]));\n\nexport class MetricsByProtocol {\n\tprotocol: ConfigProtocol;\n\trequestCount: number = 0;\n\tresponseCount: number = 0;\n\ttotalTime: number = 0;\n\tmaximumTime: number = 0;\n\tminimumTime: number = 0;\n\n\tconstructor(protocol: ConfigProtocol) {\n\t\tthis.protocol = protocol;\n\t}\n}\n\nexport default class MetricsStore {\n\tprivate metricsByProtocol: MetricsByProtocol[] = [];\n\n\tpublic constructor() {\n\t\tfor (const protocol of Object.values(ConfigProtocols)) {\n\t\t\tthis.metricsByProtocol.push(new MetricsByProtocol(protocol));\n\t\t}\n\t\tmakeAutoObservable(this);\n\t}\n\n\tpublic getMetrics(): MetricsByProtocol[] {\n\t\treturn this.metricsByProtocol;\n\t}\n\n\t@action public clear() {\n\t\tlet i = 0;\n\t\tfor (const protocol of Object.values(ConfigProtocols)) {\n\t\t\tthis.metricsByProtocol[i++] = new MetricsByProtocol(protocol);\n\t\t}\n\t}\n}\n\nexport const metricsStore = new MetricsStore();\n","import { makeAutoObservable, action } from \"mobx\"\nimport Message from \"../common/Message\";\n\nconst LOCAL_STORAGE = 'proxyall-no-capture';\n\nexport default class NoCaptureStore {\n\tprivate clientList: string[] = [];\n\n\tpublic constructor() {\n\t\tmakeAutoObservable(this);\n\t\tthis.init();\n\t}\n\n @action public init() {\n\t\tconst clientList = localStorage.getItem(LOCAL_STORAGE);\n\t\tif (clientList) {\n\t\t\tthis.clientList = JSON.parse(clientList);\n\t\t} else {\n\t\t\tthis.clientList = [];\n\t\t}\n\t}\n\n\t@action public save() {\n\t\tthis.clientList = this.clientList.filter(client => client.length > 0);\n\t\tlocalStorage.setItem(LOCAL_STORAGE, JSON.stringify(this.clientList));\n\t}\n\n\tprivate isMatch(needle: string, haystack: string): boolean {\n\t\tif (needle.includes('.*')) {\n\t\t\treturn haystack.toLowerCase().search(needle.toLowerCase()) !== -1;\n\t\t} else {\n\t\t\treturn needle.toLowerCase() === haystack.toLowerCase();\n\t\t}\n\t}\n\n\tpublic contains(message: Message): boolean {\n\t\tfor(const client of this.clientList) {\n\t\t\tif (this.isMatch(client, message.clientIp!)) return true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tpublic getClientList() {\n\t\treturn this.clientList;\n\t}\n\n\t@action public extend() {\n\t\tthis.clientList.push('');\n\t}\n\n\t@action public deleteEntry(index: number) {\n\t\tthis.clientList.splice(index, 1);\n\t}\n\n\t@action public updateEntry(index: number, value: string) {\n\t\tthis.clientList[index] = value;\n\t}\n}\n\nexport const noCaptureStore = new NoCaptureStore();\n","import { makeAutoObservable, action } from \"mobx\"\nimport io, { Socket } from \"socket.io-client\";\nimport Message, { MessageType } from '../common/Message';\nimport proxyConfigStore from './ProxyConfigStore';\nimport { messageQueueStore } from './MessageQueueStore';\nimport ProxyConfig from '../common/ProxyConfig';\nimport { metricsStore } from './MetricsStore';\nimport { mapProtocolToIndex } from './MetricsStore';\nimport { noCaptureStore } from \"./NoCaptureStore\";\nimport { filterStore } from \"./FilterStore\";\nimport MessageStore from \"./MessageStore\";\n\nexport default class SocketStore {\n\tprivate socket?: Socket = undefined;\n\tprivate socketConnected: boolean = false;\n\tprivate queuedCount: number = 0;\n\tprivate requestCount: number = 0;\n\tprivate responseCount: number = 0;\n\n\tpublic constructor() {\n\t\tmakeAutoObservable(this);\n\t\tthis.connect();\n\t}\n\n\t@action private connect() {\n\t\tthis.socket = io();\n\n\t\tthis.socket.on('connect', () => {\n\t\t\tconsole.log('socket connected');\n\t\t\tthis.setSocketConnected(true);\n\t\t});\n\n\t\tthis.socket.on('proxy config', (proxyConfigs: ProxyConfig[]) => {\n\t\t\t//console.log('proxy configs', proxyConfigs);\n\t\t\tproxyConfigStore.setProxyConfigs(proxyConfigs);\n\t\t\tproxyConfigStore.load(); // send to server\n\t\t});\n\n\t\tthis.socket.on('disconnect', () => {\n\t\t\tconsole.log('socket disconnected');\n\t\t\tthis.setSocketConnected(false);\n\t\t});\n\n\t\tthis.socket.on('error', (e: any) => {\n\t\t\tconsole.log('socket error', e);\n\t\t});\n\n\t\tthis.socket.on('reqResJson', (messages: Message[], queuedCount: number, callback: any) => {\n\t\t\tthis.queuedCount = queuedCount;\n\t\t\tfor (const message of messages) {\n\t\t\t\tthis.countMetrics(message);\n\t\t\t}\n\n\t\t\t// Filter messages:\n\t\t\t// 1) From clients that are in the No Capture List\n\t\t\t// 2) If delete filtered (X) is selected, and message doesn't match filter criteria\n\t\t\tconst filteredMessages = messages.filter(\n\t\t\t\tmessage => {\n\t\t\t\t\tif (noCaptureStore.contains(message)) return false;\n\t\t\t\t\tif (\n\t\t\t\t\t\tfilterStore.getFilter().length > 0\n\t\t\t\t\t\t&& filterStore.deleteFiltered()\n\t\t\t\t\t\t&& filterStore.isFiltered(new MessageStore(message))) {\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t);\n\t\t\tmessageQueueStore.insertBatch(filteredMessages);\n\n\t\t\tif (callback) {\n\t\t\t\tconst first = messages[0];\n\t\t\t\tcallback(`${messageTypeTOString(first)} seq=${first.sequenceNumber}`);\n\t\t\t}\n\n\t\t\tfunction messageTypeTOString(message: Message): string {\n\t\t\t\tswitch (message.type) {\n\t\t\t\t\tcase MessageType.REQUEST:\n\t\t\t\t\t\treturn 'req';\n\t\t\t\t\tcase MessageType.RESPONSE:\n\t\t\t\t\t\treturn 'res';\n\t\t\t\t\tcase MessageType.REQUEST_AND_RESPONSE:\n\t\t\t\t\t\treturn 'req/res';\n\t\t\t\t}\n\t\t\t\treturn 'unknown';\n\t\t\t}\n\t\t});\n\t}\n\n\t@action private countMetrics(message: Message) {\n\t\tconst protocol = message.proxyConfig!.protocol;\n\t\tconst i = mapProtocolToIndex.get(protocol);\n\t\tif (i === undefined) {\n\t\t\tconsole.error(`Unknown protocol ${protocol} for message ${message}`);\n\t\t\treturn;\n\t\t}\n\n\t\tconst row = metricsStore.getMetrics()[i];\n\n\t\tif (message.type === MessageType.REQUEST_AND_RESPONSE\n\t\t\t|| message.type === MessageType.REQUEST) {\n\t\t\t++row.requestCount;\n\t\t\t++this.requestCount;\n\t\t}\n\t\tif (message.type === MessageType.REQUEST_AND_RESPONSE\n\t\t\t|| message.type === MessageType.RESPONSE) {\n\t\t\t++row.responseCount;\n\t\t\t++this.responseCount;\n\t\t\trow.totalTime += message.elapsedTime;\n\n\t\t\tif (message.elapsedTime > row.maximumTime) {\n\t\t\t\trow.maximumTime = message.elapsedTime;\n\t\t\t}\n\n\t\t\tif (message.elapsedTime < row.minimumTime || row.minimumTime === 0) {\n\t\t\t\trow.minimumTime = message.elapsedTime;\n\t\t\t}\n\t\t}\n\t}\n\n\t@action clearMetrics() {\n\t\tthis.requestCount = 0;\n\t\tthis.responseCount = 0;\n\t\tmetricsStore.clear();\n\t}\n\n\tpublic getRequestCount() {\n\t\treturn this.requestCount;\n\t}\n\n\tpublic getResponseCount() {\n\t\treturn this.responseCount;\n\t}\n\n\tpublic getQueuedCount() {\n\t\treturn this.queuedCount;\n\t}\n\n\t@action setSocketConnected(value: boolean) {\n\t\tthis.socketConnected = value;\n\t}\n\n\tpublic isConnected(): boolean {\n\t\treturn this.socketConnected;\n\t}\n\n\tpublic emitConfig(event: string, proxyConfig: ProxyConfig[]) {\n\t\tthis.socket?.emit(event, proxyConfig);\n\t}\n\n\tpublic emitResend(forwardProxy: boolean, method: string, url: string, message: Message, body?: string | object) {\n\t\tthis.socket?.emit('resend', forwardProxy, method, url, message, body);\n\t}\n}\n\nexport const socketStore = new SocketStore();\n","import { makeAutoObservable, action } from \"mobx\"\nimport Message from '../common/Message';\nimport { socketStore } from \"./SocketStore\";\n\nexport default class ResendStore {\n private message: Message;\n private methodAndUrl: string;\n private body: string | object;\n private error = '';\n\n public constructor(message: Message) {\n this.message = message;\n this.methodAndUrl = message.method + ' ' + message.url;\n this.body = message.requestBody;\n\t\tmakeAutoObservable(this);\n }\n\n public getMessage() {\n return this.message;\n }\n\n public getMethodAndUrl() {\n return this.methodAndUrl;\n }\n\n @action setMethodAndUrl(value: string) {\n this.methodAndUrl = value;\n }\n\n public getError() {\n return this.error;\n }\n\n public isBodyJson(): boolean {\n if (\n this.message.requestHeaders['content-type'] &&\n this.message.requestHeaders['content-type'].includes('application/json')\n ) {\n return true;\n }\n return false;\n }\n\n public getBody() {\n return this.body;\n }\n\n @action public setBody(body: string | object) {\n this.body = body;\n }\n\n public doResend() {\n const tokens = this.methodAndUrl.split(' ', 2);\n let method;\n let url;\n if (tokens.length > 1) {\n method = tokens[0];\n url = tokens[1];\n } else {\n url = this.methodAndUrl;\n method = 'GET';\n }\n\n const forwardProxy = url.startsWith('http:') || url.startsWith('https:');\n if (!forwardProxy) {\n const protocolHost = document.location.protocol + '//' + document.location.host\n url = protocolHost + url\n }\n\n const body = typeof this.body === 'string' && this.body.length === 0\n ? undefined\n : this.body;\n\n socketStore.emitResend(\n forwardProxy,\n method,\n url,\n this.message,\n body\n );\n }\n}","import React from 'react';\nimport { observer } from 'mobx-react-lite';\nimport { filterStore } from '../store/FilterStore';\nimport MessageQueueStore from '../store/MessageQueueStore';\nimport { CircularProgress, Fade } from '@material-ui/core';\nimport Request from './Request';\nimport Response from './Response';\nimport ResendModal from './ResendModal';\nimport ResendStore from '../store/ResendStore';\nimport Message from '../common/Message';\n\ntype Props = {\n\tmessageQueueStore: MessageQueueStore,\n\tselectedReqSeqNum: number,\n\tsetSelectedReqSeqNum: (seqNum: number) => void,\n\tscrollTop: number,\n\tsetScrollTop: (scrollTop: number) => void,\n}\nconst SnapshotTabContent = observer(({\n\tmessageQueueStore, selectedReqSeqNum, setSelectedReqSeqNum, scrollTop, setScrollTop\n}: Props) => {\n\tconst [openModal, setOpenModal] = React.useState(false);\n\tconst [resendStore, setResendStore] = React.useState<ResendStore>();\n\n\tconst ref = React.useRef<HTMLDivElement>(null);\n\n\tReact.useEffect(() => {\n\t\tif (filterStore.shouldResetScroll()) {\n\t\t\tfilterStore.setResetScroll(false);\n\t\t\tif (selectedReqSeqNum !== Number.MAX_SAFE_INTEGER) {\n\t\t\t\tsetScrollTo(selectedReqSeqNum);\n\t\t\t}\n\t\t} else if (messageQueueStore.getAutoScroll()) {\n\t\t\tif (selectedReqSeqNum === Number.MAX_SAFE_INTEGER) {\n\t\t\t\tconst messages = messageQueueStore.getMessages();\n\t\t\t\tconst lastMessage = messages[messages.length - 1];\n\t\t\t\tif (lastMessage) {\n\t\t\t\t\tsetScrollTo(lastMessage.getMessage().sequenceNumber);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\trestoreScrollTop();\n\t\t}\n\t});\n\n\tlet maxElapsedTime = 0;\n\tmessageQueueStore.getMessages()\n\t\t.forEach(messageStore => {\n\t\t\tconst et = messageStore.getMessage().elapsedTime ? messageStore.getMessage().elapsedTime : 0;\n\t\t\tmaxElapsedTime = Math.max(maxElapsedTime, et);\n\t\t});\n\n\tlet activeRequestIndex = Number.MAX_SAFE_INTEGER;\n\tlet matchCount = 0;\n\treturn (\n\t\t<div className=\"request-response__container\">\n\t\t\t{messageQueueStore.getMessages().length > 0 &&\n\t\t\t\t<div className={'request__container '\n\t\t\t\t\t+ (selectedReqSeqNum === Number.MAX_SAFE_INTEGER &&messageQueueStore.getMessages().length > 0\n\t\t\t\t\t\t? 'unselected' : '')}\n\t\t\t\t\tref={ref} onScroll={handleScroll}>\n\t\t\t\t\t{messageQueueStore.getMessages().map((messageStore, index) => {\n\t\t\t\t\t\tif (filterStore.isFiltered(messageStore)) {\n\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst message = messageStore.getMessage();\n\t\t\t\t\t\t\tconst seqNum = message.sequenceNumber;\n\t\t\t\t\t\t\tconst isActiveRequest = selectedReqSeqNum === seqNum;\n\t\t\t\t\t\t\tif (isActiveRequest) {\n\t\t\t\t\t\t\t\tactiveRequestIndex = index;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tmatchCount++;\n\t\t\t\t\t\t\tconst timeBarPercent = maxElapsedTime > 0\n\t\t\t\t\t\t\t\t? (message.elapsedTime ? ((message.elapsedTime * 100) / maxElapsedTime) : 1)\n\t\t\t\t\t\t\t\t: 0;\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<Request\n\t\t\t\t\t\t\t\t\tstore={messageStore}\n\t\t\t\t\t\t\t\t\tkey={seqNum}\n\t\t\t\t\t\t\t\t\tisActive={isActiveRequest}\n\t\t\t\t\t\t\t\t\ttimeBarPercent={timeBarPercent + '%'}\n\t\t\t\t\t\t\t\t\tonClick={handleClick.bind(null, seqNum)}\n\t\t\t\t\t\t\t\t\tonResend={() => handleResend(message)}\n\t\t\t\t\t\t\t\t/>)\n\t\t\t\t\t\t}\n\t\t\t\t\t})}\n\t\t\t\t\t{matchCount === 0 && (\n\t\t\t\t\t\t<div className=\"center\">\n\t\t\t\t\t\t\tNo matching request or response found. Adjust your filter criteria.\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t}\n\t\t\t{messageQueueStore.getMessages().length === 0 &&\n\t\t\t\t<div className=\"request__container\">\n\t\t\t\t\t<CircularProgress className=\"center\" />\n\t\t\t\t</div>\n\t\t\t}\n\t\t\t<div className=\"response__container\">\n\t\t\t\t{activeRequestIndex < messageQueueStore.getMessages().length ?\n\t\t\t\t\t<Response\n\t\t\t\t\t\tstore={messageQueueStore.getMessages()[activeRequestIndex]}\n\t\t\t\t\t\tmessage={messageQueueStore.getMessages()[activeRequestIndex].getMessage()}\n\t\t\t\t\t/>\n\t\t\t\t\t:\n\t\t\t\t\t<Fade in={true}>\n\t\t\t\t\t\t<div className=\"center\">\n\t\t\t\t\t\t\tSelect request from left column\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</Fade>\n\t\t\t\t}\n\t\t\t</div>\n\t\t\t{resendStore ? (\n\t\t\t\t<ResendModal\n\t\t\t\t\topen={openModal}\n\t\t\t\t\tonClose={() => setOpenModal(false)}\n\t\t\t\t\tstore={resendStore}\n\t\t\t\t/>\n\t\t\t) : null}\n\t\t</div>\n\t);\n\n\tfunction handleClick(seqNum: number) {\n\t\tconst curSeqNum = selectedReqSeqNum;\n\t\tsetSelectedReqSeqNum(Number.MAX_SAFE_INTEGER);\n\t\tif (seqNum !== curSeqNum) {\n\t\t\tsetSelectedReqSeqNum(seqNum);\n\t\t}\n\t}\n\n\tfunction handleScroll() {\n\t\tconst parent = (ref.current as Element);\n\t\tif (parent && parent.childNodes.length > 0) {\n\t\t\tsetScrollTop(parent.scrollTop);\n\t\t}\n\t}\n\n\tfunction handleResend(message: Message) {\n\t\tsetResendStore(new ResendStore(message));\n\t\tsetOpenModal(true);\n\t}\n\n\tfunction restoreScrollTop() {\n\t\tconst parent = (ref.current as Element);\n\t\tif (parent && parent.childNodes.length > 0) {\n\t\t\tparent.scrollTop = scrollTop;\n\t\t}\n\t}\n\n\tfunction setScrollTo(seqNum: number) {\n\t\tif (seqNum !== Number.MAX_SAFE_INTEGER) {\n\t\t\tlet offset = 0;\n\t\t\tsetTimeout(() => {\n\t\t\t\tconst parent = (ref.current as Element);\n\t\t\t\tif (parent && parent.childNodes.length > 0) {\n\t\t\t\t\tconst children = parent.childNodes;\n\t\t\t\t\tfor (let i = 0; i < messageQueueStore.getMessages().length; ++i) {\n\t\t\t\t\t\tif (messageQueueStore.getMessages()[i].getMessage().sequenceNumber === seqNum) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst element = (children[i] as Element);\n\t\t\t\t\t\tif (element) {\n\t\t\t\t\t\t\toffset += element.clientHeight;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tparent.scrollTop = offset;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n});\n\nexport default SnapshotTabContent;","import { Tab, Tabs } from '@material-ui/core'\nimport MessageQueueStore from '../store/MessageQueueStore';\nimport { observer } from 'mobx-react-lite';\nimport React from 'react';\nimport { TabContext, TabPanel } from '@material-ui/lab';\nimport SnapshotTabContent from './SnapshotTabContent';\nimport SnapshotStore, { ACTIVE_SNAPSHOT_NAME } from '../store/SnapshotStore';\n\ntype Props = {\n\tmessageQueueStore: MessageQueueStore,\n\tsnapshotStore: SnapshotStore,\n};\nconst SnapshotTabs = observer(({ messageQueueStore, snapshotStore }: Props) => {\n\n\tfunction handleTabChange(_e: React.ChangeEvent<{}>, value: string) {\n\t\t// console.log('handleTabChange', value);\n\t\tsnapshotStore.setSelectedSnapshotName(value);\n\t}\n\n\tfunction handleTakeSnapshot(_value: string) {\n\t\t// console.log('handleTakeSnapshot', value);\n\t\tsnapshotStore.newSnapshot();\n\t}\n\n\tfunction handleDeleteTab(event: any, value: string) {\n\t\t// console.log('handleDeleteSnapshot', value);\n;\t\tevent.stopPropagation();\n\t\tif (snapshotStore.getSelectedSnapshotName() === value) {\n\t\t\tsnapshotStore.setSelectedSnapshotName(ACTIVE_SNAPSHOT_NAME);\n\t\t}\n\t\tsnapshotStore.deleteSnapshot(value);\n\t}\n\n\treturn (\n\t\t<div className=\"snapshot__container\">\n\t\t\t<TabContext value={snapshotStore.getSelectedSnapshotName()}>\n\t\t\t\t<Tabs\n\t\t\t\t\tvalue={snapshotStore.getSelectedSnapshotName()}\n\t\t\t\t\tonChange={handleTabChange}\n\t\t\t\t\tindicatorColor=\"primary\"\n\t\t\t\t\ttextColor=\"primary\"\n\t\t\t\t\taria-label=\"Snapshots\">\n\t\t\t\t\t{snapshotStore.getSnapshotNames().map((value, i) => (\n\t\t\t\t\t\t<Tab\n\t\t\t\t\t\t\tvalue={ value }\n\t\t\t\t\t\t\tlabel={\n\t\t\t\t\t\t\t\t<div className={'snapshot__tab'}>\n\t\t\t\t\t\t\t\t\t<div>{(i === 0\n\t\t\t\t\t\t\t\t\t\t? messageQueueStore.getStopped() ? 'Stopped' : 'Recording'\n\t\t\t\t\t\t\t\t\t\t: snapshotStore.getSnapshotName(value)) + ' ('+snapshotStore.getSnapshotSize(value)+')'}</div>\n\t\t\t\t\t\t\t\t\t{value === ACTIVE_SNAPSHOT_NAME\n\t\t\t\t\t\t\t\t\t\t? <div className={ 'snapshot__folder-plus fa fa-camera' }\n\t\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\t\tmarginLeft: '.5rem',\n\t\t\t\t\t\t\t\t\t\t\t\tpointerEvents: snapshotStore.getSnapshotSize(value) === 0 ? 'none' : undefined,\n\t\t\t\t\t\t\t\t\t\t\t\topacity: snapshotStore.getSnapshotSize(value) === 0 ? .2 : undefined,\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\ttitle=\"Take snapshot\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => handleTakeSnapshot(value)}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t: <div className={ 'snapshot__close fa fa-times' }\n\t\t\t\t\t\t\t\t\t\t\tstyle={{marginLeft: '.5rem'}}\n\t\t\t\t\t\t\t\t\t\t\ttitle=\"Delete snapshot\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={(e) => handleDeleteTab(e, value)}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t}>\n\t\t\t\t\t\t</Tab>\n\t\t\t\t\t))}\n\t\t\t\t</Tabs>\n\t\t\t\t{snapshotStore.getSnapshotNames().map((value, i) => (\n\t\t\t\t\t<TabPanel value={value}>\n\t\t\t\t\t\t<SnapshotTabContent\n\t\t\t\t\t\t\tmessageQueueStore={ messageQueueStore }\n\t\t\t\t\t\t\tselectedReqSeqNum={snapshotStore.getSelectedReqSeqNumbers()[i]}\n\t\t\t\t\t\t\tsetSelectedReqSeqNum={\n\t\t\t\t\t\t\t\t(num) => snapshotStore.getSelectedReqSeqNumbers()[i] = num\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tscrollTop={snapshotStore.getScrollTop()[i]}\n\t\t\t\t\t\t\tsetScrollTop={\n\t\t\t\t\t\t\t\t(scrollTop) => snapshotStore.getScrollTop()[i] = scrollTop\n\t\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t\t</TabPanel>\n\t\t\t\t))}\n\t\t\t</TabContext>\n\t\t</div>\n\t);\n});\n\nexport default SnapshotTabs;","import { CircularProgress, Modal, Tab, Tabs } from '@material-ui/core'\nimport SettingsStore, { HostStatus } from '../store/SettingsStore';\nimport { observer } from 'mobx-react-lite';\nimport React from 'react';\nimport { TabContext, TabPanel } from '@material-ui/lab';\n\ntype Props = {\n\topen: boolean,\n\tonClose: () => void,\n\tstore: SettingsStore,\n\tinitTabValue: HostStatus,\n};\nconst ReachableHostsModal = observer(({ open, onClose, store, initTabValue }: Props) => {\n\tconst TAB_VALUES = [HostStatus.Reachable, HostStatus.Unreachable];\n\tconst [tabValue, setTabValue] = React.useState(initTabValue);\n\n\tfunction handleTabChange(_e: React.ChangeEvent<{}>, value: HostStatus) {\n\t\tsetTabValue(value);\n\t}\n\n\tfunction onRefresh() {\n\t\tstore.setConfig();\n\t}\n\n\treturn (\n\t\t<Modal\n\t\t\tclassName=\"modal-window\"\n\t\t\topen={open}\n\t\t\tonClose={onClose}\n\t\t\taria-labelledby=\"simple-modal-title\"\n \t\taria-describedby=\"simple-modal-description\"\n\t\t>\n\t\t\t<div className=\"reachable-modal\" role=\"dialog\">\n\t\t\t\t<div>\n\t\t\t\t\t<h3>Reachable Hosts</h3>\n\t\t\t\t\t<div style={{ borderTop: 'solid steelblue', paddingTop: '.5rem' }}>\n\t\t\t\t\t\t<div className=\"reachable-modal__scroll-container\">\n\t\t\t\t\t\t\t{store.isStatusUpdating()\n\t\t\t\t\t\t\t\t? <div style={{\n\t\t\t\t\t\t\t\t\twidth: '100%',\n\t\t\t\t\t\t\t\t\tmarginTop: '1rem',\n\t\t\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\t\t\tjustifyContent: 'center',\n\t\t\t\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\t\t\t}}>\n\t\t\t\t\t\t\t\t\t<CircularProgress />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t:\n\t\t\t\t\t\t\t\t<TabContext value={tabValue}>\n\t\t\t\t\t\t\t\t\t<Tabs\n\t\t\t\t\t\t\t\t\t\tvalue={tabValue}\n\t\t\t\t\t\t\t\t\t\tonChange={handleTabChange}\n\t\t\t\t\t\t\t\t\t\tindicatorColor=\"primary\"\n\t\t\t\t\t\t\t\t\t\ttextColor=\"primary\"\n\t\t\t\t\t\t\t\t\t\taria-label=\"Settings table\">\n\t\t\t\t\t\t\t\t\t\t{TAB_VALUES.map(value => (\n\t\t\t\t\t\t\t\t\t\t\t<Tab value={ value }\n\t\t\t\t\t\t\t\t\t\t\t\tlabel={\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div className={ 'fa ' +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t(value === HostStatus.Reachable\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'success fa-circle'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: 'error fa-exclamation-triangle') }>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span style={{ marginLeft: '.25rem', color: 'black' }}>{value}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t}>\n\t\t\t\t\t\t\t\t\t\t\t</Tab>\n\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t</Tabs>\n\t\t\t\t\t\t\t\t\t{TAB_VALUES.map(value => (\n\t\t\t\t\t\t\t\t\t\t<TabPanel value={value}>\n\t\t\t\t\t\t\t\t\t\t\t{store.getEntries(value).length === 0\n\t\t\t\t\t\t\t\t\t\t\t\t? <div>No hosts are {value.toLocaleLowerCase()} !</div>\n\t\t\t\t\t\t\t\t\t\t\t\t: <table className=\"table settings-modal__table\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{store.getEntries(value).length > 0 ?\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td className=\"text-primary\"><label>Host</label></td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td className=\"text-primary\"><label>Port</label></td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: null}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{store.getEntries(value).sort((a, b) => a.hostname.localeCompare(b.hostname))\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t.map((entry, index) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr className=\"settings-modal__proxy-row\" key={index}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td className=\"settings-modal__proxy-host-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<input className=\"form-control settings-modal__proxy-host\" value={entry.hostname} disabled />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td className=\"settings-modal__proxy-host-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<input className=\"form-control settings-modal__proxy-host\" value={entry.port} disabled />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t</TabPanel>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</TabContext>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"modal-footer\">\n\t\t\t\t\t\t<label className=\"settings-modal__error-message\">{store.getError()}</label>\n\t\t\t\t\t\t<button type=\"button\" className=\"settings-modal__cancel btn btn-default btn-success\"\n\t\t\t\t\t\t\tonClick={ onRefresh }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tRefresh\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<button type=\"button\" className=\"settings-modal__cancel btn btn-default btn-default\"\n\t\t\t\t\t\t\tonClick={ onClose }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tClose\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</Modal>\n\t);\n});\n\nexport default ReachableHostsModal;","import SettingsStore from '../store/SettingsStore';\nimport { observer } from 'mobx-react-lite';\nimport { ConfigProtocol } from '../common/ProxyConfig';\nimport {Checkbox} from '@material-ui/core'\n\ntype Props = {\n\tstore: SettingsStore,\n\tprotocol: ConfigProtocol,\n};\nconst SettingsTable = observer(({ store, protocol }: Props) => {\n\tconst pathLabel = () => {\n\t\tswitch (protocol) {\n\t\t\tcase 'browser:':\n\t\t\t\treturn 'Paths';\n\t\t\tcase 'grpc:':\n\t\t\tcase 'mongo:':\n\t\t\tcase 'redis:':\n\t\t\tcase 'sql:':\n\t\t\t\treturn 'Source Port';\n\t\t\tcase 'http:':\n\t\t\tcase 'https:':\n\t\t\t\treturn 'Path';\n\t\t\tcase 'log:':\n\t\t\t\treturn 'Command';\n\t\t\tdefault:\n\t\t\t\treturn 'Port';\n\t\t}\n\t};\n\n\treturn (\n\t\t<table className=\"table settings-modal__table\">\n\t\t\t{store.getEntries().length > 0 ?\n\t\t\t<thead>\n\t\t\t\t<tr>\n\t\t\t\t\t<td></td>\n\t\t\t\t\t<td></td>\n\t\t\t\t\t{(protocol === 'grpc:' || protocol === 'tcp:') &&\n\t\t\t\t\t\t<td className=\"text-primary\">Secure?</td>\n\t\t\t\t\t}\n\t\t\t\t\t<td className=\"text-primary\" style={{width: pathLabel().includes('Port') ? '12ch' : undefined}}><label>{pathLabel()}</label></td>\n\t\t\t\t\t<td className=\"text-primary\"><label>{protocol !== 'browser:' && protocol !== 'log:' && 'Target Host'}</label></td>\n\t\t\t\t\t<td className=\"text-primary\" style={{width: '12ch'}}><label>{protocol !== 'browser:' && protocol !== 'log:' && 'Target Port'}</label></td>\n\t\t\t\t\t<td className=\"text-primary\"><label>Comment</label></td>\n\t\t\t\t\t<td className=\"text-primary\"><label>Status</label></td>\n\t\t\t\t</tr>\n\t\t\t</thead>\n\t\t\t: null }\n\t\t\t<tbody>\n\t\t\t\t{store.getEntries().map((entry, index) => entry.protocol === protocol && (\n\t\t\t\t\t<tr className={\"settings-modal__proxy-row\" + (entry.recording ? '' : ' nocapture')} key = { index }\n\t\t\t\t\t>\n\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t<button className=\"settings-modal__proxy-delete-button btn btn-xs btn-danger\"\n\t\t\t\t\t\t\t\tonClick={ () => store.deleteEntry(index) }\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tX\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t\t<td className=\"settings-modal__recording-container\">\n\t\t\t\t\t\t\t<div className={'settings__recording fas '\n\t\t\t\t\t\t\t\t+ (entry.recording ? 'fa-pause' : 'fa-play')}\n\t\t\t\t\t\t\t\tonClick={() => store.toggleEntryCapture(index)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t\t{(protocol === 'grpc:' || protocol === 'tcp:') &&\n\t\t\t\t\t\t\t<td className=\"settings-modal__secure-container\">\n\t\t\t\t\t\t\t\t<Checkbox checked={store.isEntrySecure(index)} onChange={() => store.toggleEntryIsSecure(index)}/>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t}\n\t\t\t\t\t\t<td className=\"settings-modal__proxy-path-container\">\n\t\t\t\t\t\t\t<input className=\"form-control settings-modal__proxy-path\"\n\t\t\t\t\t\t\t\tstyle={{width: pathLabel().includes('Port') ? '8ch' : undefined}}\n\t\t\t\t\t\t\t\tonChange={ (e) => store.updateEntryPath(index, e.target.value) }\n\t\t\t\t\t\t\t\tvalue={entry.path} />\n\t\t\t\t\t\t</td>\n\t\t\t\t\t\t<td className=\"settings-modal__proxy-host-container\">\n\t\t\t\t\t\t\t<input className=\"form-control settings-modal__proxy-host\"\n\t\t\t\t\t\t\t\thidden={ entry.protocol === 'browser:' || entry.protocol === 'log:' }\n\t\t\t\t\t\t\t\tonChange={ (e) => store.updateEntryHost(index, e.target.value) }\n\t\t\t\t\t\t\t\tvalue={entry.hostname} />\n\t\t\t\t\t\t</td>\n\t\t\t\t\t\t<td className=\"settings-modal__proxy-host-container\">\n\t\t\t\t\t\t\t<input className=\"form-control settings-modal__proxy-port\"\n\t\t\t\t\t\t\t\thidden={ entry.protocol === 'browser:' || entry.protocol === 'log:' }\n\t\t\t\t\t\t\t\tonChange={ (e) => store.updateEntryPort(index, e.target.value) }\n\t\t\t\t\t\t\t\tvalue={entry.port} />\n\t\t\t\t\t\t</td>\n\t\t\t\t\t\t<td className=\"settings-modal__proxy-host-container\">\n\t\t\t\t\t\t\t<input className=\"form-control settings-modal__proxy-comment\"\n\t\t\t\t\t\t\t\tonChange={ (e) => store.updateComment(index, e.target.value) }\n\t\t\t\t\t\t\t\tvalue={entry.comment} />\n\t\t\t\t\t\t</td>\n\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t<div className=\"settings-modal__status-container\">\n\t\t\t\t\t\t\t\t<div className={`settings-modal__status fa\n\t\t\t\t\t\t\t\t\t${store.isStatusUpdating()\n\t\t\t\t\t\t\t\t\t? 'updating fa-circle'\n\t\t\t\t\t\t\t\t\t:\n\t\t\t\t\t\t\t\t\t\tentry.hostReachable\n\t\t\t\t\t\t\t\t\t\t? 'success fa-circle'\n\t\t\t\t\t\t\t\t\t\t: 'error fa-exclamation-triangle'}`}>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t))}\n\t\t\t</tbody>\n\t\t</table>\n\t);\n});\n\nexport default SettingsTable;","import { Modal } from '@material-ui/core'\nimport SettingsTable from './SettingsTable';\nimport SettingsStore from '../store/SettingsStore';\nimport { observer } from 'mobx-react-lite';\nimport { Tab, Tabs } from '@material-ui/core';\nimport TabContext from '@material-ui/lab/TabContext';\nimport TabPanel from '@material-ui/lab/TabPanel';\nimport React from 'react';\nimport pickIcon from '../PickIcon';\nimport { ConfigProtocol } from '../common/ProxyConfig';\n\ntype Props = {\n\topen: boolean,\n\tonClose: () => void,\n\tstore: SettingsStore,\n};\nconst SettingsModal = observer(({ open, onClose, store }: Props) => {\n\tconst [tabValue, setTabValue] = React.useState('browser:');\n\tstore.setProtocol(tabValue as ConfigProtocol);\n\n\tfunction handleTabChange(_e: React.ChangeEvent<{}>, value: string) {\n\t\tsetTabValue(value);\n\t\tstore.setProtocol(value as ConfigProtocol);\n\t}\n\n\treturn (\n\t\t<Modal\n\t\t\tclassName=\"modal-window\"\n\t\t\topen={open}\n\t\t\tonClose={onClose}\n\t\t\tdisableBackdropClick\n\t\t\taria-labelledby=\"simple-modal-title\"\n \t\taria-describedby=\"simple-modal-description\"\n\t\t>\n\t\t\t<div className=\"settings-modal\" role=\"dialog\">\n\t\t\t\t<div>\n\t\t\t\t\t<h3>Settings</h3>\n\t\t\t\t\t<TabContext value={tabValue}>\n\t\t\t\t\t\t<Tabs\n\t\t\t\t\t\t\tvalue={tabValue}\n\t\t\t\t\t\t\tonChange={handleTabChange}\n\t\t\t\t\t\t\tindicatorColor=\"primary\"\n\t\t\t\t\t\t\ttextColor=\"primary\"\n\t\t\t\t\t\t\taria-label=\"Settings table\">\n\t\t\t\t\t\t\t{store.getProtocols().map(protocol => (\n\t\t\t\t\t\t\t\t<Tab value={protocol}\n\t\t\t\t\t\t\t\t\tlabel={\n\t\t\t\t\t\t\t\t\t\t<div className={pickIcon(protocol)}>\n\t\t\t\t\t\t\t\t\t\t\t<span style={{ marginLeft: '.25rem' }}>{protocol}</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\ttitle={store.getTooltip(protocol)}>\n\t\t\t\t\t\t\t\t</Tab>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</Tabs>\n\t\t\t\t\t\t{store.getProtocols().map(protocol => (\n\t\t\t\t\t\t\t<TabPanel value={ protocol }>\n\t\t\t\t\t\t\t\t<div className=\"settings-modal__scroll-container\">\n\t\t\t\t\t\t\t\t\t<SettingsTable store={store} protocol={ protocol }></SettingsTable>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</TabPanel>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</TabContext>\n\t\t\t\t\t<div style={{borderTop: 'solid steelblue', paddingTop: '.5rem'}}>\n\t\t\t\t\t\t<table>\n\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<td className=\"settings-modal__select-protocol-container\">\n\t\t\t\t\t\t\t\t\t\t<select className=\"form-control settings-modal__select-protocol\"\n\t\t\t\t\t\t\t\t\t\t\tonChange={(e) => store.setProtocol(e.target.value as ConfigProtocol)}\n\t\t\t\t\t\t\t\t\t\t\tvalue={ store.getProtocol() }\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{store.getProtocols().map((protocol) => {\n\t\t\t\t\t\t\t\t\t\t\t\treturn <option key={ protocol }>{ protocol }</option>\n\t\t\t\t\t\t\t\t\t\t\t})};\n\t\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td className=\"settings-modal__add-container\">\n\t\t\t\t\t\t\t\t\t\t<input type=\"text\" className=\"form-control settings-modal__add-input\"\n\t\t\t\t\t\t\t\t\t\t\tplaceholder={\n\t\t\t\t\t\t\t\t\t\t\t\tstore.getProtocol() === 'log:'\n\t\t\t\t\t\t\t\t\t\t\t\t? 'Log tail command (e.g., docker logs -f container)'\n\t\t\t\t\t\t\t\t\t\t\t\t\t: store.getProtocol() === 'http:'\n\t\t\t\t\t\t\t\t\t\t\t\t\t|| store.getProtocol() === 'https:'\n\t\t\t\t\t\t\t\t\t\t\t\t? 'Path: /xxx, .*/xxx, or hostname/xxx'\n\t\t\t\t\t\t\t\t\t\t\t\t: store.getProtocol() === 'browser:'\n\t\t\t\t\t\t\t\t\t\t\t\t\t? 'Path: /xxx, or .*/xxx'\n\t\t\t\t\t\t\t\t\t\t\t\t\t: 'Source TCP port'\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tvalue={ store.getPath() }\n\t\t\t\t\t\t\t\t\t\t\tonChange={(e) => store.setPath(e.target.value)}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td className=\"settings-modal__add-container\">\n\t\t\t\t\t\t\t\t\t\t<input type=\"text\" className=\"form-control settings-modal__add-input\"\n\t\t\t\t\t\t\t\t\t\t\thidden={ store.isProxyOrLog() }\n\t\t\t\t\t\t\t\t\t\t\tplaceholder={store.isProxyOrLog() ? '' : 'Target host name'}\n\t\t\t\t\t\t\t\t\t\t\tvalue={ store.getTargetHost() }\n\t\t\t\t\t\t\t\t\t\t\tonChange={(e) => store.setTargetHost(e.target.value)}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td className=\"settings-modal__add-container\">\n\t\t\t\t\t\t\t\t\t\t<input type=\"text\" className=\"form-control settings-modal__add-input\"\n\t\t\t\t\t\t\t\t\t\t\thidden={ store.isProxyOrLog() }\n\t\t\t\t\t\t\t\t\t\t\tplaceholder={store.isProxyOrLog() ? '' : 'Target port number'}\n\t\t\t\t\t\t\t\t\t\t\tvalue={ store.getTargetPort() }\n\t\t\t\t\t\t\t\t\t\t\tonChange={(e) => store.setTargetPort(e.target.value)}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td className=\"settings-modal__add-container\">\n\t\t\t\t\t\t\t\t\t\t<input type=\"text\" className=\"form-control settings-modal__add-input\"\n\t\t\t\t\t\t\t\t\t\t\tplaceholder={'Optional comment'}\n\t\t\t\t\t\t\t\t\t\t\tvalue={ store.getComment() }\n\t\t\t\t\t\t\t\t\t\t\tonChange={(e) => store.setComment(e.target.value)}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td className=\"settings-modal__add-button-container\">\n\t\t\t\t\t\t\t\t\t\t<button className=\"settings-modal__add-button btn btn-primary\"\n\t\t\t\t\t\t\t\t\t\t\tdisabled={ store.isAddDisabled() }\n\t\t\t\t\t\t\t\t\t\t\tonClick={ () => store.addEntry() }\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\tAdd\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t\t<hr/>\n\t\t\t\t\t\t<table>\n\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<td className=\"settings-modal__label-max-messages\">\n\t\t\t\t\t\t\t\t\t\tMaximum number of captured messages\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td className=\"settings-modal__label-max-messages\">\n\t\t\t\t\t\t\t\t\t\t<input type=\"number\" className=\"form-control settings-modal__input-max-messages\"\n\t\t\t\t\t\t\t\t\t\t\tonChange={ (e) => store.setMessageQueueLimit(+e.target.value) }\n\t\t\t\t\t\t\t\t\t\t\tvalue={ store.getMessageQueueLimit() } />\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"modal-footer\">\n\t\t\t\t\t\t<label className=\"settings-modal__error-message\">{ store.getError() }</label>\n\t\t\t\t\t\t<button type=\"button\" className=\"settings-modal__cancel btn btn-default btn-default\"\n\t\t\t\t\t\t\tonClick={ onClose }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tCancel\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<button type=\"button\" className=\"settings-modal__save btn btn-default btn-success\"\n\t\t\t\t\t\t\tdisabled={ !store.isChanged() }\n\t\t\t\t\t\t\tonClick={() => { store.save(); onClose(); } }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tSave\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</Modal>\n\t);\n});\n\n\nexport default SettingsModal;","import { List, ListItem, Modal } from '@material-ui/core'\nimport NoCaptureStore from '../store/NoCaptureStore';\nimport { observer } from 'mobx-react-lite';\nimport { useState } from 'react';\n\ntype Props = {\n\topen: boolean,\n\tonClose: () => void,\n\tstore: NoCaptureStore,\n};\nconst NoCaptureModal = observer(({ open, onClose, store }: Props) => {\n\tconst [saveDisabled, setSaveDisabled] = useState(true);\n\n\tfunction close() {\n\t\tsetSaveDisabled(true);\n\t\tstore.init();\n\t\tonClose();\n\t}\n\n\tfunction onSave() {\n\t\tstore.save();\n\t\tclose();\n\t}\n\n\tfunction handleAddClient() {\n\t\tstore.extend();\n\t}\n\n\tfunction handleDeleteClient(i: number) {\n\t\tsetSaveDisabled(false);\n\t\tstore.deleteEntry(i);\n\t}\n\n\tfunction onChange(e: any, i: number) {\n\t\tsetSaveDisabled(false);\n\t\tstore.updateEntry(i, e.target.value);\n\t}\n\n\treturn (\n\t\t<Modal\n\t\t\tclassName=\"modal-window\"\n\t\t\topen={open}\n\t\t\tonClose={close}\n\t\t\taria-labelledby=\"simple-modal-title\"\n \t\taria-describedby=\"simple-modal-description\"\n\t\t>\n\t\t\t<div className=\"no-capture-modal\" role=\"dialog\">\n\t\t\t\t<div>\n\t\t\t\t\t<h3>Client No Capture List</h3>\n\t\t\t\t\t<div style={{ borderTop: 'solid steelblue', paddingTop: '.5rem' }}>\n\t\t\t\t\t\t<div className=\"no-capture-modal__scroll-container\">\n\t\t\t\t\t\t\t<div><strong>Do not capture messages from these clients.</strong></div>\n\t\t\t\t\t\t\t<div>(The list is stored in browser local storage.)</div>\n\t\t\t\t\t\t\t<div className=\"no-capture-modal__add-button fa fa-plus-circle\"\n\t\t\t\t\t\t\t\tonClick={handleAddClient}>\n\t\t\t\t\t\t\t\t&nbsp;Add client\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<List>\n\t\t\t\t\t\t\t\t{store.getClientList().map((clientHost, i) => (\n\t\t\t\t\t\t\t\t\t<ListItem key={i}\n\t\t\t\t\t\t\t\t\t\tstyle={{display: 'flex', alignItems: 'center'}}>\n\t\t\t\t\t\t\t\t\t\t<div className=\"no-capture-modal__remove fa fa-minus-circle\"\n\t\t\t\t\t\t\t\t\t\t\ttitle=\"Remove client\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => handleDeleteClient(i)}/>\n\t\t\t\t\t\t\t\t\t\t<input className=\"form-control\"\n\t\t\t\t\t\t\t\t\t\t\tplaceholder=\"Client host or IP (regex allowed)\"\n\t\t\t\t\t\t\t\t\t\t\tvalue={clientHost}\n\t\t\t\t\t\t\t\t\t\t\tonChange={(e) => onChange(e, i)}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</ListItem>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</List>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"modal-footer\">\n\t\t\t\t\t\t<button type=\"button\" className=\"settings-modal__cancel btn btn-default btn-default\"\n\t\t\t\t\t\t\tonClick={ close }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tCancel\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<button type=\"button\" className=\"settings-modal__cancel btn btn-default btn-success\"\n\t\t\t\t\t\t\tdisabled={saveDisabled}\n\t\t\t\t\t\t\tonClick={ onSave }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tSave\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</Modal>\n\t);\n});\n\nexport default NoCaptureModal;","import { List, ListItem, Modal } from '@material-ui/core'\nimport BreakpointStore from '../store/BreakpointStore';\nimport { observer } from 'mobx-react-lite';\nimport { useEffect } from 'react';\nimport FilterStore from '../store/FilterStore';\n\ntype Props = {\n\topen: boolean,\n\tonClose: () => void,\n\tstore: BreakpointStore,\n};\nconst BreakpointModal = observer(({ open, onClose, store }: Props) => {\n\tuseEffect(() => {\n\t\tstore.editing(open);\n\t})\n\n\tfunction close() {\n\t\tonClose();\n\t}\n\n\tfunction handleAddBreakpoint() {\n\t\tstore.extend();\n\t}\n\n\tfunction handleDeleteBreakpoint(i: number) {\n\t\tstore.deleteEntry(i);\n\t\tstore.changed();\n\t}\n\n\tfunction handleToggleEnable(breakpoint: FilterStore) {\n\t\tbreakpoint.toggleEnabled();\n\t\tstore.changed();\n\t}\n\n\tfunction handleValueChange(e: any, breakpoint: FilterStore) {\n\t\tbreakpoint.setFilter(e.currentTarget.value);\n\t\tstore.changed();\n\t}\n\n\tfunction handleMatchCase(breakpoint: FilterStore) {\n\t\tbreakpoint.toggleMatchCase();\n\t\tstore.changed();\n\t}\n\n\tfunction handleRegex(breakpoint: FilterStore) {\n\t\tbreakpoint.toggleRegex();\n\t\tstore.changed();\n\t}\n\n\tfunction handleLogical(breakpoint: FilterStore) {\n\t\tbreakpoint.toggleLogical();\n\t\tstore.changed();\n\t}\n\n\treturn (\n\t\t<Modal\n\t\t\tclassName=\"modal-window\"\n\t\t\topen={open}\n\t\t\tonClose={close}\n\t\t\taria-labelledby=\"simple-modal-title\"\n \t\t\taria-describedby=\"simple-modal-description\"\n\t\t>\n\t\t\t<div className=\"breakpoint-modal\" role=\"dialog\">\n\t\t\t\t<div>\n\t\t\t\t\t<h3>Breakpoint List</h3>\n\t\t\t\t\t<div style={{ borderTop: 'solid steelblue', paddingTop: '.5rem' }}>\n\t\t\t\t\t\t<div className=\"no-capture-modal__scroll-container\">\n\t\t\t\t\t\t\t<div>When a request/response matches a breakpoint, a snapshot is created\n\t\t\t\t\t\t\t\tand the breakpoint is disabled. The breakpoint only fires one time,\n\t\t\t\t\t\t\t\tand can be reenabled as needed.\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div>(The list is stored in browser local storage.)</div>\n\t\t\t\t\t\t\t<div className=\"no-capture-modal__add-button fa fa-plus-circle\"\n\t\t\t\t\t\t\t\tonClick={handleAddBreakpoint}>\n\t\t\t\t\t\t\t\t&nbsp;Add breakpoint\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<List>\n\t\t\t\t\t\t\t\t{store.getBreakpointList().map((breakpoint, i) => (\n\t\t\t\t\t\t\t\t\t<ListItem key={i}\n\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\tdisplay: 'flex', alignItems: 'center',\n\t\t\t\t\t\t\t\t\t\t}}>\n\t\t\t\t\t\t\t\t\t\t<div className=\"no-capture-modal__remove fa fa-minus-circle\"\n\t\t\t\t\t\t\t\t\t\t\ttitle=\"Remove breakpoint\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => handleDeleteBreakpoint(i)}/>\n\t\t\t\t\t\t\t\t\t\t<button className={`btn ${breakpoint.isEnabled() ? 'btn-primary' : 'btn-secondary'}`}\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => handleToggleEnable(breakpoint)}\n\t\t\t\t\t\t\t\t\t\t\ttitle={breakpoint.isEnabled() ? 'Disable breakpoint' : 'Enable breakpoint'}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{ breakpoint.isEnabled() ? 'Disable' : 'Enable' }\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\t\tdisplay: 'flex', alignItems: 'center',\n\t\t\t\t\t\t\t\t\t\t\t\twidth: '100%',\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<input className=\"form-control\"\n\t\t\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\t\t\tbackground: !breakpoint.isInvalidFilterSyntax()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: 'lightCoral'\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\tdisabled={breakpoint.isEnabled() ? false : true}\n\t\t\t\t\t\t\t\t\t\t\t\tplaceholder=\"Take snapshot when breakpoint expression matches any request/response\"\n\t\t\t\t\t\t\t\t\t\t\t\tvalue={breakpoint.getFilter()}\n\t\t\t\t\t\t\t\t\t\t\t\tonChange={(e) => handleValueChange(e, breakpoint)}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t<div className={`breakpoint__icon ${breakpoint.matchCase() ? 'active' : ''}`}\n\t\t\t\t\t\t\t\t\t\t\t\ttitle=\"Match case\" onClick={() => handleMatchCase(breakpoint)}>Aa</div>\n\t\t\t\t\t\t\t\t\t\t\t<div className={`breakpoint__icon ${breakpoint.regex() ? 'active' : ''}`}\n\t\t\t\t\t\t\t\t\t\t\t\ttitle=\"Use regular expression\" onClick={() => handleRegex(breakpoint)}>.*</div>\n\t\t\t\t\t\t\t\t\t\t\t<div className={`breakpoint__icon ${breakpoint.logical() ? 'active' : ''}`}\n\t\t\t\t\t\t\t\t\t\t\t\ttitle=\"Use (), &&, ||, !\" onClick={() => handleLogical(breakpoint)}>&&</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</ListItem>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</List>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"modal-footer\">\n\t\t\t\t\t\t<button type=\"button\" className=\"settings-modal__cancel btn btn-default btn-success\"\n\t\t\t\t\t\t\tonClick={ close }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tDone\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</Modal>\n\t);\n});\n\nexport default BreakpointModal;","import { Modal } from '@material-ui/core'\nimport MetricsStore from '../store/MetricsStore';\nimport { observer } from 'mobx-react-lite';\nimport pickIcon from '../PickIcon';\nimport { ConfigProtocols } from '../store/SettingsStore';\n\ntype Props = {\n\topen: boolean,\n\tonClose: () => void,\n\tstore: MetricsStore,\n};\nconst MetricsModal = observer(({ open, onClose, store }: Props) => {\n\n\treturn (\n\t\t<Modal\n\t\t\tclassName=\"modal-window\"\n\t\t\topen={open}\n\t\t\tonClose={onClose}\n\t\t\taria-labelledby=\"simple-modal-title\"\n \t\taria-describedby=\"simple-modal-description\"\n\t\t>\n\t\t\t<div className=\"metrics-modal\" role=\"dialog\">\n\t\t\t\t<div>\n\t\t\t\t\t<h3>Metrics</h3>\n\t\t\t\t\t<div style={{ borderTop: 'solid steelblue', paddingTop: '.5rem' }}>\n\t\t\t\t\t\t<div className=\"metrics-modal__scroll-container\">\n\t\t\t\t\t\t\t<table className=\"table settings-modal__table\">\n\t\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t<td className=\"text-primary\"><label>Protocol</label></td>\n\t\t\t\t\t\t\t\t\t\t<td className=\"text-primary\"><label>Request Count</label></td>\n\t\t\t\t\t\t\t\t\t\t<td className=\"text-primary\"><label>Response Count</label></td>\n\t\t\t\t\t\t\t\t\t\t<td className=\"text-primary\"><label>Total Time</label></td>\n\t\t\t\t\t\t\t\t\t\t<td className=\"text-primary\"><label>Average Time</label></td>\n\t\t\t\t\t\t\t\t\t\t<td className=\"text-primary\"><label>Maximum Time</label></td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t\t{store.getMetrics()\n\t\t\t\t\t\t\t\t\t\t.map((entry, i) => (\n\t\t\t\t\t\t\t\t\t\t\t<tr className=\"settings-modal__proxy-row\" key={i}>\n\t\t\t\t\t\t\t\t\t\t\t\t<td className=\"settings-modal__proxy-host-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div className={pickIcon( ConfigProtocols[i])}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span style={{ marginLeft: '.25rem' }}>{ ConfigProtocols[i]}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t<td className=\"settings-modal__proxy-host-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{entry.requestCount}\n\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t<td className=\"settings-modal__proxy-host-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{entry.responseCount}\n\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t<td className=\"settings-modal__proxy-host-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{entry.totalTime}\n\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t<td className=\"settings-modal__proxy-host-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{entry.requestCount > 0 ? (entry.totalTime / entry.requestCount).toFixed(1) : 0}\n\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t<td className=\"settings-modal__proxy-host-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{entry.maximumTime}\n\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"modal-footer\">\n\t\t\t\t\t\t<button type=\"button\" className=\"settings-modal__cancel btn btn-default btn-default\"\n\t\t\t\t\t\t\tonClick={ onClose }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tClose\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</Modal>\n\t);\n});\n\nexport default MetricsModal;","import { observer } from 'mobx-react-lite';\nimport React from 'react';\nimport { Dialog, DialogTitle } from '@material-ui/core';\n\ntype Props = {\n\topen: boolean,\n\tonClose: (fileName: string) => void,\n};\nconst ExportDialog = observer(({ open, onClose }: Props) => {\n\tconst [fileName, setFileName] = React.useState('');\n\n\tconst handleClose = () => {\n\t\tonClose(fileName);\n\t}\n\n\treturn (\n\t\t<Dialog onClose={handleClose} aria-labelledby=\"simple-dialog-title\" open={open}>\n \t\t<DialogTitle id=\"simple-dialog-title\">Enter export file name</DialogTitle>\n\t\t\t<input className={'export__input-file-name form-control'} value={fileName} onChange={(value) => setFileName(value.target.value)}/>\n\t\t\t<button className={'btn btn-success'}\n\t\t\t\tdisabled={fileName.length === 0}\n\t\t\t\tonClick={() => onClose(fileName)}\n\t\t\t>\n\t\t\t\tExport\n\t\t\t</button>\n\t\t</Dialog>\n\t);\n});\n\nexport default ExportDialog;","import React from 'react';\nimport FilterStore from '../store/FilterStore';\nimport SocketStore from '../store/SocketStore';\nimport {breakpointStore} from '../store/BreakpointStore';\nimport {noCaptureStore} from '../store/NoCaptureStore';\nimport { observer } from 'mobx-react-lite';\nimport ReachableHostsModal from './ReachableHostsModal';\nimport SettingsModal from './SettingsModal';\nimport NoCaptureModal from './NoCaptureModal';\nimport BreakpointModal from './BreakpointModal';\nimport { HostStatus, settingsStore } from '../store/SettingsStore';\nimport MessageQueueStore from '../store/MessageQueueStore';\nimport MetricsModal from './MetricsModal';\nimport { metricsStore } from '../store/MetricsStore';\nimport { useFilePicker } from \"use-file-picker\";\nimport { Menu, MenuItem } from '@material-ui/core';\nimport ExportDialog from './ExportDialog';\nimport SnapshotStore from '../store/SnapshotStore';\n\n/**\n * Header view\n */\ntype Props = {\n\tsocketStore: SocketStore,\n\tmessageQueueStore: MessageQueueStore,\n\tsnapshotStore: SnapshotStore,\n\tfilterStore: FilterStore\n};\nconst Header = observer(({ socketStore, messageQueueStore, snapshotStore, filterStore }: Props) : JSX.Element => {\n\tconst [showSettingsModal, setShowSettingsModal] = React.useState(false);\n\tconst [showNoCaptureModal, setShowNoCaptureModal] = React.useState(false);\n\tconst [showBreakpointModal, setShowBreakpointModal] = React.useState(false);\n\tconst [showReachableHostsModal, setShowReachableHostsModal] = React.useState(false);\n\tconst [showMetricsModal, setShowMetricsModal] = React.useState(false);\n\tconst [moreMenuIcon, setMoreMenuIcon] = React.useState<HTMLDivElement|null>(null);\n\tconst [settingsMenuIcon, setSettingsMenuIcon] = React.useState<HTMLDivElement|null>(null);\n\tconst [openExportDialog, setOpenExportDialog] = React.useState(false);\n\tconst [openFileSelector, {filesContent, clear}] = useFilePicker({\n\t\tmultiple: false,\n\t\taccept: \".proxyall\"\n\t });\n\n\tif (!!filesContent.length && filesContent[0].content) {\n\t\tsnapshotStore.importSnapshot(filesContent[0].name, filesContent[0].content);\n\t\tclear();\n\t}\n\n\tconst statusClassName = 'fa ' + (socketStore.isConnected()\n\t\t? 'success fa-circle' : 'error fa-exclamation-triangle');\n\treturn (\n\t\t<div className=\"header__container\">\n\t\t\t<div className=\"header__left-container\">\n\t\t\t\t<div className=\"header__icon\" onClick={ () => window.location.reload() }>\n\t\t\t\t\t<img src=\"favicon.ico\" alt=\"ProxyAll Debugging Tool\"\n\t\t\t\t\t\twidth=\"24\" height=\"24\" />\n\t\t\t\t</div>\n\t\t\t\t<div className=\"header__title\" onClick={() => window.location.reload()}>\n\t\t\t\t\tProxyAll\n\t\t\t\t</div>\n\t\t\t\t<div className={\"header__status \" + statusClassName} title=\"Status\"></div>\n\n\t\t\t\t<div style={{\n\t\t\t\t\topacity: snapshotStore.isActiveSnapshotSelected() ? undefined : 0.3,\n\t\t\t\t\tpointerEvents: snapshotStore.isActiveSnapshotSelected() ? undefined : 'none'\n\t\t\t\t\t}}>\n\t\t\t\t\t<div className=\"header__trash fa fa-trash-alt\" title=\"Clear log\"\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tmessageQueueStore.clear();\n\t\t\t\t\t\t\t// filterStore.setFilter('');\n\t\t\t\t\t\t\tsocketStore.clearMetrics();\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t\t<div className={'header__stop fas '\n\t\t\t\t\t\t+ (messageQueueStore.getStopped() ? 'fa-play' : 'fa-pause')}\n\t\t\t\t\t\tonClick={() => messageQueueStore.toggleStopped()}\n\t\t\t\t\t\ttitle={ (messageQueueStore.getStopped() ? 'Resume recording' : 'Pause recording') }\n\t\t\t\t\t/>\n\t\t\t\t\t<div className={'header__auto-scroll fa-arrow-alt-circle-down '\n\t\t\t\t\t\t+ (messageQueueStore.getAutoScroll() ? 'fas' : 'far')}\n\t\t\t\t\t\tonClick={() => messageQueueStore.toggleAutoScroll()}\n\t\t\t\t\t\ttitle={ (messageQueueStore.getAutoScroll() ? 'Stop auto scroll' : 'Start auto scroll') }\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\n\t\t\t\t<div className={'header__show-errors fa-bug fa '\n\t\t\t\t\t\t+ (filterStore.getShowErrors() ? 'active' : '')}\n\t\t\t\t\t\tonClick={() => filterStore.toggleShowErrors()}\n\t\t\t\t\t\ttitle={ 'Toggle show only errors' }\n\t\t\t\t\t/>\n\n\t\t\t\t<div className={'header__more-menu fa fa-ellipsis-v'}\n\t\t\t\t\tonClick={(e) => setMoreMenuIcon(e.currentTarget)}\n\t\t\t\t/>\n\t\t\t\t<Menu\n\t\t\t\t\tanchorEl={moreMenuIcon}\n\t\t\t\t\topen={Boolean(moreMenuIcon)}\n\t\t\t\t\tonClose={() => setMoreMenuIcon(null)}\n\t\t\t\t\t>\n\t\t\t\t\t<MenuItem\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\topacity: snapshotStore.getSnapshotCount() > 1 ? undefined : 0.3,\n\t\t\t\t\t\t\tpointerEvents: snapshotStore.getSnapshotCount() > 1 ? undefined : 'none'\n\t\t\t\t\t\t}}>\n\t\t\t\t\t\t<div className=\"header__folder-minus fa fa-folder-minus\" title=\"Delete all snapshots\"\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tsnapshotStore.deleteAllSnapshots();\n\t\t\t\t\t\t\t\tsetMoreMenuIcon(null);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t&nbsp;Delete Snapshots\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</MenuItem>\n\t\t\t\t\t<MenuItem style={{\n\t\t\t\t\t\t\topacity: !snapshotStore.isActiveSnapshotSelected() || messageQueueStore.getStopped()\n\t\t\t\t\t\t\t\t? undefined : 0.3,\n\t\t\t\t\t\t\tpointerEvents: !snapshotStore.isActiveSnapshotSelected() || messageQueueStore.getStopped()\n\t\t\t\t\t\t\t\t? undefined : 'none'\n\t\t\t\t\t\t\t}}>\n\t\t\t\t\t\t<div className=\"header__export fa fa-download\" title=\"Export snapshot file\"\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tsetOpenExportDialog(true);\n\t\t\t\t\t\t\t\tsetMoreMenuIcon(null);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t&nbsp;Export Snapshot\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</MenuItem>\n\t\t\t\t\t<MenuItem>\n\t\t\t\t\t\t<div className=\"header__import fa fa-upload\" title=\"Import snapshot file\"\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\topenFileSelector();\n\t\t\t\t\t\t\t\tsetMoreMenuIcon(null);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t&nbsp;Import Snapshot\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</MenuItem>\n\t\t\t\t</Menu>\n\n\t\t\t\t<div className=\"header__filter\">\n\t\t\t\t\t<input className=\"header__filter-input\" type=\"text\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tbackground: !filterStore.isInvalidFilterSyntax()\n\t\t\t\t\t\t\t\t? (filterStore.getFilter().length > 0 ? 'lightGreen' : undefined)\n\t\t\t\t\t\t\t\t: 'lightCoral'\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tvalue={ filterStore.getFilter() }\n\t\t\t\t\t\tonChange={e => filterStore.setFilter(e.currentTarget.value)}\n\t\t\t\t\t\tplaceholder=\"Boolean/Regex Filter: (a || b.*) && !c\" />\n\t\t\t\t</div>\n\t\t\t\t<div className={`header__filter-case ${filterStore.matchCase() ? 'active' : ''}`}\n\t\t\t\t\ttitle=\"Match case\" onClick={() => filterStore.toggleMatchCase()}>Aa</div>\n\t\t\t\t<div className={`header__filter-regex ${filterStore.regex() ? 'active' : ''}`}\n\t\t\t\t\ttitle=\"Use regular expression\" onClick={() => filterStore.toggleRegex()}>.*</div>\n\t\t\t\t<div className={`header__filter-logical ${filterStore.logical() ? 'active' : ''}`}\n\t\t\t\t\ttitle=\"Use (), &&, ||, !\" onClick={() => filterStore.toggleLogical()}>&&</div>\n\t\t\t\t<div className={`header__filter-logical ${filterStore.deleteFiltered() ? 'active' : ''}`}\n\t\t\t\t\ttitle=\"Delete filtered messages\" onClick={() => filterStore.toggleDeleteFiltered()}>X</div>\n\t\t\t</div>\n\t\t\t<div>\n\t\t\t\t<div className=\"header__count\" title=\"Received messages\">\n\t\t\t\t\t<div>Requests/Responses: {socketStore.getRequestCount()+'/'+socketStore.getResponseCount()}</div>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"header__count\" title=\"Messages queued at server\">\n\t\t\t\t\t<div>Queued: {socketStore.getQueuedCount() }</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div>\n\t\t\t\t<div className=\"header__settings fa fa-chart-bar\" title=\"Metrics\"\n\t\t\t\t\tonClick={() => { setShowMetricsModal(true); } }>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"header__settings fa fa-network-wired\" title=\"Reachable Hosts\"\n\t\t\t\t\tonClick={() => { setShowReachableHostsModal(true); settingsStore.setConfig(); } }>\n\t\t\t\t</div>\n\t\t\t\t<div className={'header__settings fa fa-cog'} title=\"Settings\"\n\t\t\t\t\tonClick={(e) => setSettingsMenuIcon(e.currentTarget)}\n\t\t\t\t/>\n\t\t\t\t<Menu\n\t\t\t\t\tanchorEl={settingsMenuIcon}\n\t\t\t\t\topen={Boolean(settingsMenuIcon)}\n\t\t\t\t\tonClose={() => setSettingsMenuIcon(null)}\n\t\t\t\t\t>\n\t\t\t\t\t<MenuItem>\n\t\t\t\t\t\t<div className=\"fa fa-network-wired\"\n\t\t\t\t\t\t\tonClick={() => {setShowSettingsModal(true);\tsettingsStore.reset(); setSettingsMenuIcon(null);}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t&nbsp;Proxy Configuration\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</MenuItem>\n\t\t\t\t\t<MenuItem>\n\t\t\t\t\t\t<div className=\"fa fa-bug\" title=\"Breakpoints\"\n\t\t\t\t\t\t\tonClick={() => { setShowBreakpointModal(true); breakpointStore.init(); setSettingsMenuIcon(null); } }>\n\t\t\t\t\t\t\t\t&nbsp;Breakpoints\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</MenuItem>\n\t\t\t\t\t<MenuItem>\n\t\t\t\t\t\t<div className=\"fa fa-ban\" title=\"No Capture List\"\n\t\t\t\t\t\t\tonClick={() => { setShowNoCaptureModal(true); noCaptureStore.init(); setSettingsMenuIcon(null); } }>\n\t\t\t\t\t\t\t\t&nbsp;No Capture List\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</MenuItem>\n\t\t\t\t</Menu>\n\t\t\t</div>\n\n\t\t\t{/*\n\t\t\t\tModals\n\t\t\t*/}\n\t\t\t<MetricsModal\n\t\t\t\topen={showMetricsModal}\n\t\t\t\tonClose={() => setShowMetricsModal(false)}\n\t\t\t\tstore={metricsStore}\n\t\t\t/>\n\t\t\t<ReachableHostsModal\n\t\t\t\topen={showReachableHostsModal}\n\t\t\t\tonClose={() => setShowReachableHostsModal(false)}\n\t\t\t\tstore={settingsStore}\n\t\t\t\tinitTabValue={ HostStatus.Reachable }\n\t\t\t/>\n\t\t\t<SettingsModal\n\t\t\t\topen={showSettingsModal}\n\t\t\t\tonClose={() => setShowSettingsModal(false)}\n\t\t\t\tstore={ settingsStore }\n\t\t\t/>\n\t\t\t<BreakpointModal\n\t\t\t\topen={showBreakpointModal}\n\t\t\t\tonClose={() => setShowBreakpointModal(false)}\n\t\t\t\tstore={ breakpointStore }\n\t\t\t/>\n\t\t\t<NoCaptureModal\n\t\t\t\topen={showNoCaptureModal}\n\t\t\t\tonClose={() => setShowNoCaptureModal(false)}\n\t\t\t\tstore={ noCaptureStore }\n\t\t\t/>\n\t\t\t<ExportDialog\n\t\t\t\topen={openExportDialog}\n\t\t\t\tonClose={(fileName) => {\n\t\t\t\t\tsetOpenExportDialog(false);\n\t\t\t\t\tsnapshotStore.exportSelectedSnapshot(fileName);\n\t\t\t\t}}\n\t\t\t/>\n\t\t</div>\n\t)\n});\n\nexport default Header;","import './App.css';\nimport '@fortawesome/fontawesome-free/css/all.css';\nimport 'bootstrap-css-only/css/bootstrap.css';\nimport Snapshots from './components/SnapshotTabs';\nimport Header from './components/Header';\nimport { filterStore } from './store/FilterStore';\nimport { socketStore } from './store/SocketStore';\nimport { messageQueueStore } from './store/MessageQueueStore';\nimport { snapshotStore } from './store/SnapshotStore';\n\nfunction App() {\n return (\n <div className=\"App\">\n <Header\n socketStore={socketStore}\n filterStore={filterStore}\n messageQueueStore={messageQueueStore}\n snapshotStore={snapshotStore}\n />\n <Snapshots\n messageQueueStore={ messageQueueStore }\n snapshotStore={ snapshotStore }\n />\n </div>\n );\n}\n\nexport default App;\n","import { ReportHandler } from 'web-vitals';\n\nconst reportWebVitals = (onPerfEntry?: ReportHandler) => {\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 './index.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","import { makeAutoObservable, action } from \"mobx\"\nimport MessageStore from './MessageStore';\nimport _ from 'lodash';\n\nexport default class FilterStore {\n private enabled = true;\n private filter = '';\n private invalidFilterSyntax = false;\n private searchFilter = '';\n private boolString = '';\n private boolOperands: string[] = [];\n private resetScroll = false;\n private _matchCase = false;\n private _regex = false;\n private _logical = false;\n private _deleteFiltered = false;\n private showErrors = false;\n\n public constructor() {\n\t\tmakeAutoObservable(this);\n }\n\n public isEnabled() {\n return this.enabled;\n }\n\n @action toggleEnabled() {\n this.enabled = !this.enabled;\n }\n\n @action setEnabled(enabled: boolean) {\n this.enabled = enabled;\n }\n\n public shouldResetScroll() {\n return this.resetScroll;\n }\n\n @action public setResetScroll(value: boolean) {\n this.resetScroll = value;\n }\n\n public matchCase(): boolean {\n return this._matchCase;\n }\n\n @action public toggleMatchCase() {\n this._matchCase = !this._matchCase;\n }\n\n @action public setMatchCase(matchCase: boolean) {\n this._matchCase = matchCase;\n }\n\n public regex(): boolean {\n return this._regex;\n }\n\n @action public toggleRegex() {\n this._regex = !this._regex;\n }\n\n @action public setRegex(regex: boolean) {\n this._regex = regex;\n }\n\n public logical(): boolean {\n return this._logical;\n }\n\n @action public toggleLogical() {\n this._logical = !this._logical;\n }\n\n @action public setLogical(logical: boolean) {\n this._logical = logical;\n }\n\n public deleteFiltered(): boolean {\n return this._deleteFiltered;\n }\n\n @action public toggleDeleteFiltered() {\n this._deleteFiltered = !this._deleteFiltered;\n }\n\n public getShowErrors(): boolean {\n return this.showErrors;\n }\n\n @action public toggleShowErrors() {\n this.showErrors = !this.showErrors;\n if (!this.showErrors && this.filter.length === 0) {\n this.resetScroll = true;\n }\n }\n\n @action public setFilterNoDebounce(filter: string) {\n if (this.filter.length > 0 && filter.length === 0 && !this.showErrors) {\n this.resetScroll = true;\n }\n\n this.filter = filter;\n this.searchFilter = this.filter;\n this.updateBoolString();\n }\n\n @action public setFilter(filter: string) {\n if (this.filter.length > 0 && filter.length === 0) {\n this.resetScroll = true;\n }\n\n this.filter = filter;\n\n const debounce = _.debounce(() => {\n this.searchFilter = this.filter;\n this.updateBoolString();\n }, 500);\n\n debounce();\n }\n\n public isInvalidFilterSyntax(): boolean {\n this.invalidFilterSyntax = false;\n if (this._logical && this.boolString.length > 0) {\n let boolString = this.boolString;\n for (let i = 0; i < this.boolOperands.length; ++i) {\n boolString = boolString.replace('###'+i, 'true');\n }\n //console.log(boolString);\n try {\n // eslint-disable-next-line no-eval\n eval(boolString);\n return false;\n } catch (e) {\n this.invalidFilterSyntax = true;\n return true;\n }\n }\n return this.invalidFilterSyntax;\n }\n\n private updateBoolString() {\n this.boolString = '';\n this.boolOperands.splice(0, this.boolOperands.length);\n let argNum = 0;\n if (this.filter.includes('!')\n || this.filter.includes('&&')\n || this.filter.includes('||')) {\n let operand = '';\n for (let i = 0; i < this.filter.length; ++i) {\n let c1 = this.filter.substr(i, 1);\n let c2 = i < this.filter.length - 1 ? this.filter.substr(i + 1, 1) : '';\n let nonOperand = '';\n if (c1 === '!' || c1 === '(' || c1 === ')') nonOperand = c1;\n if (c1 === '&' && c2 === '&') {\n ++i;\n nonOperand = '&&';\n }\n if (c1 === '|' && c2 === '|') {\n ++i;\n nonOperand = '||';\n }\n if (nonOperand.length > 0) {\n operand = operand.trim();\n if (operand.length > 0) {\n this.boolString += '###' + argNum++;\n this.boolOperands.push(operand);\n operand = '';\n }\n this.boolString += nonOperand;\n }\n else {\n operand += c1;\n }\n }\n\n if (operand.length > 0) {\n this.boolString += '###' + argNum++;\n this.boolOperands.push(operand.trim());\n }\n }\n }\n\n public getFilter() {\n return this.filter;\n }\n\n public isFiltered(messageStore: MessageStore) {\n if (this.showErrors && !messageStore.isError()) return true;\n\n this.invalidFilterSyntax = false;\n if (this.searchFilter.length === 0) return false;\n if (this._logical && this.boolString.length > 0) {\n let boolString = this.boolString;\n for (let i = 0; i < this.boolOperands.length; ++i) {\n const filtered = this.isMessageFiltered(this.boolOperands[i], messageStore);\n boolString = boolString.replace('###'+i, (filtered ? 'false' : 'true'));\n }\n //console.log(boolString);\n try {\n // eslint-disable-next-line no-eval\n return !eval(boolString);\n } catch (e) {\n this.invalidFilterSyntax = true;\n return true;\n }\n }\n else {\n return this.isMessageFiltered(this.searchFilter, messageStore);\n }\n }\n\n private isMessageFiltered(needle: string, messageStore: MessageStore) {\n const message = messageStore.getMessage();\n if (message.proxyConfig && this.isMatch(needle, message.proxyConfig.protocol)) return false;\n if (this.isMatch(needle, message.protocol)) return false;\n if (this.isMatch(needle,\n message.status + ' ' + message.method\n + ' '\n + message.clientIp!+'->'+message.serverHost\n + ' '\n + messageStore.getUrl())) return false;\n if (this.isMatch(needle, message.endpoint)) return false;\n if (this.isMatch(needle, JSON.stringify(message.requestHeaders))) return false;\n if (this.isMatch(needle, JSON.stringify(message.responseHeaders))) return false;\n if(this.isMatch(needle, messageStore.getRequestBody())) return false;\n if (message.responseBody && this.isMatch(needle, JSON.stringify(message.responseBody))) return false;\n \treturn true;\n }\n\n\tprivate isMatch(needle: string, haystack: string | undefined) {\n if (haystack === undefined) return false;\n if(!this._matchCase) {\n needle = needle.toLowerCase();\n haystack = haystack.toLowerCase();\n }\n\n if(this._regex) {\n return haystack.search(needle) !== -1;\n }\n else {\n return haystack.indexOf(needle) !== -1;\n }\n }\n}\n\nexport const filterStore = new FilterStore();"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ !function(e){function t(t){for(var n,i,a=t[0],c=t[1],l=t[2],s=0,p=[];s<a.length;s++)i=a[s],Object.prototype.hasOwnProperty.call(o,i)&&o[i]&&p.push(o[i][0]),o[i]=0;for(n in c)Object.prototype.hasOwnProperty.call(c,n)&&(e[n]=c[n]);for(f&&f(t);p.length;)p.shift()();return u.push.apply(u,l||[]),r()}function r(){for(var e,t=0;t<u.length;t++){for(var r=u[t],n=!0,a=1;a<r.length;a++){var c=r[a];0!==o[c]&&(n=!1)}n&&(u.splice(t--,1),e=i(i.s=r[0]))}return e}var n={},o={1:0},u=[];function i(t){if(n[t])return n[t].exports;var r=n[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,i),r.l=!0,r.exports}i.e=function(e){var t=[],r=o[e];if(0!==r)if(r)t.push(r[2]);else{var n=new Promise((function(t,n){r=o[e]=[t,n]}));t.push(r[2]=n);var u,a=document.createElement("script");a.charset="utf-8",a.timeout=120,i.nc&&a.setAttribute("nonce",i.nc),a.src=function(e){return i.p+"static/js/"+({}[e]||e)+"."+{3:"7073b0d8"}[e]+".chunk.js"}(e);var c=new Error;u=function(t){a.onerror=a.onload=null,clearTimeout(l);var r=o[e];if(0!==r){if(r){var n=t&&("load"===t.type?"missing":t.type),u=t&&t.target&&t.target.src;c.message="Loading chunk "+e+" failed.\n("+n+": "+u+")",c.name="ChunkLoadError",c.type=n,c.request=u,r[1](c)}o[e]=void 0}};var l=setTimeout((function(){u({type:"timeout",target:a})}),12e4);a.onerror=a.onload=u,document.head.appendChild(a)}return Promise.all(t)},i.m=e,i.c=n,i.d=function(e,t,r){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},i.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(i.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)i.d(r,n,function(t){return e[t]}.bind(null,n));return r},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="/",i.oe=function(e){throw console.error(e),e};var a=this.webpackJsonpclient=this.webpackJsonpclient||[],c=a.push.bind(a);a.push=t,a=a.slice();for(var l=0;l<a.length;l++)t(a[l]);var f=c;r()}([]);
2
+ //# sourceMappingURL=runtime-main.00264969.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../webpack/bootstrap"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","exports","module","l","e","promises","installedChunkData","promise","Promise","resolve","reject","onScriptComplete","script","document","createElement","charset","timeout","nc","setAttribute","src","p","jsonpScriptSrc","error","Error","event","onerror","onload","clearTimeout","chunk","errorType","type","realSrc","target","message","name","request","undefined","setTimeout","head","appendChild","all","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","err","console","jsonpArray","this","oldJsonpFunction","slice"],"mappings":"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","file":"static/js/runtime-main.00264969.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t1: 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"static/js/\" + ({}[chunkId]||chunkId) + \".\" + {\"3\":\"7073b0d8\"}[chunkId] + \".chunk.js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\tvar script = document.createElement('script');\n \t\t\t\tvar onScriptComplete;\n\n \t\t\t\tscript.charset = 'utf-8';\n \t\t\t\tscript.timeout = 120;\n \t\t\t\tif (__webpack_require__.nc) {\n \t\t\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t\t\t}\n \t\t\t\tscript.src = jsonpScriptSrc(chunkId);\n\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tonScriptComplete = function (event) {\n \t\t\t\t\t// avoid mem leaks in IE.\n \t\t\t\t\tscript.onerror = script.onload = null;\n \t\t\t\t\tclearTimeout(timeout);\n \t\t\t\t\tvar chunk = installedChunks[chunkId];\n \t\t\t\t\tif(chunk !== 0) {\n \t\t\t\t\t\tif(chunk) {\n \t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n \t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n \t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n \t\t\t\t\t\t\terror.type = errorType;\n \t\t\t\t\t\t\terror.request = realSrc;\n \t\t\t\t\t\t\tchunk[1](error);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t\t\t}\n \t\t\t\t};\n \t\t\t\tvar timeout = setTimeout(function(){\n \t\t\t\t\tonScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t}, 120000);\n \t\t\t\tscript.onerror = script.onload = onScriptComplete;\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = this[\"webpackJsonpclient\"] = this[\"webpackJsonpclient\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// run deferred modules from other chunks\n \tcheckDeferredModules();\n"],"sourceRoot":""}