gm
gm copied to clipboard
Enable error handling when streaming
See discussion of the problem in #256 (and a bit more in #548).
Adding proc
to the .stream()
callback seems like the easiest way to allow the caller to handle this. Tested in a downstream package and it works, though it's not terribly convenient.
When no callback is provided, emit an error
event on the throughStream.
Before and after this change, I have two failing tests, which appear to be unrelated.
Same errors are appearing in CI. Again, I don't think they are related to this change.
@aheckmann Could you take a look, please? Would be great to get this fixed for badges/shields#914.
Hi @aheckmann , this is an important PR, otherwise the use of .stream()
is unreliable.
I guess the PR would have to get rebased, if that's done, would you merge it?
Thanks.
Hello, I bumped into this in one of my projects today and I more or less solved it by bypassing .stream()
like the following.
And if somebody else stumbles onto this here is one solution to at least notice the warnings
async function gmToBuffer (data) {
return new Promise((resolve, reject) => {
let chunks = [];
data._preprocess((err) => {
if (err) return reject(err);
data._spawn(data.args(), false, (err, stdout, stderr) => {
if (err) return reject(err);
stdout.on('data', (chunk) => chunks.push(chunk));
stdout.once('end', () => resolve(Buffer.concat(chunks)));
stderr.on('data', (msg) => {
const error_message = String(msg);
if (error_message.includes('@ warning/')) {
logger.error(error_message);
} else {
stdout.emit('error', new Error(error_message));
}
});
stdout.once('error', (err) => reject(err));
});
});
});
}
And to be specific I wanted to still get the warning and not just silence them.