Как открыть базовое соединение с веб-сокетом из WebSocketProvider?

Использование web3.jsверсии 1 (бета) и использование WebsocketProvider для установления соединения через

const Web3 = require('web3')

const web3 = new Web3('ws://localhost:8546')
const provider = web3.providers.WebsocketProvider

const { connection } = provider

==> connectionестьundefined

Глядя на источник, WebsocketProviderя вижу, что у него есть connectionобъект

function WebsocketProvider(url)  {
  var _this = this;
  this.responseCallbacks = {};
  this.notificationCallbacks = [];
  this.connection = new Ws(url);

  this.addDefaultEvents();

  // LISTEN FOR CONNECTION RESPONSES
  this.connection.onmessage = function(e) {
    /*jshint maxcomplexity: 6 */
    var data = (typeof e.data === 'string') ? e.data : '';

    _this._parseResponse(data).forEach(function(result){

      var id = null;

      // get the id which matches the returned id
      if(_.isArray(result)) {
          result.forEach(function(load){
              if(_this.responseCallbacks[load.id])
                  id = load.id;
          });
      } else {
          id = result.id;
      }

      // notification
      if(!id && result.method.indexOf('_subscription') !== -1) {
          _this.notificationCallbacks.forEach(function(callback){
              if(_.isFunction(callback))
                  callback(null, result);
          });

          // fire the callback
      } else if(_this.responseCallbacks[id]) {
          _this.responseCallbacks[id](null, result);
          delete _this.responseCallbacks[id];
      }
    });
  };
}

Любопытно, что я не могу найти исходный код для этого в GitHub, вышеизложенное происходит путем регистрацииweb3.providers.WebsocketProvider

Вопросы

  1. В какой момент на самом деле происходит соединение,
  2. как я могу выставить его так, чтобы я мог прикрепить ошибку и другие обработчики, чтобы сделать более надежное соединение, и
  3. Где исходный код для этого, учитывая, что его нигде нет на github.com/ethereum/web3.js

Ответы (2)

Позвольте мне ответить на каждый из ваших вопросов:

1. В какой момент на самом деле происходит подключение

Соединение фактически устанавливается после создания объекта WebsocketProvider. Взяв фрагмент из вашего примера:

const web3 = new Web3('ws://localhost:8546')
const provider = web3.providers.WebsocketProvider

const { connection } = provider

На данный момент объект подключения еще не инициализирован. Вот что вы должны были сделать вместо этого:

const provider = new web3.providers.WebsocketProvider('ws://localhost:8546')
const { connection } = provider

// then you can initialize your web3 with the provider like so
const web3 = new Web3(provider)

2. как я могу выставить его так, чтобы я мог прикрепить ошибки и другие обработчики, чтобы сделать более надежное соединение, и

Теперь у вас есть доступ к объекту подключения, вы можете прикрепить свой собственный слушатель к объекту onmessage, onerrorили onclose. НО, я советую вам не делать этого. Я не уверен, каков ваш вариант использования для этого, но класс WebsocketProvider довольно хорошо обрабатывает подписку на эти обработчики событий. Если у вас возникли проблемы с надежностью поставщика веб-сокетов, к которому вы подключены, вы можете изменить соединение на другое.

3. Где исходный код для этого, учитывая, что его нигде нет на github.com/ethereum/web3.js

Код на самом деле находится в репозитории, на который вы указали. Возможно, вы захотите переключиться на 1.0ветку, чтобы увидеть правильный код для web3@1.0.0.

Где исходный код для этого, учитывая, что его нигде нет на github.com/ethereum/web3.js

https://github.com/HaoLLL/web3-eth-contract/blob/master/src/index.js