diff --git a/ui-common/package.json b/ui-common/package.json index 0fdc6992d..16d3479f4 100644 --- a/ui-common/package.json +++ b/ui-common/package.json @@ -1,6 +1,6 @@ { "name": "@up9/mizu-common", - "version": "1.0.130", + "version": "1.0.131", "description": "Made with create-react-library", "author": "", "license": "MIT", diff --git a/ui-common/src/components/TrafficViewer/EntriesList.tsx b/ui-common/src/components/TrafficViewer/EntriesList.tsx index 8fd2e31dd..c7c8e9e86 100644 --- a/ui-common/src/components/TrafficViewer/EntriesList.tsx +++ b/ui-common/src/components/TrafficViewer/EntriesList.tsx @@ -5,10 +5,8 @@ import Moment from 'moment'; import {EntryItem} from "./EntryListItem/EntryListItem"; import down from "assets/downImg.svg"; import spinner from 'assets/spinner.svg'; - import {RecoilState, useRecoilState, useRecoilValue} from "recoil"; import entriesAtom from "../../recoil/entries"; -import wsConnectionAtom, {WsConnectionStatus} from "../../recoil/wsConnection"; import queryAtom from "../../recoil/query"; import TrafficViewerApiAtom from "../../recoil/TrafficViewerApi"; import TrafficViewerApi from "./TrafficViewerApi"; @@ -32,14 +30,15 @@ interface EntriesListProps { truncatedTimestamp: number; setTruncatedTimestamp: any; scrollableRef: any; + ws: any; } -export const EntriesList: React.FC = ({listEntryREF, onSnapBrokenEvent, isSnappedToBottom, setIsSnappedToBottom, queriedCurrent, setQueriedCurrent, queriedTotal, setQueriedTotal, startTime, noMoreDataTop, setNoMoreDataTop, leftOffTop, setLeftOffTop, openWebSocket, leftOffBottom, truncatedTimestamp, setTruncatedTimestamp, scrollableRef}) => { +export const EntriesList: React.FC = ({listEntryREF, onSnapBrokenEvent, isSnappedToBottom, setIsSnappedToBottom, queriedCurrent, setQueriedCurrent, queriedTotal, setQueriedTotal, startTime, noMoreDataTop, setNoMoreDataTop, leftOffTop, setLeftOffTop, openWebSocket, leftOffBottom, truncatedTimestamp, setTruncatedTimestamp, scrollableRef, ws}) => { const [entries, setEntries] = useRecoilState(entriesAtom); - const wsConnection = useRecoilValue(wsConnectionAtom); const query = useRecoilValue(queryAtom); - const isWsConnectionClosed = wsConnection === WsConnectionStatus.Closed; + const isWsConnectionClosed = ws?.current?.readyState !== WebSocket.OPEN; + const trafficViewerApi = useRecoilValue(TrafficViewerApiAtom as RecoilState) const [loadMoreTop, setLoadMoreTop] = useState(false); diff --git a/ui-common/src/components/TrafficViewer/TrafficViewer.tsx b/ui-common/src/components/TrafficViewer/TrafficViewer.tsx index 7ca097e36..0659f818b 100644 --- a/ui-common/src/components/TrafficViewer/TrafficViewer.tsx +++ b/ui-common/src/components/TrafficViewer/TrafficViewer.tsx @@ -1,4 +1,4 @@ -import React, { useCallback, useEffect, useMemo, useRef, useState } from "react"; +import React, { useEffect, useMemo, useRef, useState } from "react"; import { Filters } from "./Filters"; import { EntriesList } from "./EntriesList"; import { makeStyles } from "@material-ui/core"; @@ -14,7 +14,6 @@ import debounce from 'lodash/debounce'; import { RecoilRoot, RecoilState, useRecoilState, useRecoilValue, useSetRecoilState } from "recoil"; import entriesAtom from "../../recoil/entries"; import focusedEntryIdAtom from "../../recoil/focusedEntryId"; -import websocketConnectionAtom, { WsConnectionStatus } from "../../recoil/wsConnection"; import queryAtom from "../../recoil/query"; import { TLSWarning } from "../TLSWarning/TLSWarning"; import trafficViewerApiAtom from "../../recoil/TrafficViewerApi" @@ -60,12 +59,12 @@ export const TrafficViewer : React.FC = ({setAnalyzeStatus, const [entries, setEntries] = useRecoilState(entriesAtom); const [focusedEntryId, setFocusedEntryId] = useRecoilState(focusedEntryIdAtom); - const [wsConnection, setWsConnection] = useRecoilState(websocketConnectionAtom); const query = useRecoilValue(queryAtom); const setTrafficViewerApiState = useSetRecoilState(trafficViewerApiAtom as RecoilState) const [tappingStatus, setTappingStatus] = useRecoilState(tappingStatusAtom); const [noMoreDataTop, setNoMoreDataTop] = useState(false); const [isSnappedToBottom, setIsSnappedToBottom] = useState(true); + const [forceRender, setForceRender] = useState(0); const [queryBackgroundColor, setQueryBackgroundColor] = useState("#f5f5f5"); @@ -121,22 +120,26 @@ export const TrafficViewer : React.FC = ({setAnalyzeStatus, setLeftOffTop(null); setNoMoreDataTop(false); } - ws.current = new WebSocket(webSocketUrl); - ws.current.onopen = () => { - setWsConnection(WsConnectionStatus.Connected); + try { + ws.current = new WebSocket(webSocketUrl); sendQueryWhenWsOpen(query); - } - ws.current.onclose = () => { - setWsConnection(WsConnectionStatus.Closed); - } - ws.current.onerror = (event) => { - console.error("WebSocket error:", event); - if (query) { - openWebSocket(`(${query}) and leftOff(${leftOffBottom})`, false); - } else { - openWebSocket(`leftOff(${leftOffBottom})`, false); + + ws.current.onclose = () => { + if(window.location.pathname === "/") + setForceRender(forceRender + 1); } - } + ws.current.onerror = (event) => { + console.error("WebSocket error:", event); + if (ws?.current?.readyState === WebSocket.OPEN) { + ws.current.close(); + } + if (query) { + openWebSocket(`(${query}) and leftOff(${leftOffBottom})`, false); + } else { + openWebSocket(`leftOff(${leftOffBottom})`, false); + } + } + } catch (e) {} } const sendQueryWhenWsOpen = (query) => { @@ -150,7 +153,9 @@ export const TrafficViewer : React.FC = ({setAnalyzeStatus, } const closeWebSocket = () => { - ws.current && ws.current.close() + if(ws?.current?.readyState === WebSocket.OPEN) { + ws.current.close(); + } } if (ws.current) { @@ -229,8 +234,9 @@ export const TrafficViewer : React.FC = ({setAnalyzeStatus, }, []); const toggleConnection = () => { - ws.current.close(); - if (wsConnection !== WsConnectionStatus.Connected) { + if(ws?.current?.readyState === WebSocket.OPEN) { + ws?.current?.close(); + } else { if (query) { openWebSocket(`(${query}) and leftOff(-1)`, true); } else { @@ -241,6 +247,12 @@ export const TrafficViewer : React.FC = ({setAnalyzeStatus, } } + useEffect(() => { + return () => { + ws.current.close(); + }; + }, []); + const onTLSDetected = (destAddress: string) => { addressesWithTLS.add(destAddress); setAddressesWithTLS(new Set(addressesWithTLS)); @@ -251,8 +263,8 @@ export const TrafficViewer : React.FC = ({setAnalyzeStatus, }; const getConnectionIndicator = () => { - switch (wsConnection) { - case WsConnectionStatus.Connected: + switch (ws?.current?.readyState) { + case WebSocket.OPEN: return
@@ -264,8 +276,8 @@ export const TrafficViewer : React.FC = ({setAnalyzeStatus, } const getConnectionTitle = () => { - switch (wsConnection) { - case WsConnectionStatus.Connected: + switch (ws?.current?.readyState) { + case WebSocket.OPEN: return "streaming live traffic" default: return "streaming paused"; @@ -274,7 +286,7 @@ export const TrafficViewer : React.FC = ({setAnalyzeStatus, const onSnapBrokenEvent = () => { setIsSnappedToBottom(false); - if (wsConnection === WsConnectionStatus.Connected) { + if (ws?.current?.readyState === WebSocket.OPEN) { ws.current.close(); } } @@ -284,9 +296,9 @@ export const TrafficViewer : React.FC = ({setAnalyzeStatus, {tappingStatus && isShowStatusBar && }
- pause - play
{getConnectionTitle()} @@ -322,6 +334,7 @@ export const TrafficViewer : React.FC = ({setAnalyzeStatus, truncatedTimestamp={truncatedTimestamp} setTruncatedTimestamp={setTruncatedTimestamp} scrollableRef={scrollableRef} + ws={ws} />
diff --git a/ui-common/src/recoil/wsConnection/atom.ts b/ui-common/src/recoil/wsConnection/atom.ts deleted file mode 100644 index e3de12558..000000000 --- a/ui-common/src/recoil/wsConnection/atom.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { atom } from "recoil"; - -const wsConnectionAtom = atom({ - key: "wsConnectionAtom", - default: 0 -}); - -export default wsConnectionAtom; diff --git a/ui-common/src/recoil/wsConnection/index.ts b/ui-common/src/recoil/wsConnection/index.ts deleted file mode 100644 index d74f11fb9..000000000 --- a/ui-common/src/recoil/wsConnection/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -import atom from "./atom"; - -enum WsConnectionStatus { - Closed, - Connected, -} - -export {WsConnectionStatus}; - -export default atom diff --git a/ui/package.json b/ui/package.json index 631eec0c3..ccbd23c3a 100644 --- a/ui/package.json +++ b/ui/package.json @@ -13,7 +13,7 @@ "@types/jest": "^26.0.22", "@types/node": "^12.20.10", "@uiw/react-textarea-code-editor": "^1.4.12", - "@up9/mizu-common": "^1.0.130", + "@up9/mizu-common": "1.0.131", "axios": "^0.25.0", "core-js": "^3.20.2", "craco-babel-loader": "^1.0.3",