Se você estiver escrevendo um método para ler um arquivo como um fluxo e analisá-lo usando um analisador de streaming (por exemplo, pode ser JSON separado por nova linha), você pode escrever algo como:
function read(path) {
return fs.createReadStream(path)
.pipe(splitNewLines())
.pipe(parseJSON())
}
Se não houver erros, funcionará perfeitamente. Se houver um erro em parseJSON, ele será emitido no fluxo retornado, o que também é excelente. Se houver um erro ao ler o arquivo ou dividi-lo em linhas, você tem um problema. O erro não será tratado, a menos que você adicione uma lógica extra para encaminhá-lo, que seria mais ou menos assim:
function read(path) {
var src = fs.createReadStream(path)
var destA = src.pipe(splitNewLines())
var destB = destA.pipe(parseJSON())
//forward errors
src.on('error', destA.emit.bind(destA, 'error'))
destA.on('error', destB.emit.bind(destB, 'error'))
return destB
}
O que você quer é um método que funcione assim, pipe
mas encaminhe os erros. Isso é exatamente o que a barreira oferece a você no syphon
método:
var b = require('barrage')
function read(path) {
return b(fs.createReadStream(path))
.syphon(b(splitNewLines()))
.syphon(parseJSON())
}