Skip to content

Instantly share code, notes, and snippets.

@Azerothian
Last active September 14, 2015 07:55
Show Gist options
  • Save Azerothian/bf67be78371b2a63ffc3 to your computer and use it in GitHub Desktop.
Save Azerothian/bf67be78371b2a63ffc3 to your computer and use it in GitHub Desktop.
Expects target file to export a Promise. use stdin and stdout for comms between new instance of node
log = require("./logger")("mrc:launcher:")
if require.main == module
file = process.argv[2]
console.log "start", file
target = require file
process.on "message", (args) ->
sendResponse = (status, data) ->
process.send { status, data }
process.exit(0)
return target.apply(undefined, args).then (result) ->
return sendResponse(true, result)
, (err) ->
return sendResponse(false, err)
else
Promise = require "native-or-bluebird"
{spawn} = require "child_process"
path = require("path").posix
module.exports = (target, runtime = "coffee") ->
return () ->
args = [].slice.call(arguments)
return new Promise (resolve, reject) ->
reqTarget = path.relative __dirname, path.resolve(path.dirname(module.parent.filename), target)
if reqTarget.indexOf("./") == -1
reqTarget = "./#{reqTarget}"
launcherPath = "./" + path.relative process.cwd(), module.filename
cmd = spawn runtime, [launcherPath, reqTarget], {
cwd: process.cwd()
env: process.env
stdio: [null,1,2,'ipc']
}
response = ""
cmd.on "message", (message) ->
console.log "message", message
response = message
cmd.on "close", (code) ->
log.info "process closed"
{status, data} = response
if status
return resolve(data)
else
return reject(data)
cmd.send args
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment