noide
Version:
Web Editor built on hapi and nes websockets using browserify, superviews.js, bootstrap and the ACE editor.
138 lines (126 loc) • 3.09 kB
JavaScript
var Joi = require('joi')
var Boom = require('boom')
var spawnargs = require('spawn-args')
var spawn = require('child_process').spawn
var procs = {}
function getProcesses () {
const pids = Object.keys(procs)
return pids.map((pid) => {
return {
pid: procs[pid].pid,
buffer: procs[pid].buffer,
name: procs[pid].name,
command: procs[pid].command
}
})
}
module.exports = [{
path: '/io',
method: 'POST',
config: {
handler: function (request, reply) {
// const task = request.payload.task
const name = request.payload.name
const command = request.payload.command
const args = spawnargs(command)
// const proc = spawn(task.command, task.args, task.options)
const child = spawn(args[0], args.slice(1))
const pid = child.pid
child.on('error', (err) => {
console.error(err)
var data = err.toString()
if (pid) {
var proc = procs[pid]
if (proc) {
proc.buffer = data
}
server.publish('/io', {
data: data,
pid: pid
})
}
})
if (!pid) {
return reply(Boom.badRequest(`Failed to start child process \'${command}\'`))
}
const socket = request.socket
const server = request.server
procs[pid] = {
pid: pid,
child: child,
buffer: '',
name: name,
command: command,
socket: socket.id
}
// proc.stdout.pipe(process.stdout)
child.stdout.on('data', (data) => {
console.log(data.toString())
// socket.send(data.toString())
data = data.toString()
var proc = procs[pid]
if (proc) {
proc.buffer = data
}
server.publish('/io', {
data: data,
pid: pid
})
})
child.stderr.on('data', (data) => {
console.log(data.toString())
// socket.send(data.toString())
data = data.toString()
var proc = procs[pid]
if (proc) {
proc.buffer = data
}
server.publish('/io', {
data: data,
pid: pid
})
})
child.on('exit', (code) => {
delete procs[pid]
server.publish('/io', {
data: `Child exited with code ${code}` + '\n',
pid: pid
})
server.publish('/io/pids', getProcesses())
})
reply(pid)
server.publish('/io/pids', getProcesses())
},
validate: {
payload: {
name: Joi.string().required(),
command: Joi.string().required()
}
}
}
}, {
path: '/io/pids',
method: 'GET',
config: {
handler: function (request, reply) {
reply(getProcesses())
}
}
}, {
path: '/io/kill',
method: 'POST',
config: {
handler: function (request, reply) {
var proc = procs[request.payload.pid]
if (proc) {
proc.child.kill()
}
reply(proc ? proc.pid : null)
},
validate: {
payload: {
pid: Joi.number().required()
}
}
}
}]