invoice check backoff
This commit is contained in:
		
							parent
							
								
									9e4f9aa558
								
							
						
					
					
						commit
						a5eb7b5443
					
				@ -165,7 +165,7 @@ export const useInvoiceable = (fn, options = defaultOptions) => {
 | 
			
		||||
  const onConfirmation = useCallback(
 | 
			
		||||
    (onClose, hmac) => {
 | 
			
		||||
      return async ({ id, satsReceived, hash }) => {
 | 
			
		||||
        await sleep(2000)
 | 
			
		||||
        await sleep(500)
 | 
			
		||||
        const repeat = () =>
 | 
			
		||||
          fn(satsReceived, ...fnArgs, hash, hmac)
 | 
			
		||||
            .then(onClose)
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										10
									
								
								lib/time.js
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								lib/time.js
									
									
									
									
									
								
							@ -1,4 +1,4 @@
 | 
			
		||||
export function timeSince (timeStamp) {
 | 
			
		||||
function timeSince (timeStamp) {
 | 
			
		||||
  const now = new Date()
 | 
			
		||||
  const secondsPast = (now.getTime() - timeStamp) / 1000
 | 
			
		||||
  if (secondsPast < 60) {
 | 
			
		||||
@ -20,7 +20,7 @@ export function timeSince (timeStamp) {
 | 
			
		||||
  return 'now'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function datePivot (date,
 | 
			
		||||
function datePivot (date,
 | 
			
		||||
  { years = 0, months = 0, days = 0, hours = 0, minutes = 0, seconds = 0, milliseconds = 0 }) {
 | 
			
		||||
  return new Date(
 | 
			
		||||
    date.getFullYear() + years,
 | 
			
		||||
@ -33,7 +33,7 @@ export function datePivot (date,
 | 
			
		||||
  )
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function timeLeft (timeStamp) {
 | 
			
		||||
function timeLeft (timeStamp) {
 | 
			
		||||
  const now = new Date()
 | 
			
		||||
  const secondsPast = (timeStamp - now.getTime()) / 1000
 | 
			
		||||
 | 
			
		||||
@ -55,4 +55,6 @@ export function timeLeft (timeStamp) {
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export const sleep = (ms) => new Promise((resolve, reject) => setTimeout(resolve, ms))
 | 
			
		||||
const sleep = (ms) => new Promise((resolve, reject) => setTimeout(resolve, ms))
 | 
			
		||||
 | 
			
		||||
module.exports = { timeSince, datePivot, timeLeft, sleep }
 | 
			
		||||
 | 
			
		||||
@ -1,8 +1,10 @@
 | 
			
		||||
const serialize = require('../api/resolvers/serial')
 | 
			
		||||
const { getInvoice, getPayment } = require('ln-service')
 | 
			
		||||
const { datePivot } = require('../lib/time')
 | 
			
		||||
 | 
			
		||||
const walletOptions = { startAfter: 5, retryLimit: 21, retryBackoff: true }
 | 
			
		||||
 | 
			
		||||
// TODO this should all be done via websockets
 | 
			
		||||
function checkInvoice ({ boss, models, lnd }) {
 | 
			
		||||
  return async function ({ data: { hash } }) {
 | 
			
		||||
    let inv
 | 
			
		||||
@ -32,8 +34,10 @@ function checkInvoice ({ boss, models, lnd }) {
 | 
			
		||||
          }
 | 
			
		||||
        }))
 | 
			
		||||
    } else if (new Date(inv.expires_at) > new Date()) {
 | 
			
		||||
      // not expired, recheck in 5 seconds
 | 
			
		||||
      await boss.send('checkInvoice', { hash }, walletOptions)
 | 
			
		||||
      // not expired, recheck in 5 seconds if the invoice is younger than 5 minutes
 | 
			
		||||
      // otherwise recheck in 60 seconds
 | 
			
		||||
      const startAfter = new Date(inv.created_at) > datePivot(new Date(), { minutes: -5 }) ? 5 : 60
 | 
			
		||||
      await boss.send('checkInvoice', { hash }, { ...walletOptions, startAfter })
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@ -76,7 +80,8 @@ function checkWithdrawal ({ boss, models, lnd }) {
 | 
			
		||||
      SELECT reverse_withdrawl(${id}::INTEGER, ${status}::"WithdrawlStatus")`)
 | 
			
		||||
    } else {
 | 
			
		||||
      // we need to requeue to check again in 5 seconds
 | 
			
		||||
      await boss.send('checkWithdrawal', { id, hash }, walletOptions)
 | 
			
		||||
      const startAfter = new Date(wdrwl.created_at) > datePivot(new Date(), { minutes: -5 }) ? 5 : 60
 | 
			
		||||
      await boss.send('checkWithdrawal', { id, hash }, { ...walletOptions, startAfter })
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user