parse-sax.js 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. "use strict";
  2. const {
  3. SaxesParser
  4. } = require('saxes');
  5. const {
  6. PassThrough
  7. } = require('readable-stream');
  8. const {
  9. bufferToString
  10. } = require('./browser-buffer-decode');
  11. module.exports = async function* (iterable) {
  12. // TODO: Remove once node v8 is deprecated
  13. // Detect and upgrade old streams
  14. if (iterable.pipe && !iterable[Symbol.asyncIterator]) {
  15. iterable = iterable.pipe(new PassThrough());
  16. }
  17. const saxesParser = new SaxesParser();
  18. let error;
  19. saxesParser.on('error', err => {
  20. error = err;
  21. });
  22. let events = [];
  23. saxesParser.on('opentag', value => events.push({
  24. eventType: 'opentag',
  25. value
  26. }));
  27. saxesParser.on('text', value => events.push({
  28. eventType: 'text',
  29. value
  30. }));
  31. saxesParser.on('closetag', value => events.push({
  32. eventType: 'closetag',
  33. value
  34. }));
  35. for await (const chunk of iterable) {
  36. saxesParser.write(bufferToString(chunk));
  37. // saxesParser.write and saxesParser.on() are synchronous,
  38. // so we can only reach the below line once all events have been emitted
  39. if (error) throw error;
  40. // As a performance optimization, we gather all events instead of passing
  41. // them one by one, which would cause each event to go through the event queue
  42. yield events;
  43. events = [];
  44. }
  45. };
  46. //# sourceMappingURL=parse-sax.js.map