-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathJSONRPCCLIENT.ts
57 lines (53 loc) · 1.55 KB
/
JSONRPCCLIENT.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import { JsonRpcRequest } from "./JsonRpcRequest.ts";
export async function JSONRPCCLIENT<
T extends Record<any, (...args: any) => any> = any,
M extends keyof T = any,
>(
service_url: string,
token: string,
method: M,
params: Parameters<T[M]>,
): Promise<ReturnType<T[M]>> {
const request: JsonRpcRequest<T[M]> = {
jsonrpc: "2.0",
method: method as string,
params: params,
id: Date.now(),
};
console.log({ request });
const reqinit = new Request(service_url, {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${token}`,
},
body: JSON.stringify(request),
});
console.log({ request: reqinit });
const response = await fetch(
reqinit,
);
console.log({ request: reqinit, response });
if (!response.ok) {
throw new Error(`Server responded with status ${response.status}`);
}
const data = await response.json();
console.log({ response: data, request });
const rpcResponse = data as JsonRpcResponse<T[M]>;
if ("result" in rpcResponse && rpcResponse.result) {
return rpcResponse.result;
} else if ("error" in rpcResponse && rpcResponse.error) {
throw new Error(rpcResponse.error.message);
}
throw new Error("Invalid JSON-RPC response");
}
export interface JsonRpcResponse<
M extends (...args: any) => any,
> {
jsonrpc: string;
result?: ReturnType<M>;
error?: {
code: number;
message: string;
};
}