diff --git a/packages/core/src/statements/unpack.js b/packages/core/src/statements/unpack.js index 6f561b0a..b4769aa0 100644 --- a/packages/core/src/statements/unpack.js +++ b/packages/core/src/statements/unpack.js @@ -1,3 +1,5 @@ +import debug from 'debug'; + const eol = '\n'; /** @@ -28,7 +30,13 @@ export default function unpack(data, feed) { } this.remainder = lines.pop(); lines.filter(Boolean).forEach((line) => { - feed.write(JSON.parse(line)); + try { + const lineParsed = JSON.parse(line); + return feed.write(lineParsed); + } catch(e) { + debug('ezs')(`[unpack] Syntax error at #${this.getIndex()+1} with ${line}`); + return feed.stop(e); + } }); return feed.end(); } diff --git a/packages/core/test/statements.js b/packages/core/test/statements.js index 94b743da..7cfa8b07 100644 --- a/packages/core/test/statements.js +++ b/packages/core/test/statements.js @@ -340,6 +340,25 @@ describe('statements', () => { done(); }); }); + it('unpack#4', (done) => { + const input = [ + '"aaa"\nbbb"\n"ccc"\n', + '"ddd"\n"eee"\n"fff"', + ]; + from(input) + .pipe(ezs('unpack')) + .pipe(ezs.catch()) + .on('error', (e) => { + expect(e.message).toEqual(expect.stringContaining('SyntaxError')); + done(); + }) + .on('data', (item) => { + assert.equal(item, 'aaa'); + }) + .on('end', () => { + done(new Error('Error is the right behavior')); + }); + }); it('truncate#1', (done) => { const res = []; from(['aa', 'bb', 'cc', 'dd', 'ee'])