feat: add digest auth request queueing
This commit is contained in:
parent
3c33695b9d
commit
f660d60e2d
2 changed files with 115 additions and 13 deletions
|
|
@ -11,7 +11,7 @@ const options = require('../../options')
|
||||||
const blockchainDir = options.blockchainDir
|
const blockchainDir = options.blockchainDir
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
fetch, fetchDigest, parseConf, rpcConfig
|
fetch, fetchDigest, createDigestRequest, parseConf, rpcConfig
|
||||||
}
|
}
|
||||||
|
|
||||||
function fetch (account = {}, method, params) {
|
function fetch (account = {}, method, params) {
|
||||||
|
|
@ -49,6 +49,114 @@ function fetch (account = {}, method, params) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var fetchDigestRequestQueue = []
|
||||||
|
var fetchDigestResponses = {}
|
||||||
|
|
||||||
|
function createDigestRequest (account = {}, method, params = []) {
|
||||||
|
const requestId = uuid.v4()
|
||||||
|
|
||||||
|
fetchDigestRequestQueue.push({
|
||||||
|
requestId,
|
||||||
|
options: generateDigestOptions(account, method, params, requestId),
|
||||||
|
status: 'sendPending'
|
||||||
|
})
|
||||||
|
fetchDigestResponses[requestId] = { status: 'receivePending' }
|
||||||
|
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
setTimeout(() => {
|
||||||
|
const request = _.find(it => it.requestId === requestId, fetchDigestRequestQueue)
|
||||||
|
const response = fetchDigestResponses[requestId]
|
||||||
|
|
||||||
|
if (_.isNil(response) || request.status === 'sendError') {
|
||||||
|
fetchDigestResponses[requestId].status = 'receiveError'
|
||||||
|
return reject()
|
||||||
|
}
|
||||||
|
fetchDigestResponses[requestId].status = 'finished'
|
||||||
|
return resolve(response)
|
||||||
|
}, 750)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function generateDigestOptions (account = {}, method, params, requestId) {
|
||||||
|
const headers = {
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
}
|
||||||
|
|
||||||
|
const dataString = `{"jsonrpc":"2.0","id":"${requestId}","method":"${method}","params":${JSON.stringify(params)}}`
|
||||||
|
|
||||||
|
const options = {
|
||||||
|
url: `http://localhost:${account.port}/json_rpc`,
|
||||||
|
method: 'POST',
|
||||||
|
headers,
|
||||||
|
body: dataString,
|
||||||
|
forever: true,
|
||||||
|
auth: {
|
||||||
|
user: account.username,
|
||||||
|
pass: account.password,
|
||||||
|
sendImmediately: false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return options
|
||||||
|
}
|
||||||
|
|
||||||
|
function executeRequestQueue (queue) {
|
||||||
|
return _.reduce(
|
||||||
|
(acc, value) => acc.then(a => {
|
||||||
|
const originalReq = _.find(it => it.requestId === value.requestId, queue)
|
||||||
|
switch (originalReq.status) {
|
||||||
|
case 'sendPending':
|
||||||
|
return request(value.options)
|
||||||
|
.then(res => {
|
||||||
|
originalReq.status = 'sendComplete'
|
||||||
|
return Promise.resolve(
|
||||||
|
_.merge(a, { [value.requestId]: { status: 'receiveComplete', ...JSON.parse(res).result } })
|
||||||
|
)
|
||||||
|
})
|
||||||
|
.catch(err => {
|
||||||
|
originalReq.status = 'sendError'
|
||||||
|
throw err
|
||||||
|
})
|
||||||
|
case 'sendComplete':
|
||||||
|
return Promise.resolve({ ...a })
|
||||||
|
case 'sendError':
|
||||||
|
return Promise.resolve({ ...a })
|
||||||
|
default:
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
Promise.resolve(fetchDigestResponses),
|
||||||
|
queue
|
||||||
|
).then(r => {
|
||||||
|
fetchDigestResponses = r
|
||||||
|
return fetchDigestResponses
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function trimReqRes () {
|
||||||
|
const requestIds = _.keys(fetchDigestResponses)
|
||||||
|
_.forEach(it => {
|
||||||
|
const request = _.find(ite => ite.requestId === it, fetchDigestRequestQueue)
|
||||||
|
const response = fetchDigestResponses[it]
|
||||||
|
|
||||||
|
if (request && response && response.status === 'finished' && request.status === 'sendComplete') {
|
||||||
|
fetchDigestRequestQueue = _.filter(ite => ite.requestId !== it, fetchDigestRequestQueue)
|
||||||
|
delete fetchDigestResponses[it]
|
||||||
|
}
|
||||||
|
}, requestIds)
|
||||||
|
}
|
||||||
|
|
||||||
|
setInterval(
|
||||||
|
() => {
|
||||||
|
if (_.size(fetchDigestRequestQueue) === 0 && _.size(_.keys(fetchDigestResponses)) === 0) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
trimReqRes()
|
||||||
|
return executeRequestQueue(fetchDigestRequestQueue)
|
||||||
|
},
|
||||||
|
500
|
||||||
|
)
|
||||||
|
|
||||||
function fetchDigest(account = {}, method, params = []) {
|
function fetchDigest(account = {}, method, params = []) {
|
||||||
return Promise.resolve(true)
|
return Promise.resolve(true)
|
||||||
.then(() => {
|
.then(() => {
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,6 @@ const blockchainDir = options.blockchainDir
|
||||||
const cryptoRec = utils.getCryptoCurrency(COINS.XMR)
|
const cryptoRec = utils.getCryptoCurrency(COINS.XMR)
|
||||||
const configPath = utils.configPath(cryptoRec, blockchainDir)
|
const configPath = utils.configPath(cryptoRec, blockchainDir)
|
||||||
const walletDir = path.resolve(utils.cryptoDir(cryptoRec, blockchainDir), 'wallets')
|
const walletDir = path.resolve(utils.cryptoDir(cryptoRec, blockchainDir), 'wallets')
|
||||||
const unitScale = cryptoRec.unitScale
|
|
||||||
|
|
||||||
function rpcConfig () {
|
function rpcConfig () {
|
||||||
try {
|
try {
|
||||||
|
|
@ -31,7 +30,7 @@ function rpcConfig () {
|
||||||
}
|
}
|
||||||
|
|
||||||
function fetch (method, params) {
|
function fetch (method, params) {
|
||||||
return jsonRpc.fetchDigest(rpcConfig(), method, params)
|
return jsonRpc.createDigestRequest(rpcConfig(), method, params)
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleError (error, method) {
|
function handleError (error, method) {
|
||||||
|
|
@ -151,14 +150,9 @@ function getStatus (account, tx, requested, settings, operatorId) {
|
||||||
function newFunding (account, cryptoCode, settings, operatorId) {
|
function newFunding (account, cryptoCode, settings, operatorId) {
|
||||||
return checkCryptoCode(cryptoCode)
|
return checkCryptoCode(cryptoCode)
|
||||||
.then(() => refreshWallet())
|
.then(() => refreshWallet())
|
||||||
.then(() => fetch('get_balance', { account_index: 0, address_indices: [0] }))
|
.then(() => Promise.all([
|
||||||
.then(balanceRes => Promise.all([
|
fetch('get_balance', { account_index: 0, address_indices: [0] }),
|
||||||
balanceRes,
|
fetch('create_address', { account_index: 0 }),
|
||||||
fetch('create_address', { account_index: 0 })
|
|
||||||
]))
|
|
||||||
.then(([balanceRes, addressRes]) => Promise.all([
|
|
||||||
balanceRes,
|
|
||||||
addressRes,
|
|
||||||
fetch('get_transfers', { pool: true, account_index: 0 })
|
fetch('get_transfers', { pool: true, account_index: 0 })
|
||||||
]))
|
]))
|
||||||
.then(([balanceRes, addressRes, transferRes]) => {
|
.then(([balanceRes, addressRes, transferRes]) => {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue