const ObservableStore = require('obs-store') const extend = require('xtend') // every three seconds when an incomplete tx is waiting const POLLING_INTERVAL = 3000 class ShapeshiftController { constructor (opts = {}) { const initState = extend({ shapeShiftTxList: [], }, opts.initState) this.store = new ObservableStore(initState) this.pollForUpdates() } // // PUBLIC METHODS // getShapeShiftTxList () { const shapeShiftTxList = this.store.getState().shapeShiftTxList return shapeShiftTxList } getPendingTxs () { const txs = this.getShapeShiftTxList() const pending = txs.filter(tx => tx.response && tx.response.status !== 'complete') return pending } pollForUpdates () { const pendingTxs = this.getPendingTxs() if (pendingTxs.length === 0) { return } Promise.all(pendingTxs.map((tx) => { return this.updateTx(tx) })) .then((results) => { results.forEach(tx => this.saveTx(tx)) this.timeout = setTimeout(this.pollForUpdates.bind(this), POLLING_INTERVAL) }) } async updateTx (tx) { try { const url = `https://shapeshift.io/txStat/${tx.depositAddress}` const response = await fetch(url) const json = await response.json() tx.response = json if (tx.response.status === 'complete') { tx.time = new Date().getTime() } return tx } catch (err) { log.warn(err) } } saveTx (tx) { const { shapeShiftTxList } = this.store.getState() const index = shapeShiftTxList.indexOf(tx) if (index !== -1) { shapeShiftTxList[index] = tx this.store.updateState({ shapeShiftTxList }) } } removeShapeShiftTx (tx) { const { shapeShiftTxList } = this.store.getState() const index = shapeShiftTxList.indexOf(index) if (index !== -1) { shapeShiftTxList.splice(index, 1) } this.updateState({ shapeShiftTxList }) } createShapeShiftTx (depositAddress, depositType) { const state = this.store.getState() let { shapeShiftTxList } = state var shapeShiftTx = { depositAddress, depositType, key: 'shapeshift', time: new Date().getTime(), response: {}, } if (!shapeShiftTxList) { shapeShiftTxList = [shapeShiftTx] } else { shapeShiftTxList.push(shapeShiftTx) } this.store.updateState({ shapeShiftTxList }) this.pollForUpdates() } } module.exports = ShapeshiftController