const lbryApi = require('../helpers/libraries/lbryApi.js') const db = require('../models') const getAllFreePublicClaims = require('../helpers/functions/getAllFreePublicClaims.js') const isFreePublicClaim = require('../helpers/functions/isFreePublicClaim.js') function getClaimAndHandleResponse (claimUri, resolve, reject) { lbryApi .getClaim(claimUri) .then(({ file_name, download_path, mime_type }) => { resolve({ file_name, file_path: download_path, file_type: mime_type, }) }) .catch(error => { reject(error) }) } module.exports = { getClaimByName (claimName) { const deferred = new Promise((resolve, reject) => { console.log('>> lbryHelpers >> getClaim BasedOnNameOnly:', claimName) // get all free public claims getAllFreePublicClaims(claimName) .then(freePublicClaimList => { const claimId = freePublicClaimList[0].claim_id const name = freePublicClaimList[0].name const freePublicClaimOutpoint = `${freePublicClaimList[0].txid}:${freePublicClaimList[0].nout}` const freePublicClaimUri = name + '#' + claimId console.log('>> Decided on public claim id:', claimId) // check to see if the file is available locally db.File .findOne({ where: { name: name, claim_id: claimId } }) .then(claim => { // if a matching claim is found locally... if (claim) { console.log('>> A matching claim_id was found locally') // if the outpoint's match return it if (claim.dataValues.outpoint === freePublicClaimOutpoint) { console.log('>> Local outpoint matched') resolve(claim.dataValues) // if the outpoint's don't match, fetch updated claim } else { console.log('>> local outpoint did not match') getClaimAndHandleResponse(freePublicClaimUri, resolve, reject) } // ... otherwise use daemon to retrieve it } else { // 'get' the claim getClaimAndHandleResponse(freePublicClaimUri, resolve, reject) } }) .catch(error => { reject(error) }) }) .catch(error => { reject(error) }) }) return deferred }, getClaimByClaimId (claimName, claimId) { const deferred = new Promise((resolve, reject) => { const uri = `${claimName}#${claimId}` console.log('>> lbryHelpers >> getClaimBasedOnUri:', uri) // resolve the Uri lbryApi .resolveUri(uri) // note: use 'spread' and make parallel with db.File.findOne() .then(result => { // note should just be 'result' returned. // get the outpoint const resolvedOutpoint = `${result[uri].claim.txid}:${result[uri].claim.nout}` // check locally for the claim db.File .findOne({ where: { claim_id: claimId } }) .then(claim => { // if a found locally... if (claim) { console.log('>> A matching claim_id was found locally') // if the outpoint's match return it if (claim.dataValues.outpoint === resolvedOutpoint) { console.log('>> Local outpoint matched') resolve(claim.dataValues) // if the outpoint's don't match, fetch updated claim } else { console.log('>> Local outpoint did not match') getClaimAndHandleResponse(uri, resolve, reject) } // ... otherwise use daemon to retrieve it } else { // check to make sure it is free and public (note: no need for another resolve?) if (isFreePublicClaim(result[uri].claim)) { // 'get' the claim getClaimAndHandleResponse(uri, resolve, reject) } else { reject('NO_FREE_PUBLIC_CLAIMS') } } }) .catch(error => { reject(error) }) }) .catch(error => { reject(error) }) }) return deferred }, }