isaacs / sax-js

A sax style parser for JS
Other
1.09k stars 325 forks source link

Error: Unexpected end #192

Open glebec opened 8 years ago

glebec commented 8 years ago

I am trying to end a stream that is piped from a sax stream by calling myStream.end(), and to my surprise, this causes sax to throw an error. Specifically, I have something like the following:

const fs = require('fs')
const itunes = require('itunes-library-stream') // uses `sax` and `stream-combiner` internally

fs.createReadStream(xmlPath)
.pipe(itunes.createTrackStream())
.on('data', function (data) {
  // ...
  if (stopCondition) this.end(); // throws an error: 'Unexpected end event' from sax library
  // ...
})

Why not allow stream users to signal when it is no longer necessary for sax to continue emitting data?

Stack trace for convenience:

Error: Unexpected end
    at error (/Users/glebec/Dev/fs/workshops/juke/node_modules/sax/lib/sax.js:642:8)
    at end (/Users/glebec/Dev/fs/workshops/juke/node_modules/sax/lib/sax.js:650:64)
    at Object.SAXParser.end (/Users/glebec/Dev/fs/workshops/juke/node_modules/sax/lib/sax.js:149:24)
    at SAXStream.end (/Users/glebec/Dev/fs/workshops/juke/node_modules/sax/lib/sax.js:234:16)
    at Stream.method [as end] (/Users/glebec/Dev/fs/workshops/juke/node_modules/duplexer/index.js:47:39)
    at Stream.<anonymous> (/Users/glebec/Dev/fs/workshops/juke/bin/iTunesSeed.js:84:12)
    at emitOne (events.js:96:13)
    at Stream.emit (events.js:188:7)
    at Transform.reemit (/Users/glebec/Dev/fs/workshops/juke/node_modules/duplexer/index.js:70:25)
    at emitOne (events.js:96:13)
    at Transform.emit (events.js:188:7)
    at Transform.<anonymous> (/Users/glebec/Dev/fs/workshops/juke/node_modules/through2/node_modules/readable-stream/lib/_stream_readable.js:786:14)
    at emitNone (events.js:86:13)
    at Transform.emit (events.js:185:7)
    at emitReadable_ (/Users/glebec/Dev/fs/workshops/juke/node_modules/through2/node_modules/readable-stream/lib/_stream_readable.js:448:10)
    at emitReadable (/Users/glebec/Dev/fs/workshops/juke/node_modules/through2/node_modules/readable-stream/lib/_stream_readable.js:444:5)
    at readableAddChunk (/Users/glebec/Dev/fs/workshops/juke/node_modules/through2/node_modules/readable-stream/lib/_stream_readable.js:187:9)
    at Transform.Readable.push (/Users/glebec/Dev/fs/workshops/juke/node_modules/through2/node_modules/readable-stream/lib/_stream_readable.js:149:10)
    at Transform.push (/Users/glebec/Dev/fs/workshops/juke/node_modules/through2/node_modules/readable-stream/lib/_stream_transform.js:145:32)
    at SAXStream.<anonymous> (/Users/glebec/Dev/fs/workshops/juke/node_modules/itunes-library-stream/index.js:53:40)
    at emitOne (events.js:96:13)
    at SAXStream.emit (events.js:188:7)
jacktuck commented 7 years ago

+1 I was just trying to do the same thing

jacktuck commented 7 years ago

Same even if i try this._parser.close() or this._parser.end()

ecofi commented 1 month ago

+1 indeed a parser.abort() method would be useful to gracefully stop the parsing because some parse errors causing a stop and parser.resume() is not working (only parser.write())