summaryrefslogtreecommitdiffstats
path: root/src/hooks
diff options
context:
space:
mode:
Diffstat (limited to 'src/hooks')
-rw-r--r--src/hooks/useRequests.tsx195
1 files changed, 162 insertions, 33 deletions
diff --git a/src/hooks/useRequests.tsx b/src/hooks/useRequests.tsx
index dfc3b80..3135aa2 100644
--- a/src/hooks/useRequests.tsx
+++ b/src/hooks/useRequests.tsx
@@ -1,13 +1,23 @@
1import { useCallback, useEffect, useMemo, useState } from "react"; 1import { useCallback, useEffect, useMemo, useState } from "react";
2import { getHost } from "~/utils"; 2import { getHost } from "~/utils";
3import { 3import {
4 Call,
5 Frame,
6 Frames,
4 Historic, 7 Historic,
5 ReadyState, 8 ReadyState,
6 Request, 9 Request,
7 RequestPayload, 10 RequestResponseType,
8 RequestResponse, 11 Requests,
9 Response, 12 Response,
10 ResponsePayload, 13 ResponsePayload,
14 Responses,
15 WebsocketConnect,
16 WebsocketConnected,
17 WebsocketConnectedPayload,
18 WebsocketDisconnectPayload,
19 WebsocketInboundPayload,
20 WebsocketOutboundPayload,
11 WebsocketType, 21 WebsocketType,
12} from "~/types"; 22} from "~/types";
13 23
@@ -16,7 +26,7 @@ export interface useRequestsProps {
16} 26}
17 27
18export interface UseRequests { 28export interface UseRequests {
19 calls: RequestResponse[]; 29 calls: Call[];
20 readyState: ReadyState; 30 readyState: ReadyState;
21 clear: () => void; 31 clear: () => void;
22} 32}
@@ -27,10 +37,9 @@ export default function useRequests({
27 const wsHost = useMemo(getHost, []); 37 const wsHost = useMemo(getHost, []);
28 38
29 const [initialConnection, setInitialConnection] = useState(true); 39 const [initialConnection, setInitialConnection] = useState(true);
30 const [requests, setRequests] = useState<RequestPayload[]>([]); 40 const [requests, setRequests] = useState<Requests>([]);
31 const [responses, setResponses] = useState<ResponsePayload[]>([]); 41 const [responses, setResponses] = useState<Responses>({});
32 const [websocketFrames, setWebsocketFrames] = 42 const [websocketFrames, setWebsocketFrames] = useState<Frames>({});
33 useState<WebsocketType["payload"]>();
34 43
35 const connect = useCallback( 44 const connect = useCallback(
36 () => new WebSocket(`ws://${wsHost}/inspect/`), 45 () => new WebSocket(`ws://${wsHost}/inspect/`),
@@ -52,38 +61,140 @@ export default function useRequests({
52 setInitialConnection(false); 61 setInitialConnection(false);
53 setReadyState(ws.readyState); 62 setReadyState(ws.readyState);
54 }; 63 };
55 const onMessage = ({ data }) => { 64 const onMessage = ({ data }: { data: string }) => {
56 const { type, payload } = JSON.parse(data) as 65 const { type, payload } = JSON.parse(data) as
57 | Historic 66 | Historic
58 | Request 67 | RequestResponseType
59 | Response; 68 | WebsocketType;
60
61 console.debug(type, payload);
62 69
63 switch (type) { 70 switch (type) {
64 case "historic": 71 case "historic":
65 if (initialConnection) { 72 if (initialConnection) {
66 const requests = (payload as (Request | Response)[]).filter( 73 const requests = (
67 ({ type }) => type === "request" 74 payload as (RequestResponseType | WebsocketType)[]
68 ); 75 )
69 const responses = (payload as (Request | Response)[]).filter( 76 .filter(
70 ({ type }) => type === "response" 77 ({ type }) => type === "request" || type == "websocket_connect"
71 ); 78 )
79 .map((payload) => {
80 if (
81 (payload as WebsocketConnect).payload.method === undefined
82 ) {
83 (payload as Request | WebsocketConnect).payload.method =
84 "GET";
85 }
86
87 return payload;
88 });
89 const responses = (
90 payload as (RequestResponseType | WebsocketType)[]
91 )
92 .filter(
93 ({ type }) =>
94 type === "response" || type == "websocket_connected"
95 )
96 .map(({ type, ...item }) => {
97 if (type == "websocket_connected") {
98 (item.payload as WebsocketConnectedPayload).status = 101;
99 }
100
101 return { type, ...item };
102 })
103 .reduce<{ [id: string]: Response | WebsocketConnected }>(
104 (out, item) => ({
105 ...out,
106 [item.payload.id]: item as Response | WebsocketConnected,
107 }),
108 {}
109 );
110 const frames = (payload as (RequestResponseType | WebsocketType)[])
111 .filter(
112 ({ type }) =>
113 type == "websocket_inbound" ||
114 type == "websocket_outbound" ||
115 type == "websocket_disconnect"
116 )
117 .reduce<Frames>((out, item) => {
118 if (!out.hasOwnProperty(item.payload.id)) {
119 out[item.payload.id] = [];
120 }
121
122 out[item.payload.id].push(item as Frame);
123 return out;
124 }, {});
72 setRequests((rqs) => [ 125 setRequests((rqs) => [
73 ...rqs, 126 ...rqs,
74 ...requests.map(({ payload }) => payload as RequestPayload), 127 ...requests.map(
128 (payload) => payload as Request | WebsocketConnect
129 ),
75 ]); 130 ]);
76 setResponses((rps) => [ 131 setResponses((rps) => ({
77 ...rps, 132 ...rps,
78 ...responses.map(({ payload }) => payload as ResponsePayload), 133 ...responses,
79 ]); 134 }));
135 setWebsocketFrames((frms) => ({
136 ...frms,
137 ...frames,
138 }));
80 } 139 }
81 break; 140 break;
82 case "request": 141 case "request":
83 setRequests((rqs) => [...rqs, payload as RequestPayload]); 142 case "websocket_connect":
143 setRequests((rqs) => [
144 ...rqs,
145 {
146 type,
147 payload:
148 type === "request"
149 ? payload
150 : {
151 ...payload,
152 method: "GET",
153 },
154 } as Request | WebsocketConnect,
155 ]);
84 break; 156 break;
85 case "response": 157 case "response":
86 setResponses((rps) => [...rps, payload as ResponsePayload]); 158 case "websocket_connected":
159 if (type == "websocket_connected") {
160 (payload as WebsocketConnectedPayload).status = 101;
161 }
162 setResponses((rps) => ({
163 ...rps,
164 [(payload as ResponsePayload | WebsocketConnectedPayload).id]: {
165 type,
166 payload,
167 } as Response | WebsocketConnected,
168 }));
169 break;
170 case "websocket_inbound":
171 case "websocket_outbound":
172 case "websocket_disconnect":
173 setWebsocketFrames((frms) => {
174 const id = (
175 payload as
176 | WebsocketInboundPayload
177 | WebsocketOutboundPayload
178 | WebsocketDisconnectPayload
179 ).id;
180
181 const newFrms = { ...frms };
182
183 if (!newFrms.hasOwnProperty(id)) {
184 newFrms[id] = [];
185 }
186
187 // @ts-ignore
188 newFrms[id].push({
189 type,
190 payload: payload as
191 | WebsocketInboundPayload
192 | WebsocketOutboundPayload
193 | WebsocketDisconnectPayload,
194 });
195
196 return newFrms;
197 });
87 break; 198 break;
88 } 199 }
89 }; 200 };
@@ -99,19 +210,37 @@ export default function useRequests({
99 }; 210 };
100 }, [ws]); 211 }, [ws]);
101 212
213 const calls = useMemo<Call[]>(
214 () =>
215 requests.map((request) => {
216 switch (request.type) {
217 case "request":
218 return {
219 type: "RequestResponse",
220 request: request.payload,
221 response: responses[request.payload.id]
222 ?.payload as ResponsePayload,
223 };
224 case "websocket_connect":
225 return {
226 type: "WebsocketConnection",
227