diff --git a/src/lib/core/config.js b/src/lib/core/config.js index 756b278da..e21694f4c 100644 --- a/src/lib/core/config.js +++ b/src/lib/core/config.js @@ -15,7 +15,6 @@ import * as utilsContractsConfig from "../utils/contractsConfig"; const DEFAULT_CONFIG_PATH = 'config/'; var Config = function(options) { - const self = this; this.env = options.env || 'default'; this.blockchainConfig = {}; this.contractsConfig = {}; @@ -35,37 +34,75 @@ var Config = function(options) { this.shownNoAccountConfigMsg = false; // flag to ensure "no account config" message is only displayed once to the user this.corsParts = []; this.providerUrl = null; - this.events.setCommandHandler("config:cors:add", (url) => { + + this.registerEvents(); +}; + +Config.prototype.registerEvents = function() { + this.events.setCommandHandler("config:cors:add", (url, cb = () => {}) => { this.corsParts.push(url); this._updateBlockchainCors(); + + let configFilePath = this._getFileOrOject(this.configDir, 'blockchain', 'blockchain'); + const completeConfig = this._mergeConfig(configFilePath, {}, null, true); + const envConfig = completeConfig[this.env]; + + if (!envConfig.rpcCorsDomain || envConfig.rpcCorsDomain === 'auto') { + envConfig.rpcCorsDomain = {auto: true, additionalCors: []}; + } else if (typeof envConfig.rpcCorsDomain === 'string') { + envConfig.rpcCorsDomain = {auto: false, additionalCors: envConfig.rpcCorsDomain.join(',')}; + } else if (!envConfig.rpcCorsDomain.additionalCors) { + envConfig.rpcCorsDomain.additionalCors = []; + } + if (!envConfig.wsOrigins || envConfig.wsOrigins === 'auto') { + envConfig.wsOrigins = {auto: true, additionalCors: []}; + } else if (typeof envConfig.wsOrigins === 'string') { + envConfig.wsOrigins = {auto: false, additionalCors: envConfig.wsOrigins.join(',')}; + } else if (!envConfig.wsOrigins.additionalCors) { + envConfig.wsOrigins.additionalCors = []; + } + + envConfig.rpcCorsDomain.additionalCors.push(url); + envConfig.wsOrigins.additionalCors.push(url); + + let configString = JSON.stringify(completeConfig, null, 2); + if (fs.existsSync(configFilePath + '.js')) { + configFilePath += '.js'; + // TODO Find a better way, because if the users have more than the config, this doesn't work + configString = 'module.exports = ' + configString; + } else { + configFilePath += '.json'; + } + + fs.writeFile(configFilePath, configString, cb); + this.logger.info(__('Added "%s" to the CORS. You will need to restart your blockchain node or Embark for the changes to take effect', url)); }); - - self.events.setCommandHandler("config:contractsConfig", (cb) => { - cb(self.contractsConfig); + this.events.setCommandHandler("config:contractsConfig", (cb) => { + cb(this.contractsConfig); }); - self.events.setCommandHandler("config:contractsConfig:set", (config, cb) => { - self.contractsConfig = config; + this.events.setCommandHandler("config:contractsConfig:set", (config, cb) => { + this.contractsConfig = config; cb(); }); - self.events.setCommandHandler("config:contractsFiles", (cb) => { - cb(self.contractsFiles); + this.events.setCommandHandler("config:contractsFiles", (cb) => { + cb(this.contractsFiles); }); // TODO: refactor this so reading the file can be done with a normal resolver or something that takes advantage of the plugin api - self.events.setCommandHandler("config:contractsFiles:add", (filename, resolver) => { + this.events.setCommandHandler("config:contractsFiles:add", (filename, resolver) => { resolver = resolver || function(callback) { callback(fs.readFileSync(filename).toString()); }; - self.contractsFiles.push(new File({filename, type: File.types.custom, path: filename, resolver})); + this.contractsFiles.push(new File({filename, type: File.types.custom, path: filename, resolver})); }); - self.events.on('file-remove', (fileType, removedPath) => { + this.events.on('file-remove', (fileType, removedPath) => { if(fileType !== 'contract') return; const normalizedPath = path.normalize(removedPath); - self.contractsFiles = self.contractsFiles.filter(file => path.normalize(file.filename) !== normalizedPath); + this.contractsFiles = this.contractsFiles.filter(file => path.normalize(file.filename) !== normalizedPath); }); }; diff --git a/src/lib/modules/blockchain_process/index.js b/src/lib/modules/blockchain_process/index.js index 2dcbc602a..6b4a4169a 100644 --- a/src/lib/modules/blockchain_process/index.js +++ b/src/lib/modules/blockchain_process/index.js @@ -17,6 +17,19 @@ class BlockchainModule { this.client = options.client; this.registerBlockchainProcess(); + + embark.registerConsoleCommand({ + matches: (cmd) => { + const [cmdName] = cmd.split(' '); + return cmdName === 'addBlockchainCors' || cmdName === 'addCors'; + }, + usage: 'addBlockchainCors/addCors ', + description: 'Adds a CORS domain/origin to the blockchain configuration', + process: (cmd, callback) => { + const [_cmdName, url] = cmd.split(' '); + this.events.request('config:cors:add', url, callback); + } + }); } registerBlockchainProcess() {