| var Stream = require('stream') | |
| // through | |
| // | |
| // a stream that does nothing but re-emit the input. | |
| // useful for aggregating a series of changing but not ending streams into one stream) | |
| exports = module.exports = through | |
| through.through = through | |
| //create a readable writable stream. | |
| function through (write, end, opts) { | |
| write = write || function (data) { this.queue(data) } | |
| end = end || function () { this.queue(null) } | |
| var ended = false, destroyed = false, buffer = [], _ended = false | |
| var stream = new Stream() | |
| stream.readable = stream.writable = true | |
| stream.paused = false | |
| // stream.autoPause = !(opts && opts.autoPause === false) | |
| stream.autoDestroy = !(opts && opts.autoDestroy === false) | |
| stream.write = function (data) { | |
| write.call(this, data) | |
| return !stream.paused | |
| } | |
| function drain() { | |
| while(buffer.length && !stream.paused) { | |
| var data = buffer.shift() | |
| if(null === data) | |
| return stream.emit('end') | |
| else | |
| stream.emit('data', data) | |
| } | |
| } | |
| stream.queue = stream.push = function (data) { | |
| // console.error(ended) | |
| if(_ended) return stream | |
| if(data === null) _ended = true | |
| buffer.push(data) | |
| drain() | |
| return stream | |
| } | |
| //this will be registered as the first 'end' listener | |
| //must call destroy next tick, to make sure we're after any | |
| //stream piped from here. | |
| //this is only a problem if end is not emitted synchronously. | |
| //a nicer way to do this is to make sure this is the last listener for 'end' | |
| stream.on('end', function () { | |
| stream.readable = false | |
| if(!stream.writable && stream.autoDestroy) | |
| process.nextTick(function () { | |
| stream.destroy() | |
| }) | |
| }) | |
| function _end () { | |
| stream.writable = false | |
| end.call(stream) | |
| if(!stream.readable && stream.autoDestroy) | |
| stream.destroy() | |
| } | |
| stream.end = function (data) { | |
| if(ended) return | |
| ended = true | |
| if(arguments.length) stream.write(data) | |
| _end() // will emit or queue | |
| return stream | |
| } | |
| stream.destroy = function () { | |
| if(destroyed) return | |
| destroyed = true | |
| ended = true | |
| buffer.length = 0 | |
| stream.writable = stream.readable = false | |
| stream.emit('close') | |
| return stream | |
| } | |
| stream.pause = function () { | |
| if(stream.paused) return | |
| stream.paused = true | |
| return stream | |
| } | |
| stream.resume = function () { | |
| if(stream.paused) { | |
| stream.paused = false | |
| stream.emit('resume') | |
| } | |
| drain() | |
| //may have become paused again, | |
| //as drain emits 'data'. | |
| if(!stream.paused) | |
| stream.emit('drain') | |
| return stream | |
| } | |
| return stream | |
| } | |
Xet Storage Details
- Size:
- 2.62 kB
- Xet hash:
- 5d4d61f13da1431adfd2ff1a17efe826a7c7130fb8fef643dbe6cc1e2ab01a69
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.