v2 / vlib / net / jsonrpc / client.v
84 lines · 61 sloc · 2.35 KB · f53920bcec4f43594143c41772b42b6465f1c6a9
Raw
1module jsonrpc
2
3import io
4
5pub struct ClientConfig {
6pub mut:
7 stream io.ReaderWriter
8 interceptors Interceptors
9}
10
11pub struct Client {
12mut:
13 stream io.ReaderWriter
14 interceptors Interceptors
15}
16
17// new_client creates new `jsonrpc.Client` with `stream` to read/write and `interceptors`
18pub fn new_client(cfg ClientConfig) Client {
19 return Client{
20 stream: cfg.stream
21 interceptors: cfg.interceptors
22 }
23}
24
25// notify sends JSON-RPC 2.0 Notification and returns without waiting for `jsonrpc.Response`
26pub fn (mut c Client) notify[T](method string, params T) ! {
27 mut req := new_request(method, params, '')
28 intercept_request(c.interceptors.request, &req) or { return err }
29
30 mut enc_req := req.encode().bytes()
31 intercept_encoded_request(c.interceptors.encoded_request, enc_req) or { return err }
32
33 c.stream.write(enc_req) or { return err }
34}
35
36// request new `jsonrpc.Request` and return `jsonrpc.Response`
37pub fn (mut c Client) request[T](method string, params T, id string) !Response {
38 mut req := new_request(method, params, id)
39 intercept_request(c.interceptors.request, &req) or { return err }
40
41 mut enc_req := req.encode().bytes()
42 intercept_encoded_request(c.interceptors.encoded_request, enc_req) or { return err }
43
44 c.stream.write(enc_req) or { return err }
45
46 mut enc_resp := []u8{len: 4096}
47 c.stream.read(mut enc_resp) or { return err }
48
49 intercept_encoded_response(c.interceptors.encoded_response, enc_resp)
50
51 resp := decode_response(enc_resp.bytestr()) or { return err }
52
53 intercept_response(c.interceptors.response, resp)
54
55 return resp
56}
57
58// batch sends batch of `jsonrpc.Request` and returns batch of`jsonrpc.Response`
59pub fn (mut c Client) batch(reqs []Request) ![]Response {
60 mut reqs_str := '['
61 for req in reqs {
62 intercept_request(c.interceptors.request, &req) or { return err }
63 reqs_str = reqs_str + req.encode() + ', '
64 }
65
66 reqs_str = reqs_str.all_before_last(', ') + ']'
67 enc_reqs := reqs_str.bytes()
68 intercept_encoded_request(c.interceptors.encoded_request, enc_reqs) or { return err }
69
70 c.stream.write(enc_reqs) or { return err }
71
72 mut enc_resp := []u8{len: 4096}
73 c.stream.read(mut enc_resp) or { return err }
74
75 intercept_encoded_response(c.interceptors.encoded_response, enc_resp)
76
77 mut resps := decode_batch_response(enc_resp.bytestr()) or { return err }
78
79 for mut resp in resps {
80 intercept_response(c.interceptors.response, &resp)
81 }
82
83 return resps
84}
85