Использование 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. В какой момент на самом деле происходит подключение
Соединение фактически устанавливается после создания объекта 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