You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
31 lines
1.2 KiB
31 lines
1.2 KiB
const {SaxesParser} = require('saxes');
|
|
const {PassThrough} = require('readable-stream');
|
|
const {bufferToString} = require('./browser-buffer-decode');
|
|
|
|
module.exports = async function* (iterable) {
|
|
// TODO: Remove once node v8 is deprecated
|
|
// Detect and upgrade old streams
|
|
if (iterable.pipe && !iterable[Symbol.asyncIterator]) {
|
|
iterable = iterable.pipe(new PassThrough());
|
|
}
|
|
const saxesParser = new SaxesParser();
|
|
let error;
|
|
saxesParser.on('error', err => {
|
|
error = err;
|
|
});
|
|
let events = [];
|
|
saxesParser.on('opentag', value => events.push({eventType: 'opentag', value}));
|
|
saxesParser.on('text', value => events.push({eventType: 'text', value}));
|
|
saxesParser.on('closetag', value => events.push({eventType: 'closetag', value}));
|
|
for await (const chunk of iterable) {
|
|
saxesParser.write(bufferToString(chunk));
|
|
// saxesParser.write and saxesParser.on() are synchronous,
|
|
// so we can only reach the below line once all events have been emitted
|
|
if (error) throw error;
|
|
// As a performance optimization, we gather all events instead of passing
|
|
// them one by one, which would cause each event to go through the event queue
|
|
yield events;
|
|
events = [];
|
|
}
|
|
};
|