diff options
Diffstat (limited to 'src/hooks')
| -rw-r--r-- | src/hooks/useRequests.tsx | 69 |
1 files changed, 58 insertions, 11 deletions
diff --git a/src/hooks/useRequests.tsx b/src/hooks/useRequests.tsx index 3ad5cc7..2b8393e 100644 --- a/src/hooks/useRequests.tsx +++ b/src/hooks/useRequests.tsx | |||
| @@ -33,25 +33,67 @@ interface Response { | |||
| 33 | payload: ResponsePayload, | 33 | payload: ResponsePayload, |
| 34 | } | 34 | } |
| 35 | 35 | ||
| 36 | interface Historic { | ||
| 37 | type: 'historic' | ||
| 38 | payload: (Request | Response)[] | ||
| 39 | } | ||
| 40 | |||
| 36 | export interface RequestResponse { | 41 | export interface RequestResponse { |
| 37 | request: RequestPayload | 42 | request: RequestPayload |
| 38 | response?: ResponsePayload | 43 | response?: ResponsePayload |
| 39 | } | 44 | } |
| 40 | 45 | ||
| 41 | export default function useRequests(): RequestResponse[] { | 46 | export enum ReadyState { |
| 47 | CONNECTING = 0, | ||
| 48 | OPEN = 1, | ||
| 49 | CLOSING = 2, | ||
| 50 | CLOSED = 3, | ||
| 51 | } | ||
| 52 | |||
| 53 | export interface useRequestsProps { | ||
| 54 | onConnect: () => Promise<void> | ||
| 55 | } | ||
| 56 | |||
| 57 | export interface UseRequests { | ||
| 58 | calls: RequestResponse[] | ||
| 59 | readyState: ReadyState | ||
| 60 | } | ||
| 61 | |||
| 62 | export default function useRequests({ onConnect }: useRequestsProps): UseRequests { | ||
| 42 | const wsHost = useMemo(getHost, []); | 63 | const wsHost = useMemo(getHost, []); |
| 43 | const connect = useCallback(() => new WebSocket(`ws://${wsHost}/inspect/`), [wsHost]) | ||
| 44 | 64 | ||
| 45 | const [requests, setRequests] = useState<RequestPayload[]>([]); | 65 | const [requests, setRequests] = useState<RequestPayload[]>([]); |
| 46 | const [responses, setResponses] = useState<ResponsePayload[]>([]); | 66 | const [responses, setResponses] = useState<ResponsePayload[]>([]); |
| 47 | const [ws, setWs] = useState(() => connect()); | 67 | |
| 68 | |||
| 69 | const connect = useCallback(() => ( | ||
| 70 | new WebSocket(`ws://${wsHost}/inspect/`) | ||
| 71 | ), [wsHost]); | ||
| 72 | |||
| 73 | const [ws, setWs] = useState<WebSocket>(() => connect()); | ||
| 74 | const [readyState, setReadyState] = useState<ReadyState>(ws.readyState); | ||
| 48 | 75 | ||
| 49 | useEffect(() => { | 76 | useEffect(() => { |
| 50 | const reconnect = () => setWs(() => connect()) | 77 | setReadyState(ws.readyState); |
| 78 | |||
| 79 | const onClose = () => { | ||
| 80 | setReadyState(ws.readyState); | ||
| 81 | setWs(connect()); | ||
| 82 | } | ||
| 83 | const onOpen = () => { | ||
| 84 | onConnect(); | ||
| 85 | setReadyState(ws.readyState); | ||
| 86 | } | ||
| 51 | const onMessage = ({ data }) => { | 87 | const onMessage = ({ data }) => { |
| 52 | const { type, payload } = JSON.parse(data) as Request | Response | 88 | const { type, payload } = JSON.parse(data) as Historic | Request | Response |
| 53 | 89 | ||
| 54 | switch (type) { | 90 | switch (type) { |
| 91 | case 'historic': | ||
| 92 | const requests = (payload as (Request | Response)[]).filter(({ type }) => type === 'request'); | ||
| 93 | const responses = (payload as (Request | Response)[]).filter(({ type }) => type === 'response'); | ||
| 94 | setRequests((rqs) => [...rqs, ...requests.map(({ payload }) => payload as RequestPayload)]); | ||
| 95 | setResponses((rps) => [...rps, ...responses.map(({ payload }) => payload as ResponsePayload)]); | ||
| 96 | break | ||
| 55 | case 'request': | 97 | case 'request': |
| 56 | setRequests((rqs) => [...rqs, payload as RequestPayload]) | 98 | setRequests((rqs) => [...rqs, payload as RequestPayload]) |
| 57 | break | 99 | break |
| @@ -62,16 +104,21 @@ export default function useRequests(): RequestResponse[] { | |||
| 62 | } | 104 | } |
| 63 | 105 | ||
| 64 | ws.addEventListener('message', onMessage) | 106 | ws.addEventListener('message', onMessage) |
| 65 | ws.addEventListener('close', reconnect) | 107 | ws.addEventListener('close', onClose) |
| 108 | ws.addEventListener('open', onOpen) | ||
| 66 | 109 | ||
| 67 | return () => { | 110 | return () => { |
| 68 | ws.removeEventListener('message', onMessage); | 111 | ws.removeEventListener('message', onMessage); |
| 69 | ws.removeEventListener('close', reconnect); | 112 | ws.removeEventListener('close', onClose); |
| 113 | ws.removeEventListener('open', onOpen) | ||
| 70 | } | 114 | } |
| 71 | }, [ws]) | 115 | }, [ws]) |
| 72 | 116 | ||
| 73 | return useMemo<RequestResponse[]>(() => requests.map((request) => ({ | 117 | return { |
| 74 | request: request, | 118 | calls: useMemo<RequestResponse[]>(() => requests.map((request) => ({ |
| 75 | response: responses.find(({ id }) => id === request.id) | 119 | request: request, |
| 76 | })), [requests, responses]) | 120 | response: responses.find(({id}) => id === request.id) |
| 121 | })), [requests, responses]), | ||
| 122 | readyState, | ||
| 123 | } | ||
| 77 | } | 124 | } |
