1 | const superagent = require('superagent');
|
2 | const BaseProvider = require('./BaseProvider');
|
3 |
|
4 | /**
|
5 | * Http protocol json rpc provider.
|
6 | */
|
7 | class HttpProvider extends BaseProvider {
|
8 | /**
|
9 | * @param url {string} - Full json rpc http url
|
10 | * @param [options] {object} - See `BaseProvider.constructor`
|
11 | * @return {HttpProvider}
|
12 | *
|
13 | * @example
|
14 | * > const provider = new HttpProvider('http://testnet-jsonrpc.conflux-chain.org:12537', {logger: console});
|
15 | */
|
16 | // eslint-disable-next-line no-useless-constructor
|
17 | constructor(url, options) {
|
18 | super(url, options);
|
19 | }
|
20 |
|
21 | /**
|
22 | * Call a json rpc method with params
|
23 | *
|
24 | * @param method {string} - Json rpc method name.
|
25 | * @param [params] {array} - Json rpc method params.
|
26 | * @return {Promise<*>} Json rpc method return value.
|
27 | *
|
28 | * @example
|
29 | * > await provider.call('cfx_epochNumber');
|
30 | * > await provider.call('cfx_getBlockByHash', blockHash);
|
31 | */
|
32 | async call(method, ...params) {
|
33 | const startTime = Date.now();
|
34 |
|
35 | const data = { jsonrpc: '2.0', id: this.requestId(), method, params };
|
36 |
|
37 | const { body: { result, error } = {} } = await superagent
|
38 | .post(this.url)
|
39 | .send(data)
|
40 | .timeout(this.timeout);
|
41 |
|
42 | if (error) {
|
43 | this.logger.error({ data, error, duration: Date.now() - startTime });
|
44 | throw new BaseProvider.RPCError(error);
|
45 | } else {
|
46 | this.logger.info({ data, result, duration: Date.now() - startTime });
|
47 | }
|
48 |
|
49 | return result;
|
50 | }
|
51 | }
|
52 |
|
53 | module.exports = HttpProvider;
|