Skip to content

Instantly share code, notes, and snippets.

@chowryan
Created February 16, 2019 00:45
Show Gist options
  • Save chowryan/5be39e6b53605b54db241f0b3f07330f to your computer and use it in GitHub Desktop.
Save chowryan/5be39e6b53605b54db241f0b3f07330f to your computer and use it in GitHub Desktop.
infura_ws_test.js
const WebSocketClient = require('websocket').client;
const client = new WebSocketClient({tlsOptions: {rejectUnauthorized: false}});
let currentBlockFilter = ''
let lastMessageReceived = new Date().getTime()
let lastPing = new Date().getTime()
let lastBlockTime = new Date().getTime()
let totalBlockTime = 0
let blockCount = 0
client.on('connectFailed', function(error) {
console.log('Connect Error: ' + error.toString());
});
client.on('connect', (connection) => {
console.log('Connected to Server...');
const send = (message) => {
if (connection.connected) {
connection.sendUTF(message);
}
}
send(`{"jsonrpc":"2.0","method":"eth_newBlockFilter","params":[],"id":1}`);
connection.on('error', (err) => {
console.log("Connection Error: " + err.toString());
console.log("RETRYING CONNECTION....");
currentBlockFilter = ''
client.connect('wss://mainnet.infura.io/ws')
});
connection.on('close', () => {
console.log('Connection Closed.');
console.log("RETRYING CONNECTION....");
currentBlockFilter = ''
client.connect('wss://mainnet.infura.io/ws')
});
connection.on('message', function(message) {
if (message.type === 'utf8') {
result = JSON.parse(message.utf8Data).result
if (typeof result === 'string') {
currentBlockFilter = result
lastMessageReceived = new Date().getTime()
console.log('****** eth_newBlockFilter ******', result)
send(`{"jsonrpc":"2.0","method":"eth_getFilterChanges","params":["${result}"],"id":1}`)
} else if (Array.isArray(result)) {
if (result.length) {
const currentTime = new Date().getTime()
lastMessageReceived = currentTime
timeSinceLastBlock = currentTime - lastBlockTime
totalBlockTime += timeSinceLastBlock
blockCount += 1
lastBlockTime = currentTime
console.log('****** eth_getFilterChanges ******', result)
console.log('@@@@@@ new block took ', timeSinceLastBlock / 1000, 's')
} else {
// console.log('****** eth_getFilterChanges ******', result)
}
} else {
console.error('UNRECOGNIZED RESULT: ', result)
}
} else {
console.error('MESSAGE ERROR: MESSAGE TYPE NOT UTF8', message)
}
});
connection.on('pong', function(){
// console.log('****** [pingpong] response took', (new Date().getTime() - lastPing) + 'ms');
console.log('$$$$$$ avg block time ', (totalBlockTime / blockCount) / 1000)
})
setInterval(() => {
if (currentBlockFilter) {
lastPing = new Date().getTime();
connection.ping();
}
}, 1000 * 10);
setInterval(() => {
send(`{"jsonrpc":"2.0","method":"eth_getFilterChanges","params":["${currentBlockFilter}"],"id":1}`)
}, 100)
setInterval(() => {
if (currentBlockFilter && lastMessageReceived + 1000 * 60 * 2 < new Date().getTime()) {
console.error('$$$$$ No message with valid data received in last 2 minutes')
currentBlockFilter = ''
client.connect('wss://mainnet.infura.io/ws')
}
}, 1000)
});
client.connect('wss://mainnet.infura.io/ws')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment