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
			| 
											2 years ago
										 | 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 = []; | ||
|  |   } | ||
|  | }; |