blob: 4c6fb28486ed829acea6f7584a7ec61051725c93 [file] [log] [blame]
var util = require('util')
var Promise = require('bluebird')
var split = require('split')
function NoSuchLineError(message) {
Error.call(this, message)
this.name = 'NoSuchLineError'
Error.captureStackTrace(this, NoSuchLineError)
}
util.inherits(NoSuchLineError, Error)
module.exports.NoSuchLineError = NoSuchLineError
module.exports.readAll = function(stream) {
var resolver = Promise.defer()
var collected = new Buffer(0)
function errorListener(err) {
resolver.reject(err)
}
function endListener() {
resolver.resolve(collected)
}
function readableListener() {
var chunk
while ((chunk = stream.read())) {
collected = Buffer.concat([collected, chunk])
}
}
stream.on('error', errorListener)
stream.on('readable', readableListener)
stream.on('end', endListener)
return resolver.promise.finally(function() {
stream.removeListener('error', errorListener)
stream.removeListener('readable', readableListener)
stream.removeListener('end', endListener)
})
}
module.exports.findLine = function(stream, re) {
var resolver = Promise.defer()
var piped = stream.pipe(split())
function errorListener(err) {
resolver.reject(err)
}
function endListener() {
resolver.reject(new NoSuchLineError())
}
function lineListener(line) {
if (re.test(line)) {
resolver.resolve(line)
}
}
piped.on('error', errorListener)
piped.on('data', lineListener)
piped.on('end', endListener)
return resolver.promise.finally(function() {
piped.removeListener('error', errorListener)
piped.removeListener('data', lineListener)
piped.removeListener('end', endListener)
stream.unpipe(piped)
})
}
module.exports.talk = function(log, format, stream) {
stream.pipe(split())
.on('data', function(chunk) {
var line = chunk.toString().trim()
if (line.length) {
log.info(format, line)
}
})
}