summaryrefslogtreecommitdiffstats
path: root/src/hooks
diff options
context:
space:
mode:
Diffstat (limited to 'src/hooks')
-rw-r--r--src/hooks/useRequests.tsx69
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
36interface Historic {
37 type: 'historic'
38 payload: (Request | Response)[]
39}
40
36export interface RequestResponse { 41export interface RequestResponse {
37 request: RequestPayload 42 request: RequestPayload
38 response?: ResponsePayload 43 response?: ResponsePayload
39} 44}
40 45
41export default function useRequests(): RequestResponse[] { 46export enum ReadyState {
47 CONNECTING = 0,
48 OPEN = 1,
49 CLOSING = 2,
50 CLOSED = 3,
51}
52
53export interface useRequestsProps {
54 onConnect: () => Promise<void>
55}
56
57export interface UseRequests {
58 calls: RequestResponse[]
59 readyState: ReadyState
60}
61
62export 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}