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.
		
		
		
		
		
			
		
			
				
					75 lines
				
				1.3 KiB
			
		
		
			
		
	
	
					75 lines
				
				1.3 KiB
			| 
											2 years ago
										 | const {EventEmitter} = require('events'); | ||
|  | 
 | ||
|  | class LineBuffer extends EventEmitter { | ||
|  |   constructor(options) { | ||
|  |     super(); | ||
|  | 
 | ||
|  |     this.encoding = options.encoding; | ||
|  | 
 | ||
|  |     this.buffer = null; | ||
|  | 
 | ||
|  |     // part of cork/uncork
 | ||
|  |     this.corked = false; | ||
|  |     this.queue = []; | ||
|  |   } | ||
|  | 
 | ||
|  |   // Events:
 | ||
|  |   //  line: here is a line
 | ||
|  |   //  done: all lines emitted
 | ||
|  | 
 | ||
|  |   write(chunk) { | ||
|  |     // find line or lines in chunk and emit them if not corked
 | ||
|  |     // or queue them if corked
 | ||
|  |     const data = this.buffer ? this.buffer + chunk : chunk; | ||
|  |     const lines = data.split(/\r?\n/g); | ||
|  | 
 | ||
|  |     // save the last line
 | ||
|  |     this.buffer = lines.pop(); | ||
|  | 
 | ||
|  |     lines.forEach(function(line) { | ||
|  |       if (this.corked) { | ||
|  |         this.queue.push(line); | ||
|  |       } else { | ||
|  |         this.emit('line', line); | ||
|  |       } | ||
|  |     }); | ||
|  | 
 | ||
|  |     return !this.corked; | ||
|  |   } | ||
|  | 
 | ||
|  |   cork() { | ||
|  |     this.corked = true; | ||
|  |   } | ||
|  | 
 | ||
|  |   uncork() { | ||
|  |     this.corked = false; | ||
|  |     this._flush(); | ||
|  | 
 | ||
|  |     // tell the source I'm ready again
 | ||
|  |     this.emit('drain'); | ||
|  |   } | ||
|  | 
 | ||
|  |   setDefaultEncoding() { | ||
|  |     // ?
 | ||
|  |   } | ||
|  | 
 | ||
|  |   end() { | ||
|  |     if (this.buffer) { | ||
|  |       this.emit('line', this.buffer); | ||
|  |       this.buffer = null; | ||
|  |     } | ||
|  |     this.emit('done'); | ||
|  |   } | ||
|  | 
 | ||
|  |   _flush() { | ||
|  |     if (!this.corked) { | ||
|  |       this.queue.forEach(line => { | ||
|  |         this.emit('line', line); | ||
|  |       }); | ||
|  |       this.queue = []; | ||
|  |     } | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | module.exports = LineBuffer; |