Created
February 16, 2019 00:45
-
-
Save chowryan/5be39e6b53605b54db241f0b3f07330f to your computer and use it in GitHub Desktop.
infura_ws_test.js
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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