1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- 'use strict';
- var Stream = require('stream')
- // from
- //
- // a stream that reads from an source.
- // source may be an array, or a function.
- // from handles pause behaviour for you.
- module.exports =
- function from (source) {
- if(Array.isArray(source)) {
- var source_index = 0, source_len = source.length;
- return from (function (i) {
- if(source_index < source_len)
- this.emit('data', source[source_index++])
- else
- this.emit('end')
- return true
- })
- }
- var s = new Stream(), i = 0
- s.ended = false
- s.started = false
- s.readable = true
- s.writable = false
- s.paused = false
- s.ended = false
- s.pause = function () {
- s.started = true
- s.paused = true
- }
- function next () {
- s.started = true
- if(s.ended) return
- while(!s.ended && !s.paused && source.call(s, i++, function () {
- if(!s.ended && !s.paused)
- process.nextTick(next);
- }))
- ;
- }
- s.resume = function () {
- s.started = true
- s.paused = false
- next()
- }
- s.on('end', function () {
- s.ended = true
- s.readable = false
- process.nextTick(s.destroy)
- })
- s.destroy = function () {
- s.ended = true
- s.emit('close')
- }
- /*
- by default, the stream will start emitting at nextTick
- if you want, you can pause it, after pipeing.
- you can also resume before next tick, and that will also
- work.
- */
- process.nextTick(function () {
- if(!s.started) s.resume()
- })
- return s
- }
|