diff --git a/services/gunDB/contact-api/jobs/onOrders.js b/services/gunDB/contact-api/jobs/onOrders.js index ae048abe..ad757ccc 100644 --- a/services/gunDB/contact-api/jobs/onOrders.js +++ b/services/gunDB/contact-api/jobs/onOrders.js @@ -12,6 +12,8 @@ const { Schema } = Common const { assertNever } = require('assert-never') +const crypto = require('crypto') +const fetch = require('node-fetch') const LightningServices = require('../../../../utils/lightningServices') const { @@ -321,7 +323,72 @@ const listenerForAddr = (addr, SEA) => async (order, orderID) => { } else if (order.targetType === 'spontaneousPayment') { // no action required } else if (order.targetType === 'torrentSeed') { - // TODO + logger.debug('TORRENT') + const numberOfTokens = Number(order.ackInfo) + if (isNaN(numberOfTokens)) { + logger.error('ackInfo provided is not a valid number') + return + } + const seedUrl = process.env.TORRENT_SEED_URL + const seedToken = process.env.TORRENT_SEED_TOKEN + if (!seedUrl || !seedToken) { + logger.error('torrentSeed service not available') + return + } + logger.debug('SEED URL OK') + const tokens = Array(numberOfTokens) + for (let i = 0; i < numberOfTokens; i++) { + tokens[i] = crypto.randomBytes(32).toString('hex') + } + /**@param {string} token */ + const enrollToken = async token => { + const reqData = { + seed_token: seedToken, + wallet_token: token + } + // @ts-expect-error TODO + const res = await fetch(`${seedUrl}/api/enroll_token`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(reqData) + }) + if (res.status !== 200) { + throw new Error('torrentSeed service currently not available') + } + } + await Promise.all(tokens.map(enrollToken)) + logger.debug('RES SEED OK') + const ackData = { seedUrl, tokens } + const toSend = JSON.stringify(ackData) + const encrypted = await SEA.encrypt(toSend, secret) + const serviceResponse = { + type: 'orderAck', + response: encrypted + } + console.log('RES SEED SENT') + + const uuid = gunUUID() + orderResponse.ackNode = uuid + + await /** @type {Promise} */ (new Promise((res, rej) => { + getUser() + .get(Key.ORDER_TO_RESPONSE) + .get(uuid) + .put(serviceResponse, ack => { + if (ack.err && typeof ack.err !== 'number') { + rej( + new Error( + `Error saving encrypted orderAck to order to response usergraph: ${ack}` + ) + ) + } else { + res() + } + }) + })) + logger.debug('RES SENT SEED') } else if (order.targetType === 'other') { // TODO } else {