123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- const Q = require('bluebird');
- const EventEmitter = require('events').EventEmitter;
- const got = require('got');
- const SocketBase = require('./base');
- const STATE = SocketBase.STATE;
- const Web3SocketBase = require('./web3Base');
- class HttpSocket extends EventEmitter {
- constructor(_parentSocket) {
- super();
- this._log = _parentSocket._log.create('HttpSocket');
- }
- connect(connectConfig) {
- this._log.trace('Connect', connectConfig);
- this._hostPort = connectConfig.hostPort;
- const payload = JSON.stringify({
- jsonrpc: '2.0',
- id: 0,
- method: 'eth_accounts',
- params: []
- });
- this._call(payload)
- .then(() => {
- this._log.trace('Connection successful');
- this.emit('connect');
- })
- .catch(err => {
- this._log.trace('Connection failed', err);
- this.emit.bind(this, new Error('Unable to connect to HTTP RPC'));
- });
- }
- destroy() {
- this._log.trace('Destroy');
- this._hostPort = null;
- this.emit('close');
- }
- write(data) {
- this._log.trace('Write data', data);
- this._call(data)
- .then(body => {
- this._log.trace('Got response', body);
- this.emit('data', body);
- })
- .catch(this.emit.bind(this, 'error'));
- }
- setEncoding(enc) {
- this._log.trace('Set encoding', enc);
- this._encoding = enc;
- }
- _call(dataStr) {
- return got
- .post(this._hostPort, {
- encoding: this._encoding,
- headers: {
- 'Content-Type': 'application/json'
- },
- body: dataStr
- })
- .then(res => {
- return res.body;
- });
- }
- }
- module.exports = class Web3HttpSocket extends Web3SocketBase {
- /**
- * Reset socket.
- */
- _resetSocket() {
- this._log.debug('Resetting socket');
- return Q.try(() => {
- if (STATE.CONNECTED === this._state) {
- this._log.debug('Disconnecting prior to reset');
- return this.disconnect();
- }
- }).then(() => {
- this._socket = new HttpSocket(this);
- this._socket.setEncoding('utf8');
- this._socket.on('close', hadError => {
- // if we did the disconnection then all good
- if (STATE.DISCONNECTING === this._state) {
- return;
- }
- this.emit('close', hadError);
- });
- this._socket.on('data', data => {
- this._log.trace('Got data');
- this.emit('data', data);
- });
- this._socket.on('error', err => {
- // connection errors will be handled in connect() code
- if (STATE.CONNECTING === this._state) {
- return;
- }
- this._log.error(err);
- this.emit('error', err);
- });
- });
- }
- };
|