add more functionnalities:

- start/stop geth/mist to the right ipc endpoint
 - start a frontend
 - automine if pending txs
pull/454/head
yann300 7 years ago
parent 1c9ace39d4
commit 4b231d0bc1
  1. 7
      package.json
  2. 53
      src/main.js
  3. 37
      src/services/autoMine.js
  4. 13
      src/services/startFrontend.js
  5. 89
      src/services/startMistGeth.js

@ -5,7 +5,7 @@
"main": "./src/main.js", "main": "./src/main.js",
"scripts": { "scripts": {
"test": "echo \"Error: no test specified\" && exit 1", "test": "echo \"Error: no test specified\" && exit 1",
"start": "node ./src/main.js" "start": "node ./src/main.js --dev-path /home/yann/Ethereum/testchains/test2 --mist --geth --frontend /home/yann/Ethereum/DevCon3/frontend --frontend-port 8084 --auto-mine"
}, },
"repository": { "repository": {
"type": "git", "type": "git",
@ -32,5 +32,10 @@
}, },
"bin": { "bin": {
"remixd": "./src/main.js" "remixd": "./src/main.js"
},
"devDependencies": {
"serve": "^6.3.1",
"stdout": "0.0.3",
"web3": "^1.0.0-beta.24"
} }
} }

@ -1,19 +1,60 @@
#!/usr/bin/env node #!/usr/bin/env node
var Router = require('./router') var Router = require('./router')
var program = require('commander') var program = require('commander')
var startmistGeth = require('./services/startMistGeth')
var startFrontend = require('./services/startFrontend')
var fs = require('fs-extra')
program program
.usage('-S <shared folder>') .usage('-S <shared folder>')
.description('Provide a two ways connection between the local computer and Remix IDE') .description('Provide a two ways connection between the local computer and Remix IDE')
.option('-S, --shared-folder <path>', 'Folder to share with Remix IDE') .option('-s, --shared-folder <path>', 'Folder to share with Remix IDE')
.option('-m, --mist', 'start mist')
.option('-g, --geth', 'start geth')
.option('-p, --dev-path <dev-path>', 'Folder used by mist/geth to start the development instance')
.option('-f, --frontend <front-end>', 'Folder that should be served by remixd')
.option('-p, --frontend-port <front-end-port>', 'Http port used by the frontend (default 8082)')
.option('-a, --auto-mine', 'mine pending transactions')
.parse(process.argv) .parse(process.argv)
console.log('example: --dev-path /home/devchains/chain1 --mist --geth --frontend /home/frontend --frontend-port 8084 --auto-mine')
if (!program.sharedFolder) {
program.outputHelp() program.outputHelp()
process.exit(1)
var killCallBack = []
if (program.devPath) {
if (fs.existsSync(program.devPath)) {
killCallBack.push(startmistGeth(program.devPath, program.mist, program.geth, program.autoMine))
} else { } else {
console.log('\x1b[33m%s\x1b[0m', '[WARN] Any application that runs on your computer can potentially read from and write to all files in the directory.') console.log('\x1b[31m%s\x1b[0m', '[ERR] can\'t start mist/geth. ' + program.devPath + ' does not exist')
console.log('\x1b[33m%s\x1b[0m', '[WARN] Symbolinc links are not forwarded to Remix IDE\n') }
}
if (program.frontend) {
if (!program.frontendPort) program.frontendPort = 8082
if (fs.existsSync(program.frontend)) {
killCallBack.push(startFrontend(program.frontend, program.frontendPort))
} else {
console.log('\x1b[31m%s\x1b[0m', '[ERR] can\'t start frontend. ' + program.frontend + ' does not exist')
}
} }
if (program.sharedFolder) {
console.log('\x1b[33m%s\x1b[0m', '[WARN] Any application that runs on your computer can potentially read from and write to all files in the directory.')
console.log('\x1b[33m%s\x1b[0m', '[WARN] Symbolinc links are not forwarded to Remix IDE\n')
var router = new Router() var router = new Router()
router.start(program.sharedFolder) router.start(program.sharedFolder)
}
// kill
function kill () {
for (var k in killCallBack) {
try {
killCallBack[k]()
} catch (e) {
console.log(e)
}
}
}
process.on('SIGINT', kill) // catch ctrl-c
process.on('SIGTERM', kill) // catch kill
process.on('exit', kill)

@ -0,0 +1,37 @@
module.exports = function (web3) {
console.log('auto mine transactions')
var methods = []
methods.push({
name: 'start',
call: 'miner_start',
inputFormatter: [null],
params: 1
})
methods.push({
name: 'stop',
call: 'miner_stop',
inputFormatter: [],
params: 0
})
web3.extend({
property: 'miner',
methods: methods,
properties: []
})
var timeOutId
web3.eth.subscribe('pendingTransactions', (error, result) => {
if (error) {
console.log(error)
} else {
console.log('start or continue mining')
web3.miner.start()
if (timeOutId) clearTimeout(timeOutId)
timeOutId = setTimeout(() => {
console.log('stop mining')
web3.miner.stop()
}, 30000)
}
})
}

@ -0,0 +1,13 @@
const serve = require('serve')
module.exports = function (path, port) {
var server = serve(path, {
port: port
})
function kill () {
console.log('stopping frontend')
server.stop()
}
return kill
}

@ -0,0 +1,89 @@
var spawn = require('child_process').spawn
var stdout = require('stdout')
var autoMine = require('./autoMine')
var Web3 = require('web3')
var net = require('net')
var connectTimeout
module.exports = function (dataDir, mist, geth, mine) {
console.log(mist)
console.log(geth)
console.log('opening dev env at ' + dataDir)
// geth --vmdebug --dev --ipcpath /home/yann/Ethereum/testchains/test2/geth.ipc --datadir /home/yann/Ethereum/testchains/test2
var gethprocess
if (geth) {
var ipcPath = dataDir + '/geth.ipc'
var gethArgs = [
'--vmdebug',
'--dev',
'--ipcpath', ipcPath,
'--datadir', dataDir
]
console.log('starting geth ... ' + ipcPath)
gethprocess = run('geth', gethArgs)
connectTimeout = setInterval(() => {
connectWeb3(ipcPath, (web3) => {
clearInterval(connectTimeout)
if (mine) {
autoMine(web3)
}
})
}, 1000)
}
// mist --rpc /home/yann/Ethereum/testchains/test2/geth.ipc
var mistprocess
if (mist) {
const mistArgs = [
'--rpc', ipcPath
]
console.log('starting mist ...')
mistprocess = run('mist', mistArgs)
}
function kill () {
if (connectTimeout) {
clearInterval(connectTimeout)
}
if (mistprocess) {
console.log('stopping mist')
mistprocess.kill()
}
if (gethprocess) {
console.log('stopping geth')
gethprocess.kill()
}
}
return kill
}
function connectWeb3 (ipcpath, cb) {
try {
console.log('connect to ' + ipcpath)
var web3 = new Web3(new Web3.providers.IpcProvider(ipcpath, net))
web3.eth.getBlockNumber(function (error) {
if (error) {
console.log('still trying to connect to node... ' + error)
} else {
cb(web3)
}
})
} catch (e) {}
}
function run (app, args) {
var proc
try {
proc = spawn(app, args)
proc.on('error', (err) => {
console.log('\x1b[31m%s\x1b[0m', '[ERR] can\'t start ' + app + '. seems not installed')
console.log(err)
})
proc.stdout.pipe(stdout())
} catch (e) {
}
return proc
}
Loading…
Cancel
Save