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.
54 lines
1.5 KiB
54 lines
1.5 KiB
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') |
|
}
|
|
|