Newer
Older
)
var (
ErrClientQuit = errors.New("client is closed")
ErrNoResult = errors.New("no result in JSON-RPC response")
ErrSubscriptionQueueOverflow = errors.New("subscription queue overflow")
errClientReconnected = errors.New("client reconnected")
errDead = errors.New("connection lost")
)
c.handler = c.m.HandlerFunc(func(w jsonrpc.ResponseWriter, r *jsonrpc.Request) {
}
func DialHTTP(target string) (*Client, error) {
return Dial(nil, http.DefaultClient, target)
func Dial(ctx context.Context, client *http.Client, target string) (*Client, error) {
return &Client{remote: target, c: client, headers: http.Header{
"Content-Type": []string{"application/json"},
}}, nil
func (c *Client) Do(ctx context.Context, result any, method string, params any) error {
req, err := jsonrpc.NewRequest(ctx, jsonrpc.NewId(c.id.Add(1)), method, params)
StatusCode: resp.StatusCode,
Status: resp.Status,
Body: b,
}
}
if result != nil && msg.Result != nil {
err = json.NewDecoder(msg.Result).Decode(result)
func (c *Client) Notify(ctx context.Context, method string, params any) error {
func (c *Client) BatchCall(ctx context.Context, b ...*jsonrpc.BatchElem) error {
reqs := make([]*jsonrpc.Request, len(b))
ids := make(map[int]int, len(b))
for idx, v := range b {
func (c *Client) Closed() <-chan struct{} {
return make(chan struct{})
}
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
// TODO: use buffer for this
buf := bufpool.GetStd()
defer bufpool.PutStd(buf)
buf.Reset()
err := json.NewEncoder(buf).Encode(req)
if err != nil {
return nil, err
}
return c.postBuf(req.Context(), buf)
}
func (c *Client) postBuf(ctx context.Context, rd io.Reader) (*http.Response, error) {
if ctx == nil {
ctx = context.Background()
}
hreq, err := http.NewRequestWithContext(ctx, http.MethodPost, c.remote, rd)
if err != nil {
return nil, err
}
func() {
c.mu.RLock()
defer c.mu.RUnlock()
for k, v := range c.headers {
for _, vv := range v {
hreq.Header.Add(k, vv)
}
}
}()
return c.c.Do(hreq)
}