Skip to content

Commit b69f42f

Browse files
committed
fix: errors + ids + transports
1 parent 2ed8725 commit b69f42f

File tree

3 files changed

+74
-37
lines changed

3 files changed

+74
-37
lines changed

src/containers/Inspector.tsx

+70-33
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ import {
2424
ListItemText,
2525
Container,
2626
} from "@material-ui/core";
27-
import { Client, RequestManager, HTTPTransport, WebSocketTransport } from "@open-rpc/client-js";
27+
import { HTTPTransport, WebSocketTransport } from "@open-rpc/client-js";
28+
import { Transport } from "@open-rpc/client-js/build/transports/Transport";
2829
import Brightness3Icon from "@material-ui/icons/Brightness3";
2930
import WbSunnyIcon from "@material-ui/icons/WbSunny";
3031
import { JSONRPCError } from "@open-rpc/client-js/build/Error";
@@ -38,18 +39,36 @@ import useMonacoVimMode from "../hooks/useMonacoVimMode";
3839
import { addDiagnostics } from "@etclabscore/monaco-add-json-schema-diagnostics";
3940
import openrpcDocumentToJSONRPCSchemaResult from "../helpers/openrpcDocumentToJSONRPCSchemaResult";
4041

41-
const errorToJSON = (error: JSONRPCError | any): any => {
42+
const errorToJSON = (error: JSONRPCError | any, id: string | number): any => {
4243
const isError = error instanceof Error;
4344
if (!isError) {
4445
return;
4546
}
4647
if (!error) {
4748
return;
4849
}
50+
const emptyErrorResponse = {
51+
jsonrpc: "2.0",
52+
id,
53+
};
54+
// this is an internal wrapped client-js error
55+
if (error.data instanceof Error) {
56+
return {
57+
...emptyErrorResponse,
58+
error: {
59+
code: error.data.code,
60+
message: error.data.message,
61+
data: error.data.data,
62+
},
63+
};
64+
}
4965
return {
50-
code: error.code,
51-
message: error.message,
52-
data: error.data,
66+
...emptyErrorResponse,
67+
error: {
68+
code: error.code,
69+
message: error.message,
70+
data: error.data,
71+
},
5372
};
5473
};
5574

@@ -62,35 +81,36 @@ interface IProps {
6281
onToggleDarkMode?: () => void;
6382
}
6483

65-
const useClient = (url: string): [Client, JSONRPCError | undefined, Dispatch<JSONRPCError | undefined>] => {
66-
const [client, setClient] = useState();
67-
const [error, setError] = useState();
84+
type TUseTransport = (url: string) =>
85+
[Transport | undefined, JSONRPCError | undefined, Dispatch<JSONRPCError | undefined>];
86+
87+
const useTransport: TUseTransport = (url) => {
88+
const [transport, setTransport]: [Transport | undefined, Dispatch<Transport | undefined>] = useState();
89+
const [error, setError]: [JSONRPCError | undefined, Dispatch<JSONRPCError | undefined>] = useState();
6890
useEffect(() => {
69-
let transport;
91+
let localTransport;
7092
if (url === "" || url === undefined) {
71-
setClient(undefined);
93+
setTransport(undefined);
7294
return;
7395
}
7496
if (url.includes("http://") || url.includes("https://")) {
75-
transport = HTTPTransport;
97+
localTransport = HTTPTransport;
7698
}
7799
if (url.includes("ws://")) {
78-
transport = WebSocketTransport;
100+
localTransport = WebSocketTransport;
79101
}
80102
try {
81-
const clientTransport = transport || HTTPTransport;
82-
const t = new clientTransport(url);
83-
const c = new Client(new RequestManager([t]));
84-
setClient(c);
85-
c.onError((e) => {
86-
console.log("onError", e); //tslint:disable-line
103+
const transportTransport = localTransport || HTTPTransport;
104+
const t = new transportTransport(url);
105+
t.connect().then(() => {
106+
setTransport(t);
87107
});
88108
} catch (e) {
89-
setClient(undefined);
109+
setTransport(undefined);
90110
setError(e);
91111
}
92112
}, [url]);
93-
return [client, error, setError];
113+
return [transport, error, setError];
94114
};
95115

96116
function useCounter(defaultValue: number): [number, () => void] {
@@ -107,7 +127,7 @@ const emptyJSONRPC = {
107127
jsonrpc: "2.0",
108128
method: "",
109129
params: [],
110-
id: "0",
130+
id: 0,
111131
};
112132

113133
const Inspector: React.FC<IProps> = (props) => {
@@ -145,8 +165,8 @@ const Inspector: React.FC<IProps> = (props) => {
145165
const [results, setResults]: [any, Dispatch<any>] = useState();
146166
const [url, setUrl] = useState(props.url || "");
147167
const [debouncedUrl] = useDebounce(url, 1000);
148-
const [client, error] = useClient(debouncedUrl);
149-
const [historyOpen, setHistoryOpen] = useState();
168+
const [transport, error] = useTransport(debouncedUrl);
169+
const [historyOpen, setHistoryOpen] = useState(false);
150170
const [requestHistory, setRequestHistory]: [any[], Dispatch<any>] = useState([]);
151171
const [historySelectedIndex, setHistorySelectedIndex] = useState(0);
152172
useEffect(() => {
@@ -166,7 +186,7 @@ const Inspector: React.FC<IProps> = (props) => {
166186
const jsonResult = {
167187
...json,
168188
jsonrpc: "2.0",
169-
id: id.toString(),
189+
id,
170190
};
171191
setJson(jsonResult);
172192
}
@@ -187,7 +207,9 @@ const Inspector: React.FC<IProps> = (props) => {
187207
const modelName = "inspector-results";
188208
const modelUriString = `inmemory://${modelName}-${Math.random()}.json`;
189209
const modelUri = monaco.Uri.parse(modelUriString);
190-
const model = monaco.editor.createModel(results ? JSON.stringify(results, null, 4) : "", "json", modelUri);
210+
const model = monaco.editor.createModel(
211+
results ? JSON.stringify(results, null, 4) : ""
212+
, "json", modelUri);
191213
responseEditor.setModel(model);
192214
addDiagnostics(modelUri.toString(), schema, monaco);
193215
// eslint-disable-next-line react-hooks/exhaustive-deps
@@ -210,21 +232,25 @@ const Inspector: React.FC<IProps> = (props) => {
210232

211233
const handlePlayButton = async () => {
212234
clear();
213-
if (client) {
214-
incrementId();
235+
if (transport) {
215236
try {
216-
const result = await client.request(json.method, json.params);
237+
const result = await transport.sendData({
238+
internalID: id,
239+
request: json,
240+
});
217241
const r = { jsonrpc: "2.0", result, id };
218242
setResults(r);
219243
setTabResults(tabIndex, r);
220244
const newHistory: any = [...requestHistory, { ...tabs[tabIndex] }];
221245
setRequestHistory(newHistory);
222246
} catch (e) {
247+
const convertedError = errorToJSON(e, id);
223248
const newHistory: any = [...requestHistory, { ...tabs[tabIndex] }];
224249
setRequestHistory(newHistory);
225-
setResults(e);
226-
setTabResults(tabIndex, e);
250+
setResults(convertedError);
251+
setTabResults(tabIndex, convertedError);
227252
}
253+
incrementId();
228254
}
229255
};
230256
function handleResponseEditorDidMount(__: any, editor: any) {
@@ -246,8 +272,19 @@ const Inspector: React.FC<IProps> = (props) => {
246272
}
247273
};
248274
const refreshOpenRpcDocument = async () => {
275+
if (!transport) {
276+
return;
277+
}
249278
try {
250-
const d = await client.request("rpc.discover", []);
279+
const d = await transport.sendData({
280+
internalID: id,
281+
request: {
282+
jsonrpc: "2.0",
283+
params: [],
284+
id,
285+
method: "rpc.discover",
286+
},
287+
});
251288
const doc = await parseOpenRPCDocument(d);
252289
setOpenRpcDocument(doc);
253290
setTabOpenRPCDocument(tabIndex, doc);
@@ -261,7 +298,7 @@ const Inspector: React.FC<IProps> = (props) => {
261298
useEffect(() => {
262299
refreshOpenRpcDocument();
263300
// eslint-disable-next-line react-hooks/exhaustive-deps
264-
}, [client, tabIndex]);
301+
}, [transport, tabIndex]);
265302

266303
useEffect(() => {
267304
if (tabs[tabIndex]) {
@@ -516,7 +553,7 @@ const Inspector: React.FC<IProps> = (props) => {
516553
height="93vh"
517554
editorDidMount={handleResponseEditorDidMount}
518555
language="json"
519-
value={JSON.stringify(errorToJSON(results) || results, null, 4) || ""}
556+
value={JSON.stringify(results, null, 4) || ""}
520557
/>
521558
: <Grid container justify="center" style={{ paddingTop: "20px" }} direction="column" alignItems="center">
522559
<Typography variant="body1" gutterBottom color="textSecondary" style={{ paddingBottom: "15px" }}>

src/hooks/useMonacoVimMode.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
import { useState, useEffect } from "react";
1+
import { useState, useEffect, Dispatch } from "react";
22
import * as monaco from "monaco-editor";
33
const { initVimMode } = require("monaco-vim"); //tslint:disable-line
44

55
// Vim Mode:
66
// Press Chord Ctrl-K, Ctrl-V => the action will run if it is enabled
7-
const useMonacoVimMode = (editor: monaco.editor.IStandaloneCodeEditor) => {
8-
const [vimMode, setVimMode] = useState();
7+
const useMonacoVimMode = (editor: monaco.editor.IStandaloneCodeEditor | undefined) => {
8+
const [vimMode, setVimMode]: [any, Dispatch<any>] = useState();
99

1010
useEffect(() => {
1111
if (!editor) { return; }

src/hooks/useTabs.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ const emptyJSONRPC = {
1414
jsonrpc: "2.0",
1515
method: "",
1616
params: [],
17-
id: "0",
17+
id: 0,
1818
};
1919

2020
const useTabs = (defaultTabs?: ITab[]) => {

0 commit comments

Comments
 (0)