node-plantuml
Version:
A Node.js module and CLI for running PlantUML
92 lines (76 loc) • 2.37 kB
JavaScript
var childProcess = require('child_process')
var path = require('path')
var nailgun = require('node-nailgun-server')
var ngClient = require('node-nailgun-client')
var INCLUDED_PLANTUML_JAR = path.join(__dirname, '../vendor/plantuml.jar')
var PLANTUML_JAR = process.env.PLANTUML_HOME || INCLUDED_PLANTUML_JAR
var PLANTUML_NAIL_JAR = path.join(__dirname, '../nail/plantumlnail.jar')
var PLANTUML_NAIL_CLASS = 'PlantumlNail'
var LOCALHOST = 'localhost'
var GENERATE_PORT = 0
var nailgunServer
var clientOptions
var nailgunRunning = false
module.exports.useNailgun = function (callback) {
var options = { address: LOCALHOST, port: GENERATE_PORT }
nailgunServer = nailgun.createServer(options, function (port) {
clientOptions = {
host: LOCALHOST,
port: port
}
ngClient.exec('ng-cp', [PLANTUML_JAR], clientOptions)
ngClient.exec('ng-cp', [PLANTUML_NAIL_JAR], clientOptions)
// Give Nailgun some time to load the classpath
setTimeout(function () {
nailgunRunning = true
if (typeof callback === 'function') {
callback()
}
}, 50)
})
return nailgunServer
}
// TODO: proper error handling
function execWithNailgun (argv, cwd, cb) {
clientOptions.cwd = cwd || process.cwd()
return ngClient.exec(PLANTUML_NAIL_CLASS, argv, clientOptions)
}
// TODO: proper error handling
function execWithSpawn (argv, cwd, cb) {
cwd = cwd || process.cwd()
var opts = [
'-Dplantuml.include.path=' + cwd,
'-Djava.awt.headless=true',
'-jar', PLANTUML_JAR
].concat(argv)
return childProcess.spawn('java', opts)
}
module.exports.exec = function (argv, cwd, callback) {
if (typeof argv === 'function') {
callback = argv
argv = undefined
cwd = undefined
} else if (typeof cwd === 'function') {
callback = cwd
cwd = undefined
}
var task
if (nailgunRunning) {
task = execWithNailgun(argv, cwd, callback)
} else {
task = execWithSpawn(argv, cwd, callback)
}
if (typeof callback === 'function') {
var chunks = []
task.stdout.on('data', function (chunk) { chunks.push(chunk) })
task.stdout.on('end', function () {
var data = Buffer.concat(chunks)
callback(null, data)
})
task.stdout.on('error', function () {
callback(new Error('error while reading plantuml output'), null)
})
}
return task
}