const debug = require('debug')('ipfs-pinner'); class IpfsPinner { constructor (kredits, ipfsApi) { this.kredits = kredits; this.ipfsApi = ipfsApi || this.kredits.ipfs; } async pinAll () { const contributorHashes = await this._pinAllFromContract(this.kredits.Contributor); const contributionHashes = await this._pinAllFromContract(this.kredits.Contribution); const proposalHashes = await this._pinAllFromContract(this.kredits.Proposal); return contributorHashes.concat(contributionHashes) .concat(proposalHashes); } monitor (callback) { this.kredits.Contribution.on('ContributionAdded', (id) => { this.kredits.Contribution.getData(id) .then(data => { return this.ipfsApi.pin(data); }) .then(callback); }); this.kredits.Contributor.on('ContributorAdded', (id) => { this.kredits.Contribution.getData(id) .then(data => { return this.ipfsApi.pin(data); }) .then(callback); }); this.kredits.Contributor.on('ContributorProfileUpdated', (id) => { this.kredits.Contributor.getData(id) .then(data => { return this.ipfsApi.pin(data); }) .then(callback); }); } _pinAllFromContract (contract) { debug(`Pinning data from ${contract.constructor.name}...`); return contract.count.then(count => { let promises = [...Array(count).keys()].map(i => { let id = i + 1; // 0 => 1 - ids start with 1 and not with 0 debug(`Loading ${contract.constructor.name} #${id}`); return contract.getData(id).then(data => { debug(`Pinning ${contract.constructor.name} #${id}`); return this.ipfsApi.pin(data); }); }); return Promise.all(promises); }); } } module.exports = IpfsPinner;