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
						
					
					
				| 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;
 |