diff --git a/js/embark.js b/js/embark.js index 1d2fec12..87b1e8cf 100644 --- a/js/embark.js +++ b/js/embark.js @@ -230,7 +230,22 @@ EmbarkJS.Storage.setProvider = function(provider, options) { return providerObj.setProvider(options); }; +EmbarkJS.Storage.setProviders = function(provider, dappConnOptions) { + let providerObj = this.Providers[provider]; + + if (!providerObj) { + throw new Error('Unknown storage provider'); + } + + this.currentStorage = providerObj; + + return providerObj.setProviders(dappConnOptions); +}; + EmbarkJS.Storage.isAvailable = function(){ + if (!this.currentStorage) { + throw new Error('Storage provider not set; e.g EmbarkJS.Storage.setProvider("ipfs")'); + } return this.currentStorage.isAvailable(); }; diff --git a/lib/core/config.js b/lib/core/config.js index e150397c..5f66d6b8 100644 --- a/lib/core/config.js +++ b/lib/core/config.js @@ -207,7 +207,7 @@ Config.prototype.loadExternalContractsFiles = function() { }; Config.prototype.loadStorageConfigFile = function() { - var versions = utils.recursiveMerge({"ipfs-api": "17.2.4"}, this.embarkConfig.versions || {}); + var versions = utils.recursiveMerge({"ipfs-api": "17.2.4", "p-iteration": "1.1.7"}, this.embarkConfig.versions || {}); var configObject = { "default": { @@ -215,11 +215,13 @@ Config.prototype.loadStorageConfigFile = function() { "enabled": true, "available_providers": ["ipfs", "swarm"], "ipfs_bin": "ipfs", - "provider": "ipfs", - "protocol": "http", - "host": "localhost", - "port": 5001, - "getUrl": "http://localhost:8080/ipfs/" + "upload": { + "provider": "ipfs", + "protocol": "http", + "host": "localhost", + "port": 5001, + "getUrl": "http://localhost:8080/ipfs/" + } } }; diff --git a/lib/core/engine.js b/lib/core/engine.js index 37ca5c0e..7cf14908 100644 --- a/lib/core/engine.js +++ b/lib/core/engine.js @@ -105,10 +105,9 @@ class Engine { "deployment": this.deploymentService, "fileWatcher": this.fileWatchService, "webServer": this.webServerService, - "ipfs": this.ipfsService, "web3": this.web3Service, "libraryManager": this.libraryManagerService, - "swarm": this.swarmService + "storage": this.storageService }; let service = services[serviceName]; @@ -133,8 +132,8 @@ class Engine { logger: this.logger, plugins: this.plugins }); - this.events.on('code-generator-ready', function () { + console.log('CODE GENERATOR READY EVENT FIRED'); self.events.request('code', function (abi, contractsJSON) { pipeline.build(abi, contractsJSON, null, () => { if (self.watch) { @@ -263,16 +262,13 @@ class Engine { }); } - ipfsService(_options) { + storageService(_options) { this.registerModule('ipfs', { addCheck: this.servicesMonitor.addCheck.bind(this.servicesMonitor), storageConfig: this.config.storageConfig, host: _options.host, port: _options.port }); - } - - swarmService(_options) { this.registerModule('swarm', { addCheck: this.servicesMonitor.addCheck.bind(this.servicesMonitor), storageConfig: this.config.storageConfig, diff --git a/lib/i18n/locales/en.json b/lib/i18n/locales/en.json index f23f3a21..33b0e605 100644 --- a/lib/i18n/locales/en.json +++ b/lib/i18n/locales/en.json @@ -127,5 +127,10 @@ "Cannot upload: {{platform}} node is not running on {{protocol}}://{{host}}:{{port}}.": "Cannot upload: {{platform}} node is not running on {{protocol}}://{{host}}:{{port}}.", "Error while downloading the file": "Error while downloading the file", "Error while loading the content of ": "Error while loading the content of ", - "no contracts found": "no contracts found" + "no contracts found": "no contracts found", + "IPFS node is offline": "IPFS node is offline", + "IPFS node detected": "IPFS node detected", + "Webserver is offline": "Webserver is offline", + "DApp path length is too long: \"": "DApp path length is too long: \"", + "This is known to cause issues with some applications, please consider reducing your DApp path's length to 66 characters or less.": "This is known to cause issues with some applications, please consider reducing your DApp path's length to 66 characters or less." } \ No newline at end of file diff --git a/lib/index.js b/lib/index.js index a4a809e1..354947b6 100644 --- a/lib/index.js +++ b/lib/index.js @@ -122,10 +122,9 @@ class Embark { engine.startService("web3"); engine.startService("pipeline"); engine.startService("deployment"); + engine.startService('storage'); engine.startService("codeGenerator"); - // TODO: this should be just 'storage' and the storage should figure out the module - engine.startService(engine.config.storageConfig.provider); - + engine.events.on('check:backOnline:Ethereum', function () { engine.logger.info(__('Ethereum node detected') + '..'); engine.config.reloadConfig(); @@ -198,10 +197,8 @@ class Embark { engine.startService("web3"); engine.startService("pipeline"); engine.startService("deployment", {onlyCompile: options.onlyCompile}); + engine.startService("storage"); engine.startService("codeGenerator"); - // TODO: this should be just 'storage' and the storage should figure out the modules to load - engine.startService("ipfs"); - engine.startService("swarm"); callback(); }, function deploy(callback) { @@ -254,8 +251,8 @@ class Embark { engine.startService("libraryManager"); engine.startService("pipeline"); engine.startService("deployment", {onlyCompile: true}); + engine.startService("codeGenerator"); - engine.deployManager.deployContracts(function (err) { callback(err); }); @@ -304,7 +301,7 @@ class Embark { }); engine.init(); - let platform = engine.config.storageConfig.provider; + let platform = engine.config.storageConfig.upload.provider; let cmdPlugin; async.waterfall([ @@ -316,9 +313,8 @@ class Embark { engine.startService("web3"); engine.startService("pipeline"); engine.startService("deployment"); + engine.startService('storage'); engine.startService("codeGenerator"); - // TODO: this should be just 'storage' and the storage should figure out the modules to load - engine.startService(platform.toLowerCase()); engine.startMonitor(); callback(); }, @@ -335,7 +331,8 @@ class Embark { } checkFn.fn(function (serviceCheckResult) { if (!serviceCheckResult.status || serviceCheckResult.status === 'off') { - return callback({message: __('Cannot upload: {{platform}} node is not running on {{protocol}}://{{host}}:{{port}}.', {platform: platform, protocol: engine.config.storageConfig.protocol, host: engine.config.storageConfig.host, port: engine.config.storageConfig.port})}); + let config = engine.config.storageConfig.upload; + return callback({message: __('Cannot upload: {{platform}} node is not running on {{protocol}}://{{host}}:{{port}}.', {platform: platform, protocol: config.protocol, host: config.host, port: config.port})}); } callback(); }); @@ -357,8 +354,7 @@ class Embark { }); } if (!cmdPlugin) { - engine.logger.info(__('try "{{ipfs}}" or "{{swarm}}"', {ipfs: 'embark upload ipfs', swarm: 'embark upload swarm'}).green); - return callback({message: 'unknown platform: ' + platform}); + return callback({message: __('platform "{{platform}}" is specified as the upload provider, however no plugins have registered an upload command for "{{platform}}".', {platform: platform})}); } callback(); }, diff --git a/lib/modules/ipfs/embarkjs.js b/lib/modules/ipfs/embarkjs.js index 1c374cb5..b90ca176 100644 --- a/lib/modules/ipfs/embarkjs.js +++ b/lib/modules/ipfs/embarkjs.js @@ -1,4 +1,5 @@ import IpfsApi from 'ipfs-api'; +//import {some} from 'p-iteration'; let __embarkIPFS = {}; @@ -10,7 +11,7 @@ __embarkIPFS.setProvider = function (options) { self.ipfsConnection = IpfsApi('localhost', '5001'); self._getUrl = "http://localhost:8080/ipfs/"; } else { - var ipfsOptions = {host: options.server, protocol: 'http'}; + var ipfsOptions = {host: options.host || options.server, protocol: 'http'}; if (options.protocol) { ipfsOptions.protocol = options.protocol; } @@ -22,7 +23,7 @@ __embarkIPFS.setProvider = function (options) { } resolve(self); } catch (err) { - console.log(err); + console.error(err); self.ipfsConnection = null; reject(new Error('Failed to connect to IPFS')); } @@ -30,6 +31,29 @@ __embarkIPFS.setProvider = function (options) { return promise; }; +__embarkIPFS.setProviders = async function (dappConnOptions) { + var self = this; + try { + let workingConnFound = await some(dappConnOptions, async (dappConn) => { + if(dappConn === '$BZZ' || dappConn.provider !== 'ipfs') return false; // swarm has no bearing for ipfs plugin, continue + else { + // set the provider then check the connection, if true, use that provider, else, check next provider + try{ + await self.setProvider(dappConn); + return await self.isAvailable(); + } catch(err) { + return false; + } + } + }); + if(!workingConnFound) throw new Error('Could not connect to IPFS using any of the dappConnections in the storage config'); + else return self; + } catch (err) { + self.ipfsConnection = null; + throw new Error('Failed to connect to IPFS: ' + err.message); + } +}; + __embarkIPFS.saveText = function (text) { const self = this; var promise = new Promise(function (resolve, reject) { @@ -119,3 +143,4 @@ __embarkIPFS.getUrl = function (hash) { return (this._getUrl || "http://localhost:8080/ipfs/") + hash; }; + diff --git a/lib/modules/ipfs/index.js b/lib/modules/ipfs/index.js index bccd839c..234fc33c 100644 --- a/lib/modules/ipfs/index.js +++ b/lib/modules/ipfs/index.js @@ -3,6 +3,7 @@ let utils = require('../../utils/utils.js'); let fs = require('../../core/fs.js'); let RunCode = require('../../coderunner/runCode'); let IpfsApi = require('ipfs-api'); +const _ = require('underscore'); class IPFS { @@ -11,8 +12,9 @@ class IPFS { this.events = embark.events; this.buildDir = options.buildDir; this.storageConfig = options.storageConfig; - this.host = options.host || this.storageConfig.host; - this.port = options.port || this.storageConfig.port; + this.host = options.host || this.storageConfig.upload.host; + this.port = options.port || this.storageConfig.upload.port; + this.protocol = options.protocol || this.storageConfig.upload.protocol; this.addCheck = options.addCheck; this.embark = embark; @@ -41,7 +43,7 @@ class IPFS { if (!storageConfig.enabled) { return; } - if (storageConfig.provider !== 'ipfs' && storageConfig.available_providers.indexOf("ipfs") < 0) { + if (storageConfig.upload.provider !== 'ipfs' || storageConfig.available_providers.indexOf("ipfs") < 0) { return; } @@ -59,7 +61,13 @@ class IPFS { self.addCheck('IPFS', function (cb) { self.logger.trace("Checking IPFS version..."); - utils.httpGetJson('http://' + self.host + ':' + self.port + '/api/v0/version', function (err, body) { + let url = (self.protocol || 'http') + '://' + self.host + ':' + self.port + '/api/v0/version'; + if(self.protocol !== 'https'){ + utils.httpGetJson(url, versionCb); + } else { + utils.httpsGetJson(url, versionCb); + } + function versionCb(err, body) { if (err) { self.logger.trace("Check IPFS version error: " + err); return cb({name: "IPFS ", status: 'off'}); @@ -68,7 +76,7 @@ class IPFS { return cb({name: ("IPFS " + body.Version), status: 'on'}); } return cb({name: "IPFS ", status: 'on'}); - }); + } }); } @@ -79,7 +87,7 @@ class IPFS { return; } - if ((this.storageConfig.available_providers.indexOf('ipfs') < 0) && (this.storageConfig.provider !== 'ipfs' || this.storageConfig.enabled !== true)) { + if (this.storageConfig.available_providers.indexOf('ipfs') < 0 || _.findWhere(this.storageConfig.dappConnection, {'provider': 'ipfs'}) === undefined || this.storageConfig.enabled !== true) { return; } @@ -92,6 +100,15 @@ class IPFS { } }); + self.events.request("version:get:p-iteration", function(pIterationVersion) { + let currentPIterationVersion = require('../../../package.json').dependencies["p-iteration"]; + if (pIterationVersion !== currentPIterationVersion) { + self.events.request("version:getPackageLocation", "p-iteration", pIterationVersion, function(err, location) { + self.embark.registerImportFile("p-iteration", fs.dappPath(location)); + }); + } + }); + let code = ""; code += "\n" + fs.readFileSync(utils.joinPath(__dirname, 'embarkjs.js')).toString(); code += "\nEmbarkJS.Storage.registerProvider('ipfs', __embarkIPFS);"; @@ -100,16 +117,10 @@ class IPFS { } addSetProvider() { - let config = JSON.stringify({ - server: this.storageConfig.host, - port: this.storageConfig.port, - protocol: this.storageConfig.protocol, - getUrl: this.storageConfig.getUrl - }); - let code = "\nEmbarkJS.Storage.setProvider('ipfs'," + config + ");"; + let code = "\nEmbarkJS.Storage.setProviders('ipfs'," + JSON.stringify(this.storageConfig.dappConnection) + ");"; let shouldInit = (storageConfig) => { - return (storageConfig.provider === 'ipfs' && storageConfig.enabled === true); + return (this.storageConfig.dappConnection !== undefined && this.storageConfig.dappConnection.some((dappConn) => dappConn.provider === 'ipfs') && storageConfig.enabled === true); }; this.embark.addProviderInit('storage', code, shouldInit); diff --git a/lib/modules/swarm/embarkjs.js b/lib/modules/swarm/embarkjs.js index 9a415258..78d163ec 100644 --- a/lib/modules/swarm/embarkjs.js +++ b/lib/modules/swarm/embarkjs.js @@ -1,20 +1,19 @@ /*global web3 */ let __embarkSwarm = {}; const bytes = require("eth-lib/lib/bytes"); +import {some} from 'p-iteration'; __embarkSwarm.setProvider = function (options) { this.bzz = web3.bzz; - this.protocol = options.protocol; - this.host = options.host; - this.port = options.port; - this.connectUrl = `${options.protocol}://${options.host}:${options.port}`; + this.protocol = options.protocol || 'http'; + this.connectUrl = `${this.protocol}://${options.host}:${options.port}`; this.connectError = new Error(`Cannot connect to Swarm node on ${this.connectUrl}`); - this._getUrl = options.getUrl || `${this.connectUrl}/bzzr:/`; + //this._getUrl = options.getUrl || `${this.connectUrl}/bzzr:/`; return new Promise((resolve, reject) => { try { if (!this.bzz.currentProvider) { - this.bzz.setProvider(`${options.protocol}://${options.host}:${options.port}`); + this.bzz.setProvider(this.connectUrl); } resolve(this); } catch (err) { @@ -24,6 +23,28 @@ __embarkSwarm.setProvider = function (options) { }); }; +__embarkSwarm.setProviders = async function (dappConnOptions) { + var self = this; + try { + let workingConnFound = await some(dappConnOptions, async (dappConn) => { + if(dappConn === '$BZZ'){ + return self.isAvailable(); + } + else if(dappConn.provider === 'swarm') + { + // set the provider then check the connection, if true, use that provider, else, check next provider + await self.setProvider(dappConn); + return self.isAvailable(); + } + else return false; + }); + if(!workingConnFound) throw new Error('Could not connect to Swarm using any of the dappConnections in the storage config'); + else return self; + } catch (err) { + throw new Error('Failed to connect to Swarm: ' + err.message); + } +}; + __embarkSwarm.isAvailable = function () { return new Promise((resolve, reject) => { if (!this.bzz) { diff --git a/lib/modules/swarm/index.js b/lib/modules/swarm/index.js index a8901cc1..f336c0f7 100644 --- a/lib/modules/swarm/index.js +++ b/lib/modules/swarm/index.js @@ -9,8 +9,9 @@ class Swarm { this.events = embark.events; this.buildDir = options.buildDir; this.storageConfig = options.storageConfig; - this.host = options.host || this.storageConfig.host; - this.port = options.port || this.storageConfig.port; + this.host = options.host || options.storageConfig.upload.host; + this.port = options.port || options.storageConfig.upload.port; + this.protocol = options.protocol || options.storageConfig.upload.protocol; this.addCheck = options.addCheck; this.embark = embark; this.bzz = options.bzz; @@ -24,7 +25,7 @@ class Swarm { initSwarmProvider(){ if(!this.bzz.currentProvider) { - this.bzz.setProvider(`http://${this.host}:${this.port}`); + this.bzz.setProvider(`${this.protocol}://${this.host}:${this.port}`); } } @@ -47,7 +48,7 @@ class Swarm { if (!storageConfig.enabled) { return; } - if (storageConfig.provider !== 'swarm' && storageConfig.available_providers.indexOf("swarm") < 0) { + if (storageConfig.upload.provider !== 'swarm' || storageConfig.available_providers.indexOf("swarm") < 0) { return; } @@ -76,15 +77,25 @@ class Swarm { } addSwarmToEmbarkJS() { + let self = this; // TODO: make this a shouldAdd condition if (this.storageConfig === {}) { return; } - if ((this.storageConfig.available_providers.indexOf('swarm') < 0) && (this.storageConfig.provider !== 'swarm' || this.storageConfig.enabled !== true)) { + if (this.storageConfig.available_providers.indexOf('swarm') < 0 || this.storageConfig.enabled !== true) { return; } + this.events.request("version:get:p-iteration", function(pIterationVersion) { + let currentPIterationVersion = require('../../../package.json').dependencies["p-iteration"]; + if (pIterationVersion !== currentPIterationVersion) { + self.events.request("version:getPackageLocation", "p-iteration", pIterationVersion, function(err, location) { + self.embark.registerImportFile("p-iteration", fs.dappPath(location)); + }); + } + }); + let code = ""; code += "\n" + fs.readFileSync(utils.joinPath(__dirname, 'embarkjs.js')).toString(); code += "\nEmbarkJS.Storage.registerProvider('swarm', __embarkSwarm);"; @@ -93,16 +104,10 @@ class Swarm { } addSetProvider() { - let config = JSON.stringify({ - host: this.storageConfig.host, - port: this.storageConfig.port, - protocol: this.storageConfig.protocol, - getUrl: this.storageConfig.getUrl - }); - let code = "\nEmbarkJS.Storage.setProvider('swarm'," + config + ");"; + let code = "\nEmbarkJS.Storage.setProviders('swarm'," + JSON.stringify(this.storageConfig.dappConnection) + ");"; let shouldInit = (storageConfig) => { - return (storageConfig.provider === 'swarm' && storageConfig.enabled === true); + return (this.storageConfig.dappConnection !== undefined && this.storageConfig.dappConnection.some((dappConn) => dappConn.provider === 'swarm') && storageConfig.enabled === true); }; this.embark.addProviderInit('storage', code, shouldInit); diff --git a/lib/utils/utils.js b/lib/utils/utils.js index f9b0c244..ea3e1a3e 100644 --- a/lib/utils/utils.js +++ b/lib/utils/utils.js @@ -69,6 +69,17 @@ function httpGetJson(url, callback) { }); } +function httpsGetJson(url, callback) { + httpGetRequest(https, url, function(err, body) { + try { + let parsed = JSON.parse(body); + return callback(err, parsed); + } catch(e) { + return callback(e); + } + }); +} + function runCmd(cmd, options) { let result = shelljs.exec(cmd, options || {silent: true}); if (result.code !== 0) { @@ -208,6 +219,7 @@ module.exports = { httpGet: httpGet, httpsGet: httpsGet, httpGetJson: httpGetJson, + httpsGetJson: httpsGetJson, runCmd: runCmd, cd: cd, sed: sed, diff --git a/lib/versions/library_manager.js b/lib/versions/library_manager.js index 3eb1f72b..66527767 100644 --- a/lib/versions/library_manager.js +++ b/lib/versions/library_manager.js @@ -23,15 +23,17 @@ class LibraryManager { let solcVersionInConfig = this.contractsConfig.versions.solc; let web3VersionInConfig = this.contractsConfig.versions["web3"]; let ipfsApiVersion = this.storageConfig.versions["ipfs-api"]; + let pIterationVersion = this.storageConfig.versions["p-iteration"]; this.versions['solc'] = solcVersionInConfig; this.versions['web3'] = web3VersionInConfig; this.versions['ipfs-api'] = ipfsApiVersion; + this.versions['p-iteration'] = pIterationVersion; Object.keys(this.versions).forEach(versionKey => { const newVersion = this.versions[versionKey].trim(); if (newVersion !== this.versions[versionKey]) { - this.embark.logger.warn(__('There a a space in the version of {{versionKey}}. We corrected it for you ({{correction}}).', {versionKey: versionKey, correction: `"${this.versions[versionKey]}" => "${newVersion}"`})); + this.embark.logger.warn(__('There is a space in the version of {{versionKey}}. We corrected it for you ({{correction}}).', {versionKey: versionKey, correction: `"${this.versions[versionKey]}" => "${newVersion}"`})); this.versions[versionKey] = newVersion; } }); diff --git a/package-lock.json b/package-lock.json index b22d565f..10c69650 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1434,7 +1434,7 @@ "browserify-zlib": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "integrity": "sha1-KGlFnZqjviRf6P4sofRuLn9U1z8=", "requires": { "pako": "1.0.6" } @@ -2466,7 +2466,7 @@ "domain-browser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" + "integrity": "sha1-PTH1AZGmdJ3RN1p/Ui6CPULlTto=" }, "drbg.js": { "version": "1.0.1", @@ -2582,7 +2582,7 @@ "errno": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "integrity": "sha1-RoTXF3mtOa8Xfj8AeZb3xnyFJhg=", "requires": { "prr": "1.0.1" } @@ -3243,7 +3243,7 @@ "resolved": "https://registry.npmjs.org/ethereumjs-testrpc/-/ethereumjs-testrpc-6.0.3.tgz", "integrity": "sha1-eguHvzZw+S9gf5j6aniAHZdBsSQ=", "requires": { - "webpack": "3.12.0" + "webpack": "3.11.0" } }, "ethereumjs-tx": { @@ -6042,7 +6042,7 @@ "json-loader": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", - "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==" + "integrity": "sha1-3KFKcCNf+C8KyaOr62DTN6NlGF0=" }, "json-parse-better-errors": { "version": "1.0.2", @@ -6470,7 +6470,7 @@ "lockfile": "1.0.4", "node-fetch": "2.1.2", "semver": "5.5.0", - "tar": "4.4.2", + "tar": "4.4.4", "url-join": "4.0.0" }, "dependencies": { @@ -6500,14 +6500,23 @@ "graceful-fs": "4.1.11" } }, + "minipass": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.3.tgz", + "integrity": "sha512-/jAn9/tEX4gnpyRATxgHEOV6xbcyxgT7iUnxo9Y3+OB0zX00TgKIv/2FZCf5brBbICcwbLqVv2ImjvWWrQMSYw==", + "requires": { + "safe-buffer": "5.1.2", + "yallist": "3.0.2" + } + }, "tar": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.2.tgz", - "integrity": "sha512-BfkE9CciGGgDsATqkikUHrQrraBCO+ke/1f6SFAEMnxyyfN9lxC+nW1NFWMpqH865DhHIy9vQi682gk1X7friw==", + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.4.tgz", + "integrity": "sha512-mq9ixIYfNF9SK0IS/h2HKMu8Q2iaCuhDDsZhdEag/FHv8fOaYld4vN7ouMgcSSt5WKZzPs8atclTcJm36OTh4w==", "requires": { "chownr": "1.0.1", "fs-minipass": "1.2.5", - "minipass": "2.3.1", + "minipass": "2.3.3", "minizlib": "1.1.0", "mkdirp": "0.5.1", "safe-buffer": "5.1.2", @@ -7684,7 +7693,7 @@ "node-libs-browser": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", - "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", + "integrity": "sha1-X5QmPUBPbkR2fXJpAf/wVHjWAN8=", "requires": { "assert": "1.4.1", "browserify-zlib": "0.2.0", @@ -8057,7 +8066,7 @@ "os-locale": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "integrity": "sha1-QrwpAKa1uL0XN2yOiCtlr8zyS/I=", "requires": { "execa": "0.7.0", "lcid": "1.0.0", @@ -8079,6 +8088,11 @@ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" }, + "p-iteration": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/p-iteration/-/p-iteration-1.1.7.tgz", + "integrity": "sha512-VsYvUPjm2edbKkX4QzlASC1qB2e4Z6IE9WPaRVHKwCtobmB6vfUcU9eBOwj1k5uMNi8O6w89QfsDatO5ePSjQg==" + }, "p-limit": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", @@ -8121,7 +8135,7 @@ "pako": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", - "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==" + "integrity": "sha1-AQEhG6pwxLykoPY/Igbpe3368lg=" }, "parse-asn1": { "version": "5.1.1", @@ -11840,9 +11854,9 @@ "version": "github:dignifiedquire/webcrypto-shim#190bc9ec341375df6025b17ae12ddb2428ea49c8" }, "webpack": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.12.0.tgz", - "integrity": "sha512-Sw7MdIIOv/nkzPzee4o0EdvCuPmxT98+vVpIvwtcwcF1Q4SDSNp92vwcKc4REe7NItH9f1S4ra9FuQ7yuYZ8bQ==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.11.0.tgz", + "integrity": "sha1-d9pFGx17SxF62vQaGpO1dC8k2JQ=", "requires": { "acorn": "5.5.3", "acorn-dynamic-import": "2.0.2", @@ -11910,7 +11924,7 @@ "webpack-sources": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", - "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", + "integrity": "sha1-oQHrrlnWUHNU1x2AE5UKOot6WlQ=", "requires": { "source-list-map": "2.0.0", "source-map": "0.6.1" @@ -11919,7 +11933,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=" } } }, diff --git a/package.json b/package.json index 3d341cf0..5fcb6a6f 100644 --- a/package.json +++ b/package.json @@ -54,6 +54,7 @@ "merge": "^1.2.0", "orbit-db": "^0.17.3", "os-locale": "^2.1.0", + "p-iteration": "^1.1.7", "parse-json": "^4.0.0", "promptly": "^2.1.0", "propose": "0.0.5", diff --git a/templates/boilerplate/embark.json b/templates/boilerplate/embark.json index 40c103a5..d0bfeb7a 100644 --- a/templates/boilerplate/embark.json +++ b/templates/boilerplate/embark.json @@ -11,7 +11,8 @@ "versions": { "web3": "1.0.0-beta", "solc": "0.4.23", - "ipfs-api": "17.2.4" + "ipfs-api": "17.2.4", + "p-iteration": "1.1.7" }, "plugins": {} } diff --git a/templates/demo/embark.json b/templates/demo/embark.json index 7bd3d48a..05855ace 100644 --- a/templates/demo/embark.json +++ b/templates/demo/embark.json @@ -10,7 +10,8 @@ "versions": { "web3": "1.0.0-beta", "solc": "0.4.23", - "ipfs-api": "17.2.4" + "ipfs-api": "17.2.4", + "p-iteration": "1.1.7" }, "plugins": { } diff --git a/test_apps/test_app/config/storage.json b/test_apps/test_app/config/storage.json index a226dcb3..6d06e3c7 100644 --- a/test_apps/test_app/config/storage.json +++ b/test_apps/test_app/config/storage.json @@ -1,25 +1,39 @@ { "default": { "enabled": true, - "available_providers": ["ipfs", "swarm"], "ipfs_bin": "ipfs", - "provider": "ipfs", - "host": "localhost", - "port": 5001 + + "available_providers": ["ipfs", "swarm"], + + "upload": { + "provider": "ipfs", + "host": "localhost", + "port": 5001 + }, + + "dappConnection": [ + "$BZZ", + {"provider": "swarm", "host": "localhost", "port": 8500, "getUrl": "http://localhost:8500/bzzr:/"}, + {"provider": "ipfs", "host": "localhost", "port": 5001, "getUrl": "http://localhost:8080/ipfs/"} + ] }, "development": { "enabled": true, - "provider": "swarm", - "host": "swarm-gateways.net", - "port": false, - "getUrl": "http://swarm-gateways.net/bzzr:/" + "upload": { + "provider": "ipfs", + "host": "localhost", + "port": 5001, + "getUrl": "http://localhost:8080/ipfs/" + } }, "livenet": { "enabled": true, - "provider": "ipfs", - "host": "ipfs.infura.io", - "protocol": "https", - "port": false, - "getUrl": "https://ipfs.infura.io/ipfs/" + "upload":{ + "provider": "ipfs", + "host": "ipfs.infura.io", + "protocol": "https", + "port": false, + "getUrl": "https://ipfs.infura.io/ipfs/" + } } -} +} \ No newline at end of file diff --git a/test_apps/test_app/embark.json b/test_apps/test_app/embark.json index 66dfb006..1ae6c162 100644 --- a/test_apps/test_app/embark.json +++ b/test_apps/test_app/embark.json @@ -17,7 +17,8 @@ "versions": { "solc": "0.4.18", "web3": "1.0.0-beta.34", - "ipfs-api": "17.2.7" + "ipfs-api": "17.2.7", + "p-iteration": "1.1.7" }, "plugins": { "embark-service": {}