diff --git a/packages/embark-code-generator/src/index.js b/packages/embark-code-generator/src/index.js index 582cae59e..c6e369fd9 100644 --- a/packages/embark-code-generator/src/index.js +++ b/packages/embark-code-generator/src/index.js @@ -80,6 +80,10 @@ class CodeGenerator { cb(this.getEmbarkJsProviderCode()); }); + this.events.setCommandHandler('code-generator:embarkjs:set-provider-code', (cb) => { + cb(this.getSetProviderCode()); + }); + this.events.setCommandHandler('code-generator:embarkjs:init-provider-code', (cb) => { cb(this.getInitProviderCode()); }); @@ -100,6 +104,14 @@ class CodeGenerator { }); } + getSetProviderCode() { + let code = "\n"; + code += this.generateCommunicationInitialization(true); + code += this.generateStorageInitialization(true); + code += this.generateNamesInitialization(true); + return code; + } + generateContracts(contractsList, useEmbarkJS, isDeployment, useLoader) { let self = this; let result = "\n"; @@ -313,7 +325,6 @@ class CodeGenerator { const self = this; let embarkjsCode = ''; let code = "/* eslint-disable */"; - const deps = ['web3', 'ens', 'ipfs', 'swarm', 'whisper']; async.waterfall([ // TODO: here due to a race condition when running embark build @@ -342,30 +353,36 @@ class CodeGenerator { embarkjsCode += `\nconst EmbarkJS = require("${symlinkDest}").default || require("${symlinkDest}");`; embarkjsCode += `\nEmbarkJS.environment = '${self.env}';`; embarkjsCode += "\nglobal.EmbarkJS = EmbarkJS;"; + code += "\n" + embarkjsCode + "\n"; next(); }); }, - ...deps.map((dep) => { - return function(next) { - self.events.request('version:downloadIfNeeded', `embarkjs-${dep}`, (err, location) => { - if (err) { - self.logger.error(__(`Error downloading embarkjs-${dep}`)); - return next(err); - } - - self.generateSymlink(location, `embarkjs-${dep}`, (err, _symlinkDest) => { - if (err) { - self.logger.error(__(`Error creating a symlink to embarkjs-${dep}`)); - return next(err); - } - return next(); - }); - }); - }; - }), + function addCodeFromDependencies(next) { + async.eachSeries( + self.plugins.getPluginsFor('generatedCode'), + (plugin, callback) => { + async.eachSeries( + plugin.generated_code, + (codeCall, callback) => { + codeCall((err, generatedCode, packageName, location) => { + if (err) return callback(err); + self.generateSymlink(location, packageName, (err, _symlinkDest) => { + if (err) { + self.logger.error(__(`Error creating a symlink to ${packageName}`)); + return callback(err); + } + code += generatedCode; + callback(); + }); + }); + }, + (err) => { callback(err); } + ); + }, + (err) => { next(err); } + ); + }, function getJSCode(next) { - code += "\n" + embarkjsCode + "\n"; - code += self.getEmbarkJsProviderCode(); code += self.generateCommunicationInitialization(true); code += self.generateStorageInitialization(true); diff --git a/packages/embark-code-runner/src/index.ts b/packages/embark-code-runner/src/index.ts index d5fdc1d7b..9e7ee2e6b 100644 --- a/packages/embark-code-runner/src/index.ts +++ b/packages/embark-code-runner/src/index.ts @@ -37,8 +37,6 @@ export default class CodeRunner { this.registerEvents(); this.registerCommands(); - this.events.emit("runcode:ready"); - this.ready = true; } private generateListener(provider: string, eventType: ProviderEventType) { @@ -52,101 +50,64 @@ export default class CodeRunner { }); } - private fireEmbarkJSEvents(code: string) { - const regexRegister = /EmbarkJS\.(.*)\.registerProvider/gm; - const regexSet = /EmbarkJS\.(.*)\.setProvider/gm; - let matches = regexRegister.exec(code); - if (matches) { - let [, provider] = matches; - provider = provider.toLowerCase(); - this.providerStates[`${provider}:${ProviderEventType.ProviderRegistered}`] = true; - this.events.emit(`runcode:${provider}:${ProviderEventType.ProviderRegistered}`); - } - matches = regexSet.exec(code); - if (matches) { - let [, provider] = matches; - provider = provider.toLowerCase(); - this.providerStates[`${provider}:${ProviderEventType.ProviderSet}`] = true; - this.events.emit(`runcode:${provider}:${ProviderEventType.ProviderSet}`); - } + private registerEvents() { + this.events.on("runcode:register", this.registerVar.bind(this)); } - private registerEvents() { - this.events.on("runcode:register", this.registerVar.bind(this)); - - this.events.on("runcode:init-console-code:updated", (code: string, cb: Callback) => { - this.evalCode(code, (err, _result) => { - if (err) { - this.logger.error("Error running init console code: ", err.message || err); - } - this.fireEmbarkJSEvents(code); - cb(); + private registerCommands() { + this.events.setCommandHandler("runcode:getContext", (cb) => { + cb(this.vm.options.sandbox); }); - }); - - this.events.on("runcode:embarkjs-code:updated", (code: string, cb: Callback) => { - this.evalCode(code, (err, _result) => { - if (err) { - this.logger.error("Error running embarkjs code: ", err.message || err); - } - this.fireEmbarkJSEvents(code); - cb(); + this.events.setCommandHandler("runcode:eval", this.evalCode.bind(this)); + this.events.setCommandHandler("runcode:embarkjs:reset", (cb) => { + this.resetEmbarkJS(cb); }); - }); -} - -private registerCommands() { - this.events.setCommandHandler("runcode:getContext", (cb) => { - cb(this.vm.options.sandbox); - }); - this.events.setCommandHandler("runcode:eval", this.evalCode.bind(this)); - this.events.setCommandHandler("runcode:ready", (cb) => { - if (this.ready) { - return cb(); - } - this.events.once("runcode:ready", cb); - }); - this.events.setCommandHandler("runcode:embarkjs:reset", this.resetEmbarkJS.bind(this)); - - // register listeners for when EmbarkJS runs registerProvider through the console. - // For example, when `EmbarkJS.Storage.registerProvider(...)` is run through the console, - // emit the `runcode:storage:providerRegistered` event, and fire any requests attached to it - Object.keys(EmbarkJS) - .filter((propName) => EmbarkJS[propName].hasOwnProperty("registerProvider")) - .forEach((providerName) => { - this.generateListener(providerName.toLowerCase(), ProviderEventType.ProviderRegistered); - }); - - // register listeners for when EmbarkJS runs setProvider through the console. - // For example, when `EmbarkJS.Storage.setProvider(...)` is run through the console, - // emit the `runcode:storage:providerSet` event, and fire any requests attached to it - Object.keys(EmbarkJS) - .filter((propName) => EmbarkJS[propName].hasOwnProperty("setProvider")) - .forEach((providerName) => { - this.generateListener(providerName.toLowerCase(), ProviderEventType.ProviderSet); - }); -} - -private resetEmbarkJS(cb: Callback) { - this.events.request("code-generator:embarkjs:provider-code", (code: string) => { - this.evalCode(code, (err) => { - if (err) { - return cb(err); - } - this.events.request("code-generator:embarkjs:init-provider-code", (providerCode: string) => { - this.evalCode(providerCode, (errInitProvider, _result) => { - cb(errInitProvider); - }, true); + this.events.on("contractsDeployed", () => { + this.events.on("code-generator-ready", (_modifiedAssets: any) => { + this.resetEmbarkJS(); }); - }, true); - }); -} + }); + + // register listeners for when EmbarkJS runs registerProvider through the console. + // For example, when `EmbarkJS.Storage.registerProvider(...)` is run through the console, + // emit the `runcode:storage:providerRegistered` event, and fire any requests attached to it + Object.keys(EmbarkJS) + .filter((propName) => EmbarkJS[propName].hasOwnProperty("registerProvider")) + .forEach((providerName) => { + this.generateListener(providerName.toLowerCase(), ProviderEventType.ProviderRegistered); + }); + + // register listeners for when EmbarkJS runs setProvider through the console. + // For example, when `EmbarkJS.Storage.setProvider(...)` is run through the console, + // emit the `runcode:storage:providerSet` event, and fire any requests attached to it + Object.keys(EmbarkJS) + .filter((propName) => EmbarkJS[propName].hasOwnProperty("setProvider")) + .forEach((providerName) => { + this.generateListener(providerName.toLowerCase(), ProviderEventType.ProviderSet); + }); + } + + private resetEmbarkJS(cb?: Callback) { + this.events.request("code-generator:embarkjs:init-provider-code", (code: string) => { + this.evalCode(code, (err) => { + if (err) { + console.dir(err); + return; + } + this.events.request("code-generator:embarkjs:set-provider-code", (providerCode: string) => { + this.evalCode(providerCode, (errInitProvider, _result) => { + if (cb) { cb(errInitProvider); } + }, false); + }); + }, false); + }); + } private registerVar(varName: string, code: any, cb = () => { }) { this.vm.registerVar(varName, code, cb); } - private evalCode(code: string, cb: Callback < any >, tolerateError = false) { + private evalCode(code: string, cb: Callback, tolerateError = false) { cb = cb || (() => { }); if (!code) { diff --git a/packages/embark-console/src/lib/index.ts b/packages/embark-console/src/lib/index.ts index 4270ddaa8..52fc78435 100644 --- a/packages/embark-console/src/lib/index.ts +++ b/packages/embark-console/src/lib/index.ts @@ -27,7 +27,6 @@ class Console { private history: string[]; private cmdHistoryFile: string; private suggestions?: Suggestions; - private providerReady: boolean; constructor(embark: Embark, options: any) { this.embark = embark; @@ -40,7 +39,6 @@ class Console { this.config = options.config; this.history = []; this.cmdHistoryFile = options.cmdHistoryFile || dappPath(".embark", "cmd_history"); - this.providerReady = false; this.loadHistory(); if (this.ipc.isServer()) { @@ -60,24 +58,11 @@ class Console { } this.events.setCommandHandler("console:executeCmd", this.executeCmd.bind(this)); this.events.setCommandHandler("console:history", (cb: any) => this.getHistory(this.cmdHistorySize(), cb)); - this.events.setCommandHandler("console:provider:ready", (cb: any) => { - if (this.providerReady || this.isEmbarkConsole) { - return cb(); - } - this.events.once("console:provider:done", cb); - }); this.registerConsoleCommands(); if (this.isEmbarkConsole) { return; } - this.registerEmbarkJs((err?: Error | null) => { - if (err) { - return this.logger.error(err); - } - this.providerReady = true; - this.events.emit("console:provider:done"); - }); this.registerApi(); this.suggestions = new Suggestions(embark, options); @@ -202,43 +187,6 @@ class Console { }, true); } - private registerEmbarkJs(cb: Callback) { - waterfall([ - // wait for the VM to be setup - (next: any) => { - this.events.request("runcode:ready", next); - }, - (next: any) => { - const waitingForReady = setTimeout(() => { - this.logger.warn(__("Waiting for the blockchain connector to be ready...")); - // TODO add docs link to how to install one - this.logger.warn(__("If you did not install a blockchain connector, stop this process and install one")); - }, 5000); - this.events.request("blockchain:connector:ready", () => { - clearTimeout(waitingForReady); - next(); - }); - }, - (next: any) => { - if (this.isEmbarkConsole) { - return next(); - } - this.events.request("runcode:blockchain:providerSet", next); - }, - (next: any) => { - if (this.isEmbarkConsole) { - return next(); - } - const connectCode = `EmbarkJS.Blockchain.connectConsole((err) => { - if(err) throw new Error("[VM]: Error connecting to blockchain. " + err); - });`; - this.events.request("runcode:eval", connectCode, (err: Error, _result: any) => { - cb(err); - }); - }, - ], cb); - } - private registerConsoleCommands() { this.embark.registerConsoleCommand({ description: __("display console commands history"), diff --git a/packages/embark-ens/src/index.js b/packages/embark-ens/src/index.js index ea1666639..10c0e4fd7 100644 --- a/packages/embark-ens/src/index.js +++ b/packages/embark-ens/src/index.js @@ -384,18 +384,31 @@ class ENS { return this.logger.error(err.message || err); } this.events.emit('runcode:register', 'namehash', require('eth-ens-namehash'), () => { - let linkedModulePath = path.join(this.modulesPath, 'embarkjs-ens'); - if (process.platform === 'win32') linkedModulePath = linkedModulePath.replace(/\\/g, '\\\\'); - - const code = ` - const __embarkENS = require('${linkedModulePath}'); - EmbarkJS.Names.registerProvider('ens', __embarkENS.default || __embarkENS); - `; - - this.embark.addCodeToEmbarkJS(code); }); }); }); + + let linkedModulePath = path.join(this.modulesPath, 'embarkjs-ens'); + if (process.platform === 'win32') linkedModulePath = linkedModulePath.replace(/\\/g, '\\\\'); + + const code = ` + const __embarkENS = require('${linkedModulePath}'); + EmbarkJS.Names.registerProvider('ens', __embarkENS.default || __embarkENS); + `; + + this.events.request('version:downloadIfNeeded', 'embarkjs-ens', (err, location) => { + if (err) { + this.logger.error(__('Error downloading embarkjs-ens')); + throw err; + } + + this.embark.addProviderInit("names", code, () => { return true; }); + this.embark.addConsoleProviderInit("names", code, () => { return true; }); + + this.embark.addGeneratedCode((cb) => { + return cb(null, code, `embarkjs-ens`, location); + }); + }); }); } @@ -406,6 +419,7 @@ class ENS { return (namesConfig.provider === 'ens' && namesConfig.enabled === true); }; + // TODO This stacks the setProviders making it so that we call it multiple times this.embark.addProviderInit('names', code, shouldInit); this.embark.addConsoleProviderInit('names', code, shouldInit); } diff --git a/packages/embark-test-runner/src/test.js b/packages/embark-test-runner/src/test.js index dde1e64f1..3ac2428d4 100644 --- a/packages/embark-test-runner/src/test.js +++ b/packages/embark-test-runner/src/test.js @@ -35,9 +35,6 @@ class Test { init(callback) { async.waterfall([ - (next) => { - this.events.request('runcode:ready', next); - }, (next) => { this.gasLimit = GAS_LIMIT; this.events.request('deploy:setGasLimit', this.gasLimit); @@ -181,7 +178,9 @@ class Test { } self.firstRunConfig = false; self.events.request("blockchain:ready", () => { - self.events.request("runcode:embarkjs:reset", callback); + self.events.request("code-generator:embarkjs:build", () => { + self.events.request("runcode:embarkjs:reset", callback); + }); }); }); }); @@ -316,11 +315,6 @@ class Test { next(err, accounts, web3); }); }, - function waitForProvidersReady(accounts, web3, next) { - self.events.request('console:provider:ready', () => { - next(null, accounts, web3); - }); - }, function createContractObject(accounts, web3, next) { self.events.request('contracts:all', (err, contracts) => { async.each(contracts, (contract, eachCb) => { diff --git a/packages/embark-web3/src/index.js b/packages/embark-web3/src/index.js index 65db0fdee..9607ccd6e 100644 --- a/packages/embark-web3/src/index.js +++ b/packages/embark-web3/src/index.js @@ -1,5 +1,6 @@ /* global __dirname module process require */ +const { __ } = require('embark-i18n'); const { dappPath, embarkPath, normalizePath, toForwardSlashes } = require('embark-utils'); const constants = require('embark-core/constants'); const path = require('path'); @@ -18,7 +19,6 @@ class EmbarkWeb3 { async addWeb3ToEmbarkJS() { let blockchainConnectorReady = false; - await this.whenRuncodeReady(); const web3LocationPromise = this.getWeb3Location(); @@ -61,22 +61,24 @@ class EmbarkWeb3 { code += `\n const web3ConnectionConfig = require('${configPath}');`; code += `\n EmbarkJS.Blockchain.connect(web3ConnectionConfig, (err) => {if (err) { console.error(err); } });`; code += `\n}`; + this.events.request('version:downloadIfNeeded', 'embarkjs-web3', (err, location) => { + if (err) { + this.logger.error(__('Error downloading embarkjs-web3')); + throw err; + } - this.embark.addCodeToEmbarkJS(code); + this.embark.addProviderInit("blockchain", code, () => { return true; }); - code = "EmbarkJS.Blockchain.setProvider('web3', {web3});"; + // Make sure that we use our web3 for the console and the tests + code += `if (typeof web3 === 'undefined') { + throw new Error('Global web3 is not present'); + } + EmbarkJS.Blockchain.setProvider('web3', {web3});`; - const shouldInit = (_config) => { - return true; - }; + this.embark.addConsoleProviderInit("blockchain", code, () => { return true; }); - this.embark.addConsoleProviderInit('blockchain', code, shouldInit); - } - - whenRuncodeReady() { - return new Promise((resolve) => { - this.events.on('runcode:ready', () => { - resolve(); + this.embark.addGeneratedCode((cb) => { + return cb(null, code, 'embarkjs-web3', location); }); }); } diff --git a/packages/embark-whisper/src/index.js b/packages/embark-whisper/src/index.js index f59141cc9..8cd5a6abe 100644 --- a/packages/embark-whisper/src/index.js +++ b/packages/embark-whisper/src/index.js @@ -50,7 +50,6 @@ class Whisper { } } this.setServiceCheck(); - this.addWhisperToEmbarkJS(); this.addSetProvider(); this.registerAPICalls(); cb(); @@ -58,6 +57,10 @@ class Whisper { }); }); + // TODO: it will have the issue of waiting for the ipfs to start when the code is generator + // TODO: could be solved by having a list of services to wait on before attempting to execute code in the console + this.addWhisperToEmbarkJS(); + this.events.request('processes:launch', 'whisper'); } @@ -117,7 +120,6 @@ class Whisper { } addWhisperToEmbarkJS() { - const self = this; // TODO: make this a shouldAdd condition if (this.communicationConfig === {}) { return; @@ -129,12 +131,23 @@ class Whisper { let linkedModulePath = path.join(this.modulesPath, 'embarkjs-whisper'); if (process.platform === 'win32') linkedModulePath = linkedModulePath.replace(/\\/g, '\\\\'); - const code = ` - const __embarkWhisperNewWeb3 = require('${linkedModulePath}'); - EmbarkJS.Messages.registerProvider('whisper', __embarkWhisperNewWeb3.default || __embarkWhisperNewWeb3); - `; + this.events.request('version:downloadIfNeeded', 'embarkjs-whisper', (err, location) => { + if (err) { + this.logger.error(__('Error downloading embarkjs-whisper')); + throw err; + } - self.embark.addCodeToEmbarkJS(code); + const code = ` + const __embarkWhisperNewWeb3 = require('${linkedModulePath}'); + EmbarkJS.Messages.registerProvider('whisper', __embarkWhisperNewWeb3.default || __embarkWhisperNewWeb3); + `; + + this.embark.addProviderInit("communication", code, () => { return true; }); + this.embark.addConsoleProviderInit("communication", code, () => { return true; }); + this.embark.addGeneratedCode((cb) => { + return cb(null, code, `embarkjs-whisper`, location); + }); + }); } addSetProvider() { @@ -149,6 +162,12 @@ class Whisper { port: connection.port || '8546', type: connection.type || 'ws' }; + + // TODO: fix storage to also use addProviderInit + // execute code called addProviderInit WHEN contracts have been deployed etc.. + // TODO: diff between addConsoleProviderInit and addProviderInit + // or maybe best way is todo everything in the module + const code = `\nEmbarkJS.Messages.setProvider('whisper', ${JSON.stringify(config)});`; this.embark.addProviderInit('communication', code, shouldInit); diff --git a/packages/embark/package.json b/packages/embark/package.json index c681c5c31..807ad629d 100644 --- a/packages/embark/package.json +++ b/packages/embark/package.json @@ -107,6 +107,7 @@ "embark-deploy-tracker": "^4.1.0-beta.3", "embark-deployment": "^4.1.0-beta.3", "embark-ens": "^4.1.0-beta.3", + "embark-graph": "^4.1.0-beta.3", "embark-i18n": "^4.1.0-beta.3", "embark-library-manager": "^4.1.0-beta.3", "embark-listener": "^4.1.0-beta.3", diff --git a/packages/embark/src/cmd/cmd_controller.js b/packages/embark/src/cmd/cmd_controller.js index df3c144c2..0b889cde1 100644 --- a/packages/embark/src/cmd/cmd_controller.js +++ b/packages/embark/src/cmd/cmd_controller.js @@ -165,9 +165,7 @@ class EmbarkController { } engine.startService("fileWatcher"); - engine.events.request('code-generator:embarkjs:build', () => { - callback(); - }); + callback(); }, function startDashboard(callback) { if (!options.useDashboard) { @@ -242,9 +240,7 @@ class EmbarkController { engine.startService('compiler'); } - engine.events.request('code-generator:embarkjs:build', () => { - callback(); - }); + callback(); }, function buildOrBuildAndDeploy(callback) { if (options.onlyCompile) { @@ -329,18 +325,10 @@ class EmbarkController { engine.startService("cockpit"); engine.startService("pluginCommand"); - engine.events.request('code-generator:embarkjs:build', () => { - engine.events.request('blockchain:ready', callback); - }); + engine.events.request('blockchain:ready', callback); }, function ipcConnect(callback) { - // Do specific work in case we are connected to a socket: - // - Setup Web3 - // - Apply history - if(isSecondaryProcess(engine)) { - return callback(); - } - engine.events.request("console:provider:ready", callback); + return callback(); }, function deploy(callback) { // Skip if we are connected to a websocket, the server will do it @@ -413,9 +401,7 @@ class EmbarkController { engine.startService("codeGenerator"); engine.startService("graph"); - engine.events.request('code-generator:embarkjs:build', () => { - engine.events.request('contracts:build', {}, callback); - }); + engine.events.request('contracts:build', {}, callback); } ], (err) => { if (err) { @@ -591,9 +577,7 @@ class EmbarkController { engine.startService("storage"); engine.startService("codeGenerator"); - engine.events.request('code-generator:embarkjs:build', () => { - callback(); - }); + callback(); }, function listLoadedPlugin(callback) { let pluginList = engine.plugins.listPlugins(); @@ -688,9 +672,7 @@ class EmbarkController { } engine.startService("testRunner"); - engine.events.request('code-generator:embarkjs:build', () => { - callback(); - }); + callback(); }, function runTests(callback) { engine.events.request('tests:run', options, callback); diff --git a/packages/embark/src/lib/core/engine.js b/packages/embark/src/lib/core/engine.js index ffc24791b..6c2ac3769 100644 --- a/packages/embark/src/lib/core/engine.js +++ b/packages/embark/src/lib/core/engine.js @@ -191,17 +191,20 @@ class Engine { this.registerModulePackage('embark-code-generator', {plugins: self.plugins, env: self.env}); - const generateCode = function (modifiedAssets) { - self.events.request("module:storage:onReady", () => { - self.events.request("code-generator:embarkjs:build", () => { - self.events.emit('code-generator-ready', modifiedAssets); - }); + const generateCode = function (modifiedAssets, cb) { + self.events.request("code-generator:embarkjs:build", () => { + self.events.emit('code-generator-ready', modifiedAssets); + cb(); }); }; const cargo = async.cargo((tasks, callback) => { const modifiedAssets = tasks.map(task => task.modifiedAsset).filter(asset => asset); // filter null elements - generateCode(modifiedAssets); - self.events.once('outputDone', callback); + generateCode(modifiedAssets, () => { + if (this.context.includes('test')) { + return callback(); + } + self.events.once('outputDone', callback); + }); }); const addToCargo = function (modifiedAsset) { cargo.push({modifiedAsset}); @@ -297,6 +300,8 @@ class Engine { } web3Service(options) { + this.registerModulePackage('embark-web3'); + this.registerModulePackage('embark-blockchain-process', { client: this.client, locale: this.locale, @@ -312,7 +317,6 @@ class Engine { wait: options.wait }); - this.registerModulePackage('embark-web3'); this.registerModulePackage('embark-whisper'); } diff --git a/packages/embark/src/lib/core/plugin.js b/packages/embark/src/lib/core/plugin.js index 56012dd8d..5e516246b 100644 --- a/packages/embark/src/lib/core/plugin.js +++ b/packages/embark/src/lib/core/plugin.js @@ -31,6 +31,7 @@ var Plugin = function(options) { this.apiCalls = []; this.imports = []; this.embarkjs_code = []; + this.generated_code = []; this.embarkjs_init_code = {}; this.embarkjs_init_console_code = {}; this.fs = fs; @@ -229,14 +230,17 @@ Plugin.prototype.registerUploadCommand = function(cmd, cb) { Plugin.prototype.addCodeToEmbarkJS = function(code) { this.addPluginType('embarkjsCode'); + // TODO: what is this/why if (!this.embarkjs_code.some((existingCode) => deepEqual(existingCode, code))) { this.embarkjs_code.push(code); - this.events.request('blockchain:ready', () => { - this.events.emit('runcode:embarkjs-code:updated', code, () => {}); - }); } }; +Plugin.prototype.addGeneratedCode = function(codeCb) { + this.addPluginType('generatedCode'); + this.generated_code.push(codeCb); +}; + Plugin.prototype.addProviderInit = function(providerType, code, initCondition) { this.embarkjs_init_code[providerType] = this.embarkjs_init_code[providerType] || []; this.embarkjs_init_code[providerType].push([code, initCondition]); @@ -249,9 +253,6 @@ Plugin.prototype.addConsoleProviderInit = function(providerType, code, initCondi const toAdd = [code, initCondition]; if (!this.embarkjs_init_console_code[providerType].some((initConsoleCode) => deepEqual(initConsoleCode, toAdd))) { this.embarkjs_init_console_code[providerType].push(toAdd); - this.events.request('blockchain:ready', () => { - this.events.emit('runcode:init-console-code:updated', code, () => {}); - }); } }; diff --git a/packages/embark/src/lib/modules/ipfs/index.js b/packages/embark/src/lib/modules/ipfs/index.js index 18fc13fc5..66a7911f1 100644 --- a/packages/embark/src/lib/modules/ipfs/index.js +++ b/packages/embark/src/lib/modules/ipfs/index.js @@ -20,7 +20,6 @@ class IPFS { this.embark = embark; this.fs = embark.fs; this.isServiceRegistered = false; - this.addedToEmbarkJs = false; this.addedToConsole = false; this.storageProcessesLauncher = null; this.usingRunningNode = false; @@ -43,7 +42,6 @@ class IPFS { return cb(__("IPFS process is running in a separate process and cannot be started by Embark.")); } this.startProcess((err, newProcessStarted) => { - this.addStorageProviderToEmbarkJS(); this.addObjectToConsole(); this.events.emit("ipfs:process:started", err, newProcessStarted); cb(); @@ -64,6 +62,10 @@ class IPFS { this.logger.info(msg); } }); + + // TODO: it will have the issue of waiting for the ipfs to start when the code is generator + // TODO: could be solved by having a list of services to wait on before attempting to execute code in the console + this.addStorageProviderToEmbarkJS(); } downloadIpfsApi(cb) { @@ -131,8 +133,6 @@ class IPFS { } addStorageProviderToEmbarkJS() { - if(this.addedToEmbarkJs) return; - this.addedToEmbarkJs = true; this.events.request('version:downloadIfNeeded', 'ipfs-api', (err, location) => { if (err) { this.logger.error(__('Error downloading IPFS API')); @@ -146,19 +146,30 @@ class IPFS { } this.events.emit('runcode:register', 'IpfsApi', require('ipfs-api'), () => { - let linkedModulePath = path.join(this.modulesPath, 'embarkjs-ipfs'); - if (process.platform === 'win32') linkedModulePath = linkedModulePath.replace(/\\/g, '\\\\'); - const code = ` - const __embarkIPFS = require('${linkedModulePath}'); - EmbarkJS.Storage.registerProvider('ipfs', __embarkIPFS.default || __embarkIPFS); - `; - - this.embark.addCodeToEmbarkJS(code); - this.embark.addConsoleProviderInit("storage", code, (storageConfig) => storageConfig.enabled); }); }); }); + + let linkedModulePath = path.join(this.modulesPath, 'embarkjs-ipfs'); + if (process.platform === 'win32') linkedModulePath = linkedModulePath.replace(/\\/g, '\\\\'); + + const code = ` + const __embarkIPFS = require('${linkedModulePath}'); + EmbarkJS.Storage.registerProvider('ipfs', __embarkIPFS.default || __embarkIPFS); + `; + + this.events.request('version:downloadIfNeeded', 'embarkjs-ipfs', (err, location) => { + if (err) { + this.logger.error(__('Error downloading embarkjs-ipfs')); + throw err; + } + this.embark.addProviderInit("storage", code, () => { return true; }); + this.embark.addConsoleProviderInit("storage", code, () => { return true; }); + this.embark.addGeneratedCode((cb) => { + return cb(null, code, `embarkjs-ipfs`, location); + }); + }); }); } diff --git a/packages/embark/src/lib/modules/swarm/index.js b/packages/embark/src/lib/modules/swarm/index.js index e068a8784..6984e51f3 100644 --- a/packages/embark/src/lib/modules/swarm/index.js +++ b/packages/embark/src/lib/modules/swarm/index.js @@ -20,7 +20,6 @@ class Swarm { this.embark = embark; this.fs = embark.fs; this.isServiceRegistered = false; - this.addedToEmbarkJs = false; this.addedToConsole = false; this.storageProcessesLauncher = null; this.usingRunningNode = false; @@ -63,7 +62,6 @@ class Swarm { return cb(__("Swarm process is running in a separate process and cannot be started by Embark.")); } this.startProcess((err, newProcessStarted) => { - this.addProviderToEmbarkJS(); this.addObjectToConsole(); this.events.emit("swarm:process:started", err, newProcessStarted); cb(); @@ -84,6 +82,10 @@ class Swarm { this.logger.info(msg); } }); + + // TODO: it will have the issue of waiting for the ipfs to start when the code is generator + // TODO: could be solved by having a list of services to wait on before attempting to execute code in the console + this.addProviderToEmbarkJS(); } addObjectToConsole() { @@ -123,18 +125,27 @@ class Swarm { } addProviderToEmbarkJS() { - if(this.addedToEmbarkJs) return; - this.addedToEmbarkJs = true; - let linkedModulePath = path.join(this.modulesPath, 'embarkjs-swarm'); if (process.platform === 'win32') linkedModulePath = linkedModulePath.replace(/\\/g, '\\\\'); - const code = ` - const __embarkSwarm = require('${linkedModulePath}'); - EmbarkJS.Storage.registerProvider('swarm', __embarkSwarm.default || __embarkSwarm); - `; + this.events.request('version:downloadIfNeeded', 'embarkjs-swarm', (err, location) => { + if (err) { + this.logger.error(__('Error downloading embarkjs-swarm')); + throw err; + } - this.embark.addCodeToEmbarkJS(code); + const code = ` + const __embarkSwarm = require('${linkedModulePath}'); + EmbarkJS.Storage.registerProvider('swarm', __embarkSwarm.default || __embarkSwarm); + `; + + this.embark.addProviderInit("storage", code, () => { return true; }); + this.embark.addConsoleProviderInit("storage", code, () => { return true; }); + + this.embark.addGeneratedCode((cb) => { + return cb(null, code, 'embarkjs-swarm', location); + }); + }); } startProcess(callback) { diff --git a/packages/embark/src/lib/utils/template_generator.js b/packages/embark/src/lib/utils/template_generator.js index 3deb92c39..754ed6a38 100644 --- a/packages/embark/src/lib/utils/template_generator.js +++ b/packages/embark/src/lib/utils/template_generator.js @@ -183,6 +183,7 @@ class TemplateGenerator { delete pkgJson.devDependencies['rimraf']; } delete pkgJson.files; + delete pkgJson.gitHead; pkgJson.name = name; if (!pkgJson.scripts) pkgJson.scripts = {}; delete pkgJson.scripts.ci; diff --git a/packages/embarkjs-connector-web3/.npmrc b/packages/embarkjs-connector-web3/.npmrc deleted file mode 100644 index e031d3432..000000000 --- a/packages/embarkjs-connector-web3/.npmrc +++ /dev/null @@ -1,4 +0,0 @@ -engine-strict = true -package-lock = false -save-exact = true -scripts-prepend-node-path = true diff --git a/packages/embarkjs-connector-web3/CHANGELOG.md b/packages/embarkjs-connector-web3/CHANGELOG.md deleted file mode 100644 index b314027b8..000000000 --- a/packages/embarkjs-connector-web3/CHANGELOG.md +++ /dev/null @@ -1,44 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -# [4.1.0-beta.3](https://github.com/embark-framework/embark/compare/v4.1.0-beta.2...v4.1.0-beta.3) (2019-06-07) - -**Note:** Version bump only for package embarkjs-connector-web3 - - - - - -# [4.1.0-beta.2](https://github.com/embark-framework/embark/compare/v4.1.0-beta.1...v4.1.0-beta.2) (2019-05-22) - -**Note:** Version bump only for package embarkjs-connector-web3 - - - - - -# [4.1.0-beta.1](https://github.com/embark-framework/embark/compare/v4.1.0-beta.0...v4.1.0-beta.1) (2019-05-15) - -**Note:** Version bump only for package embarkjs-connector-web3 - - - - - -# [4.0.0](https://github.com/embark-framework/embark/compare/v4.0.0-beta.2...v4.0.0) (2019-03-18) - -**Note:** Version bump only for package embarkjs-connector-web3 - - - - - -# [4.0.0-beta.1](https://github.com/embark-framework/embark/compare/v4.0.0-beta.0...v4.0.0-beta.1) (2019-03-18) - - -### Features - -* add repository.directory field to package.json ([a9c5e1a](https://github.com/embark-framework/embark/commit/a9c5e1a)) -* normalize README and package.json bugs, homepage, description ([5418f16](https://github.com/embark-framework/embark/commit/5418f16)) diff --git a/packages/embarkjs-connector-web3/README.md b/packages/embarkjs-connector-web3/README.md deleted file mode 100644 index 1384f3d00..000000000 --- a/packages/embarkjs-connector-web3/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# `embarkjs-connector-web3` - -> Web3.js Connector for EmbarkJS - -Visit [embark.status.im](https://embark.status.im/) to get started with -[Embark](https://github.com/embark-framework/embark). diff --git a/packages/embarkjs-connector-web3/embarkJSConnectorWeb3.js b/packages/embarkjs-connector-web3/embarkJSConnectorWeb3.js deleted file mode 100644 index 9d6bd1601..000000000 --- a/packages/embarkjs-connector-web3/embarkJSConnectorWeb3.js +++ /dev/null @@ -1,58 +0,0 @@ -/*global Web3*/ -const embarkJSConnectorWeb3 = {}; - -embarkJSConnectorWeb3.init = function(config) { - global.web3 = config.web3 || global.web3; - // Check if the global web3 object uses the old web3 (0.x) - if (global.web3 && typeof global.web3.version !== 'string') { - // If so, use a new instance using 1.0, but use its provider - this.web3 = new Web3(global.web3.currentProvider); - } else { - this.web3 = global.web3 || new Web3(); - } - global.web3 = this.web3; -}; - -embarkJSConnectorWeb3.getInstance = function () { - return this.web3; -}; - -embarkJSConnectorWeb3.getAccounts = function () { - return this.web3.eth.getAccounts(...arguments); -}; - -embarkJSConnectorWeb3.getNewProvider = function (providerName, ...args) { - return new Web3.providers[providerName](...args); -}; - -embarkJSConnectorWeb3.setProvider = function (provider) { - return this.web3.setProvider(provider); -}; - -embarkJSConnectorWeb3.getCurrentProvider = function () { - return this.web3.currentProvider; -}; - -embarkJSConnectorWeb3.getDefaultAccount = function () { - return this.web3.eth.defaultAccount; -}; - -embarkJSConnectorWeb3.setDefaultAccount = function (account) { - this.web3.eth.defaultAccount = account; -}; - -embarkJSConnectorWeb3.newContract = function (options) { - return new this.web3.eth.Contract(options.abi, options.address); -}; - -embarkJSConnectorWeb3.send = function () { - return this.web3.eth.sendTransaction(...arguments); -}; - -embarkJSConnectorWeb3.toWei = function () { - return this.web3.toWei(...arguments); -}; - -embarkJSConnectorWeb3.getNetworkId = function () { - return this.web3.eth.net.getId(); -}; diff --git a/packages/embarkjs-connector-web3/index.js b/packages/embarkjs-connector-web3/index.js deleted file mode 100644 index 67b12003e..000000000 --- a/packages/embarkjs-connector-web3/index.js +++ /dev/null @@ -1,115 +0,0 @@ -const { dappPath, embarkPath, normalizePath, toForwardSlashes } = require('embark-utils'); -const path = require('path'); - -class EmbarkJSConnectorWeb3 { - constructor(embark, _options) { - this.embark = embark; - this.events = embark.events; - this.fs = embark.fs; - this.config = embark.config; - this.constants = embark.constants; - this.registerProvider(); - } - - async registerProvider() { - let blockchainConnectorReady = false; - await this.whenRuncodeReady(); - - const web3LocationPromise = this.getWeb3Location(); - - this.events.setCommandHandler('blockchain:connector:ready', (cb) => { - if (blockchainConnectorReady) { - return cb(); - } - this.events.once("blockchain:connector:ready", () => { - cb(); - }); - }); - - web3LocationPromise.then((_web3Location) => { - blockchainConnectorReady = true; - this.events.emit('blockchain:connector:ready'); - }); - - let web3Location = await web3LocationPromise; - web3Location = normalizePath(web3Location, true); - - await this.registerVar('__Web3', require(web3Location)); - - const symlinkLocation = await this.generateSymlink(web3Location); - - let code = `\nconst Web3 = global.__Web3 || require('${symlinkLocation}');`; - code += `\nglobal.Web3 = Web3;`; - - const connectorCode = this.fs.readFileSync(path.join(__dirname, 'embarkJSConnectorWeb3.js'), 'utf8'); - code += connectorCode; - - code += "\nEmbarkJS.Blockchain.registerProvider('web3', embarkJSConnectorWeb3);"; - code += "\nEmbarkJS.Blockchain.setProvider('web3', {});"; - - const configPath = toForwardSlashes(dappPath(this.config.embarkConfig.generationDir, this.constants.dappArtifacts.dir, this.constants.dappArtifacts.blockchain)); - - code += `\nif (!global.__Web3) {`; // Only connect when in the Dapp - code += `\n const web3ConnectionConfig = require('${configPath}');`; - code += `\n EmbarkJS.Blockchain.connect(web3ConnectionConfig, (err) => {if (err) { console.error(err); } });`; - code += `\n}`; - - this.embark.addCodeToEmbarkJS(code); - - code = "EmbarkJS.Blockchain.setProvider('web3', {web3});"; - - const shouldInit = (_config) => { - return true; - }; - - this.embark.addConsoleProviderInit('blockchain', code, shouldInit); - } - - whenRuncodeReady() { - return new Promise((resolve) => { - this.events.on('runcode:ready', () => { - resolve(); - }); - }); - } - - getWeb3Location() { - return new Promise((resolve, reject) => { - this.events.request("version:get:web3", (web3Version) => { - if (web3Version === "1.0.0-beta") { - const nodePath = embarkPath('node_modules'); - const web3Path = require.resolve("web3", {paths: [nodePath]}); - return resolve(web3Path); - } - this.events.request("version:getPackageLocation", "web3", web3Version, (err, location) => { - if (err) { - return reject(err); - } - const locationPath = embarkPath(location); - resolve(locationPath); - }); - }); - }); - } - - generateSymlink(location) { - return new Promise((resolve, reject) => { - this.events.request('code-generator:symlink:generate', location, 'web3', (err, symlinkDest) => { - if (err) { - return reject(err); - } - resolve(symlinkDest); - }); - }); - } - - registerVar(name, code) { - return new Promise((resolve) => { - this.events.emit('runcode:register', name, code, () => { - resolve(); - }); - }); - } -} - -module.exports = EmbarkJSConnectorWeb3; diff --git a/packages/embarkjs-connector-web3/package.json b/packages/embarkjs-connector-web3/package.json deleted file mode 100644 index 5f6329c46..000000000 --- a/packages/embarkjs-connector-web3/package.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "name": "embarkjs-connector-web3", - "version": "4.1.0-beta.3", - "author": "Iuri Matias ", - "contributors": [], - "description": "Web3.js Connector for EmbarkJS", - "homepage": "https://github.com/embark-framework/embark/tree/master/packages/embarkjs-connector-web3#readme", - "bugs": "https://github.com/embark-framework/embark/issues", - "keywords": [ - "embark", - "web3", - "node", - "ethereum", - "smart-contract" - ], - "license": "MIT", - "repository": { - "directory": "packages/embarkjs-connector-web3", - "type": "git", - "url": "https://github.com/embark-framework/embark.git" - }, - "main": "index.js", - "files": [ - "embarkJSConnectorWeb3.js" - ], - "scripts": { - "ci": "npm run qa", - "clean": "npm run reset", - "package": "npm pack", - "qa": "npm run package", - "reset": "npx rimraf embark-*.tgz package" - }, - "dependencies": { - "embark-utils": "^4.1.0-beta.3" - }, - "devDependencies": { - "rimraf": "2.6.3" - } -} diff --git a/packages/embarkjs-ens/src/index.js b/packages/embarkjs-ens/src/index.js index eb9a713e6..66c0df2c1 100644 --- a/packages/embarkjs-ens/src/index.js +++ b/packages/embarkjs-ens/src/index.js @@ -153,40 +153,39 @@ __embarkENS.registryAddresses = { "4": "0xe7410170f87102DF0055eB195163A03B7F2Bff4A" }; -__embarkENS.setProvider = function (config) { +__embarkENS.setProvider = function(config) { const self = this; const ERROR_MESSAGE = 'ENS is not available in this chain'; self.registration = config.registration; self.env = config.env; - EmbarkJS.onReady(() => { - EmbarkJS.Blockchain.blockchainConnector.getNetworkId() - .then((id) => { - const registryAddress = self.registryAddresses[id] || config.registryAddress; - self._isAvailable = true; - self.ens = new EmbarkJS.Blockchain.Contract({ - abi: config.registryAbi, - address: registryAddress, - web3: EmbarkJS.Blockchain.blockchainConnector.getInstance() - }); - self.registrar = new EmbarkJS.Blockchain.Contract({ - abi: config.registrarAbi, - address: config.registrarAddress, - web3: EmbarkJS.Blockchain.blockchainConnector.getInstance() - }); - self.resolver = new EmbarkJS.Blockchain.Contract({ - abi: config.resolverAbi, - address: config.resolverAddress, - web3: EmbarkJS.Blockchain.blockchainConnector.getInstance() - }); - }) - .catch(err => { - if (err.message.indexOf('Provider not set or invalid') > -1) { - console.warn(ERROR_MESSAGE); - return; - } - console.error(err); + // FIXME EmbarkJS.onReady odesn't work. Possibility of a race condition + EmbarkJS.Blockchain.blockchainConnector.getNetworkId() + .then((id) => { + const registryAddress = self.registryAddresses[id] || config.registryAddress; + self._isAvailable = true; + self.ens = new EmbarkJS.Blockchain.Contract({ + abi: config.registryAbi, + address: registryAddress, + web3: EmbarkJS.Blockchain.blockchainConnector.getInstance() }); - }); + self.registrar = new EmbarkJS.Blockchain.Contract({ + abi: config.registrarAbi, + address: config.registrarAddress, + web3: EmbarkJS.Blockchain.blockchainConnector.getInstance() + }); + self.resolver = new EmbarkJS.Blockchain.Contract({ + abi: config.resolverAbi, + address: config.resolverAddress, + web3: EmbarkJS.Blockchain.blockchainConnector.getInstance() + }); + }) + .catch(err => { + if (err.message.indexOf('Provider not set or invalid') > -1) { + console.warn(ERROR_MESSAGE); + return; + } + console.error(err); + }); }; __embarkENS.resolve = function (name, callback) { diff --git a/yarn.lock b/yarn.lock index 2ba6a0083..88364ff02 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5164,15 +5164,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000884, caniuse-lite@^1.0.30000887, caniuse-lite@^1.0.30000929: - version "1.0.30000932" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000932.tgz#d01763e9ce77810962ca7391ff827b5949ce4272" - integrity sha512-4bghJFItvzz8m0T3lLZbacmEY9X1Z2AtIzTr7s7byqZIOumASfr4ynDx7rtm0J85nDmx8vsgR6vnaSoeU8Oh0A== - -caniuse-lite@^1.0.30000899: - version "1.0.30000912" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000912.tgz#08e650d4090a9c0ab06bfd2b46b7d3ad6dcaea28" - integrity sha512-M3zAtV36U+xw5mMROlTXpAHClmPAor6GPKAMD5Yi7glCB5sbMPFtnQ3rGpk4XqPdUrrTIaVYSJZxREZWNy8QJg== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000884, caniuse-lite@^1.0.30000887, caniuse-lite@^1.0.30000899, caniuse-lite@^1.0.30000929: + version "1.0.30000978" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000978.tgz#1e3346c27fc46bce9ac1ccd77863153a263dde56" + integrity sha512-H6gK6kxUzG6oAwg/Jal279z8pHw0BzrpZfwo/CA9FFm/vA0l8IhDfkZtepyJNE2Y4V6Dp3P3ubz6czby1/Mgsw== capture-exit@^1.2.0: version "1.2.0"