55 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			55 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| var stream = require('readable-stream')
 | |
| var inherits = require('inherits')
 | |
| 
 | |
| var SIGNAL_FLUSH =(Buffer.from && Buffer.from !== Uint8Array.from)
 | |
|   ? Buffer.from([0])
 | |
|   : new Buffer([0])
 | |
| 
 | |
| module.exports = WriteStream
 | |
| 
 | |
| function WriteStream (opts, write, flush) {
 | |
|   if (!(this instanceof WriteStream)) return new WriteStream(opts, write, flush)
 | |
| 
 | |
|   if (typeof opts === 'function') {
 | |
|     flush = write
 | |
|     write = opts
 | |
|     opts = {}
 | |
|   }
 | |
| 
 | |
|   stream.Writable.call(this, opts)
 | |
| 
 | |
|   this.destroyed = false
 | |
|   this._worker = write || null
 | |
|   this._flush = flush || null
 | |
| }
 | |
| 
 | |
| inherits(WriteStream, stream.Writable)
 | |
| 
 | |
| WriteStream.obj = function (opts, worker, flush) {
 | |
|   if (typeof opts === 'function') return WriteStream.obj(null, opts, worker)
 | |
|   if (!opts) opts = {}
 | |
|   opts.objectMode = true
 | |
|   return new WriteStream(opts, worker, flush)
 | |
| }
 | |
| 
 | |
| WriteStream.prototype._write = function (data, enc, cb) {
 | |
|   if (SIGNAL_FLUSH === data) this._flush(cb)
 | |
|   else this._worker(data, enc, cb)
 | |
| }
 | |
| 
 | |
| WriteStream.prototype.end = function (data, enc, cb) {
 | |
|   if (!this._flush) return stream.Writable.prototype.end.apply(this, arguments)
 | |
|   if (typeof data === 'function') return this.end(null, null, data)
 | |
|   if (typeof enc === 'function') return this.end(data, null, enc)
 | |
|   if (data) this.write(data)
 | |
|   if (!this._writableState.ending) this.write(SIGNAL_FLUSH)
 | |
|   return stream.Writable.prototype.end.call(this, cb)
 | |
| }
 | |
| 
 | |
| WriteStream.prototype.destroy = function (err) {
 | |
|   if (this.destroyed) return
 | |
|   this.destroyed = true
 | |
|   if (err) this.emit('error', err)
 | |
|   this.emit('close')
 | |
| }
 |