diff options
| author | 2022-02-12 11:33:52 +0100 | |
|---|---|---|
| committer | 2022-02-12 11:33:52 +0100 | |
| commit | 871a85d9343cf49646d13dc455c062efadcb959a (patch) | |
| tree | 7d36b14b237719901d71d58c88f74b87b875ee61 /src/hooks/useRequests.tsx | |
| parent | 7c48533571e9f9d3731a59433a56cc8d6e008123 (diff) | |
| download | client-871a85d9343cf49646d13dc455c062efadcb959a.tar.gz client-871a85d9343cf49646d13dc455c062efadcb959a.tar.bz2 client-871a85d9343cf49646d13dc455c062efadcb959a.zip | |
Beatified codev1.3.0
Diffstat (limited to 'src/hooks/useRequests.tsx')
| -rw-r--r-- | src/hooks/useRequests.tsx | 145 |
1 files changed, 82 insertions, 63 deletions
diff --git a/src/hooks/useRequests.tsx b/src/hooks/useRequests.tsx index c3fc2be..108232f 100644 --- a/src/hooks/useRequests.tsx +++ b/src/hooks/useRequests.tsx | |||
| @@ -1,43 +1,43 @@ | |||
| 1 | import {useCallback, useEffect, useMemo, useState} from "react"; | 1 | import { useCallback, useEffect, useMemo, useState } from "react"; |
| 2 | import {getHost} from "../utils"; | 2 | import { getHost } from "../utils"; |
| 3 | 3 | ||
| 4 | export type Headers = [string, string][] | 4 | export type Headers = [string, string][]; |
| 5 | export type Method = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 5 | export type Method = "GET" | "POST" | "PUT" | "DELETE" | "PATCH"; |
| 6 | 6 | ||
| 7 | export interface RequestPayload { | 7 | export interface RequestPayload { |
| 8 | id: string | 8 | id: string; |
| 9 | body: string | 9 | body: string; |
| 10 | headers: Headers | 10 | headers: Headers; |
| 11 | method: Method | 11 | method: Method; |
| 12 | path: string | 12 | path: string; |
| 13 | } | 13 | } |
| 14 | 14 | ||
| 15 | interface Request { | 15 | interface Request { |
| 16 | type: 'request', | 16 | type: "request"; |
| 17 | payload: RequestPayload, | 17 | payload: RequestPayload; |
| 18 | } | 18 | } |
| 19 | 19 | ||
| 20 | export interface ResponsePayload { | 20 | export interface ResponsePayload { |
| 21 | id: string | 21 | id: string; |
| 22 | timing: number | 22 | timing: number; |
| 23 | body: string | 23 | body: string; |
| 24 | headers: Headers | 24 | headers: Headers; |
| 25 | status: number | 25 | status: number; |
| 26 | } | 26 | } |
| 27 | 27 | ||
| 28 | interface Response { | 28 | interface Response { |
| 29 | type: 'response', | 29 | type: "response"; |
| 30 | payload: ResponsePayload, | 30 | payload: ResponsePayload; |
| 31 | } | 31 | } |
| 32 | 32 | ||
| 33 | interface Historic { | 33 | interface Historic { |
| 34 | type: 'historic' | 34 | type: "historic"; |
| 35 | payload: (Request | Response)[] | 35 | payload: (Request | Response)[]; |
| 36 | } | 36 | } |
| 37 | 37 | ||
| 38 | export interface RequestResponse { | 38 | export interface RequestResponse { |
| 39 | request: RequestPayload | 39 | request: RequestPayload; |
| 40 | response?: ResponsePayload | 40 | response?: ResponsePayload; |
| 41 | } | 41 | } |
| 42 | 42 | ||
| 43 | export enum ReadyState { | 43 | export enum ReadyState { |
| @@ -48,26 +48,28 @@ export enum ReadyState { | |||
| 48 | } | 48 | } |
| 49 | 49 | ||
| 50 | export interface useRequestsProps { | 50 | export interface useRequestsProps { |
| 51 | onConnect: () => Promise<void> | 51 | onConnect: () => Promise<void>; |
| 52 | } | 52 | } |
| 53 | 53 | ||
| 54 | export interface UseRequests { | 54 | export interface UseRequests { |
| 55 | calls: RequestResponse[] | 55 | calls: RequestResponse[]; |
| 56 | readyState: ReadyState | 56 | readyState: ReadyState; |
| 57 | clear: () => void | 57 | clear: () => void; |
| 58 | } | 58 | } |
| 59 | 59 | ||
| 60 | export default function useRequests({ onConnect }: useRequestsProps): UseRequests { | 60 | export default function useRequests({ |
| 61 | onConnect, | ||
| 62 | }: useRequestsProps): UseRequests { | ||
| 61 | const wsHost = useMemo(getHost, []); | 63 | const wsHost = useMemo(getHost, []); |
| 62 | 64 | ||
| 63 | const [initialConnection, setInitialConnection] = useState(true); | 65 | const [initialConnection, setInitialConnection] = useState(true); |
| 64 | const [requests, setRequests] = useState<RequestPayload[]>([]); | 66 | const [requests, setRequests] = useState<RequestPayload[]>([]); |
| 65 | const [responses, setResponses] = useState<ResponsePayload[]>([]); | 67 | const [responses, setResponses] = useState<ResponsePayload[]>([]); |
| 66 | 68 | ||
| 67 | 69 | const connect = useCallback( | |
| 68 | const connect = useCallback(() => ( | 70 | () => new WebSocket(`ws://${wsHost}/inspect/`), |
| 69 | new WebSocket(`ws://${wsHost}/inspect/`) | 71 | [wsHost] |
| 70 | ), [wsHost]); | 72 | ); |
| 71 | 73 | ||
| 72 | const [ws, setWs] = useState<WebSocket>(() => connect()); | 74 | const [ws, setWs] = useState<WebSocket>(() => connect()); |
| 73 | const [readyState, setReadyState] = useState<ReadyState>(ws.readyState); | 75 | const [readyState, setReadyState] = useState<ReadyState>(ws.readyState); |
| @@ -78,53 +80,70 @@ export default function useRequests({ onConnect }: useRequestsProps): UseRequest | |||
| 78 | const onClose = () => { | 80 | const onClose = () => { |
| 79 | setReadyState(ws.readyState); | 81 | setReadyState(ws.readyState); |
| 80 | setWs(connect()); | 82 | setWs(connect()); |
| 81 | } | 83 | }; |
| 82 | const onOpen = () => { | 84 | const onOpen = () => { |
| 83 | onConnect(); | 85 | onConnect(); |
| 84 | setInitialConnection(false); | 86 | setInitialConnection(false); |
| 85 | setReadyState(ws.readyState); | 87 | setReadyState(ws.readyState); |
| 86 | } | 88 | }; |
| 87 | const onMessage = ({ data }) => { | 89 | const onMessage = ({ data }) => { |
| 88 | const { type, payload } = JSON.parse(data) as Historic | Request | Response | 90 | const { type, payload } = JSON.parse(data) as |
| 91 | | Historic | ||
| 92 | | Request | ||
| 93 | | Response; | ||
| 89 | 94 | ||
| 90 | switch (type) { | 95 | switch (type) { |
| 91 | case 'historic': | 96 | case "historic": |
| 92 | if (initialConnection) { | 97 | if (initialConnection) { |
| 93 | const requests = (payload as (Request | Response)[]).filter(({ type }) => type === 'request'); | 98 | const requests = (payload as (Request | Response)[]).filter( |
| 94 | const responses = (payload as (Request | Response)[]).filter(({ type }) => type === 'response'); | 99 | ({ type }) => type === "request" |
| 95 | setRequests((rqs) => [...rqs, ...requests.map(({ payload }) => payload as RequestPayload)]); | 100 | ); |
| 96 | setResponses((rps) => [...rps, ...responses.map(({ payload }) => payload as ResponsePayload)]); | 101 | const responses = (payload as (Request | Response)[]).filter( |
| 102 | ({ type }) => type === "response" | ||
| 103 | ); | ||
| 104 | setRequests((rqs) => [ | ||
| 105 | ...rqs, | ||
| 106 | ...requests.map(({ payload }) => payload as RequestPayload), | ||
| 107 | ]); | ||
| 108 | setResponses((rps) => [ | ||
| 109 | ...rps, | ||
| 110 | ...responses.map(({ payload }) => payload as ResponsePayload), | ||
| 111 | ]); | ||
| 97 | } | 112 | } |
| 98 | break | 113 | break; |
| 99 | case 'request': | 114 | case "request": |
| 100 | setRequests((rqs) => [...rqs, payload as RequestPayload]) | 115 | setRequests((rqs) => [...rqs, payload as RequestPayload]); |
| 101 | break | 116 | break; |
| 102 | case 'response': | 117 | case "response": |
| 103 | setResponses((rps) => [...rps, payload as ResponsePayload]) | 118 | setResponses((rps) => [...rps, payload as ResponsePayload]); |
| 104 | break | 119 | break; |
| 105 | } | 120 | } |
| 106 | } | 121 | }; |
| 107 | 122 | ||
| 108 | ws.addEventListener('message', onMessage) | 123 | ws.addEventListener("message", onMessage); |
| 109 | ws.addEventListener('close', onClose) | 124 | ws.addEventListener("close", onClose); |
| 110 | ws.addEventListener('open', onOpen) | 125 | ws.addEventListener("open", onOpen); |
| 111 | 126 | ||
| 112 | return () => { | 127 | return () => { |
| 113 | ws.removeEventListener('message', onMessage); | 128 | ws.removeEventListener("message", onMessage); |
| 114 | ws.removeEventListener('close', onClose); | 129 | ws.removeEventListener("close", onClose); |
| 115 | ws.removeEventListener('open', onOpen) | 130 | ws.removeEventListener("open", onOpen); |
| 116 | } | 131 | }; |
| 117 | }, [ws]) | 132 | }, [ws]); |
| 118 | 133 | ||
| 119 | return { | 134 | return { |
| 120 | calls: useMemo<RequestResponse[]>(() => requests.map((request) => ({ | 135 | calls: useMemo<RequestResponse[]>( |
| 121 | request: request, | 136 | () => |
| 122 | response: responses.find(({id}) => id === request.id) | 137 | requests.map((request) => ({ |
| 123 | })), [requests, responses]), | 138 | request: request, |
| 139 | response: responses.find(({ id }) => id === request.id), | ||
| 140 | })), | ||
| 141 | [requests, responses] | ||
| 142 | ), | ||
| 124 | readyState, | 143 | readyState, |
| 125 | clear: () => { | 144 | clear: () => { |
| 126 | setRequests([]) | 145 | setRequests([]); |
| 127 | setResponses([]) | 146 | setResponses([]); |
| 128 | } | 147 | }, |
| 129 | } | 148 | }; |
| 130 | } | 149 | } |
