Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 2 additions & 39 deletions lib/contracts/blockchain.js
Original file line number Diff line number Diff line change
Expand Up @@ -256,45 +256,8 @@ class Blockchain {
if (!self.contractsConfig || !self.contractsConfig.deployment || !self.contractsConfig.deployment.host) {
return next();
}
const origin = self.blockchainConfig.wsOrigins.split(',')[0];
const options = {
protocolVersion: 13,
perMessageDeflate: true,
origin: origin,
host: self.contractsConfig.deployment.host,
port: self.contractsConfig.deployment.port
};
if (self.contractsConfig.deployment.type === 'ws') {
options.headers = {
'Sec-WebSocket-Version': 13,
Connection: 'Upgrade',
Upgrade: 'websocket',
'Sec-WebSocket-Extensions': 'permessage-deflate; client_max_window_bits',
Origin: origin
};
}
let req;
// remove trailing api key from infura, ie rinkeby.infura.io/nmY8WtT4QfEwz2S7wTbl
if(options.host.indexOf('/') > -1){
options.host = options.host.split('/')[0];
}
if((self.contractsConfig.deployment.protocol || 'http') === 'https'){
req = require('https').get(options);
}else{
req = require('http').get(options);
}

req.on('error', (err) => {
next(err);
});

req.on('response', (_response) => {
next();
});

req.on('upgrade', (_res, _socket, _head) => {
next();
});
const {host, port, type, protocol} = self.contractsConfig.deployment;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we handle the case where protocol is not specified in the config, ie default to http? Or possibly amend the default contracts config options to include "protocol": "http"?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

pingEndpoint handles the case where protocol is undefined, but maybe setting as a default in config.js would be a good idea

utils.pingEndpoint(host, port, type, protocol, self.blockchainConfig.wsOrigins.split(',')[0], next);
}
], function (err) {
if (!noLogs && err === NO_NODE_ERROR) {
Expand Down
31 changes: 24 additions & 7 deletions lib/tests/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ const Events = require('../core/events');
const cloneDeep = require('clone-deep');
const AccountParser = require('../contracts/accountParser');
const Provider = require('../contracts/provider');
const utils = require('../utils/utils');

const EmbarkJS = require('../../js/embark_node');

Expand Down Expand Up @@ -44,18 +45,29 @@ class Test {

initWeb3Provider(callback) {
if (this.simOptions.host) {
const protocol = (this.simOptions.type === "rpc") ? 'http' : 'ws';
let {host, port, type, protocol, accounts} = this.simOptions;
if (!protocol) {
protocol = (this.simOptions.type === "rpc") ? 'http' : 'ws';
}
const endpoint = `${protocol}://${host}:${port}`;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could also use utils.buildUrl or utils.buildUrlFromConfig.

const providerOptions = {
web3: this.web3,
type: this.simOptions.type,
accountsConfig: this.simOptions.accounts,
type,
accountsConfig: accounts,
blockchainConfig: this.engine.config.blockchainConfig,
logger: this.engine.logger,
isDev: false,
web3Endpoint: `${protocol}://${this.simOptions.host}:${this.simOptions.port}`
web3Endpoint: endpoint
};
this.provider = new Provider(providerOptions);
return this.provider.startWeb3Provider(callback);
console.info(`Connecting to node at ${endpoint}`.cyan);
return utils.pingEndpoint(host, port, type, protocol, this.engine.config.blockchainConfig.wsOrigins.split(',')[0], (err) => {
if (err) {
console.error(`Error connecting to the node, there might be an error in ${endpoint}`.red);
return callback(err);
}
this.provider = new Provider(providerOptions);
return this.provider.startWeb3Provider(callback);
});
}

if (this.simOptions.accounts) {
Expand Down Expand Up @@ -214,7 +226,12 @@ class Test {
next(null, accounts);
});
}
], callback);
], (err, accounts) => {
if (err) {
process.exit(1);
}
callback(null, accounts);
});
}

_deploy(config, callback) {
Expand Down
42 changes: 42 additions & 0 deletions lib/utils/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,47 @@ function httpsGetJson(url, callback) {
});
}

function pingEndpoint(host, port, type, protocol, origin, callback) {
const options = {
protocolVersion: 13,
perMessageDeflate: true,
origin: origin,
host: host,
port: port
};
if (type === 'ws') {
options.headers = {
'Sec-WebSocket-Version': 13,
Connection: 'Upgrade',
Upgrade: 'websocket',
'Sec-WebSocket-Extensions': 'permessage-deflate; client_max_window_bits',
Origin: origin
};
}
let req;
// remove trailing api key from infura, ie rinkeby.infura.io/nmY8WtT4QfEwz2S7wTbl
if (options.host.indexOf('/') > -1){
options.host = options.host.split('/')[0];
}
if (protocol === 'https') {
req = require('https').get(options);
} else {
req = require('http').get(options);
}

req.on('error', (err) => {
callback(err);
});

req.on('response', (_response) => {
callback();
});

req.on('upgrade', (_res, _socket, _head) => {
callback();
});
}

function runCmd(cmd, options) {
const shelljs = require('shelljs');
let result = shelljs.exec(cmd, options || {silent: true});
Expand Down Expand Up @@ -267,6 +308,7 @@ module.exports = {
httpGetJson: httpGetJson,
httpsGetJson: httpsGetJson,
hexToNumber: hexToNumber,
pingEndpoint,
decodeParams: decodeParams,
runCmd: runCmd,
cd: cd,
Expand Down