Wie kann die zugrunde liegende Web-Socket-Verbindung vom WebSocketProvider verfügbar gemacht werden?

Verwenden von web3.jsVersion 1 (Beta) und Verwenden des WebsocketProviders zum Herstellen einer Verbindung über

const Web3 = require('web3')

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

const { connection } = provider

==> connectionistundefined

Wenn ich mir die Quelle für das anschaue, WebsocketProviderkann ich sehen, dass es ein connectionObjekt hat

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];
      }
    });
  };
}

Seltsamerweise kann ich den Quellcode dafür in GitHub nicht finden, das Obige kommt durch Protokollierungweb3.providers.WebsocketProvider

Fragen

  1. An welcher Stelle wird die Verbindung tatsächlich hergestellt,
  2. Wie kann ich es so verfügbar machen, dass ich Fehler und andere Handler anhängen kann, um eine zuverlässigere Verbindung herzustellen, und
  3. Wo ist der Quellcode dafür, da er nirgendwo in github.com/ethereum/web3.js zu finden ist

Antworten (2)

Lassen Sie mich jede Ihrer Fragen beantworten:

1. An welcher Stelle wird die Verbindung tatsächlich hergestellt

Die Verbindung wird tatsächlich hergestellt, nachdem ein WebsocketProvider-Objekt erstellt wurde. Nehmen Sie einen Ausschnitt aus Ihrem Beispiel:

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

const { connection } = provider

An diesem Punkt muss das Verbindungsobjekt noch initialisiert werden. Folgendes hätten Sie stattdessen tun sollen:

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. wie kann ich es so aussetzen, dass ich Fehler und andere Handler anhängen kann, um eine zuverlässigere Verbindung herzustellen, und

Jetzt haben Sie Zugriff auf das Verbindungsobjekt, Sie können Ihren eigenen Listener an die onmessage, onerroroder anhängen onclose. ABER ich rate dir davon ab. Ich bin mir nicht sicher, was Ihr Anwendungsfall dafür ist, aber die WebsocketProvider-Klasse verarbeitet das Abonnement dieser Ereignishandler ziemlich gut. Wenn Sie ein Zuverlässigkeitsproblem mit dem Websocket-Anbieter haben, mit dem Sie verbunden sind, möchten Sie möglicherweise die Verbindung zu einem anderen ändern.

3. Wo ist der Quellcode dafür, da er nirgendwo in github.com/ethereum/web3.js zu finden ist

Der Code befindet sich tatsächlich in dem Repository, auf das Sie verwiesen haben. Vielleicht möchten Sie zur 1.0Verzweigung wechseln, um den richtigen Code für anzuzeigen web3@1.0.0.

Wo ist der Quellcode dafür, da er nirgendwo in github.com/ethereum/web3.js zu finden ist

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