UNPKG

2.07 kBJavaScriptView Raw
1var Readable = require('readable-stream').Readable
2var inherits = require('inherits')
3
4module.exports = from2
5
6from2.ctor = ctor
7from2.obj = obj
8
9var Proto = ctor()
10
11function toFunction(list) {
12 list = list.slice()
13 return function (_, cb) {
14 var err = null
15 var item = list.length ? list.shift() : null
16 if (item instanceof Error) {
17 err = item
18 item = null
19 }
20
21 cb(err, item)
22 }
23}
24
25function from2(opts, read) {
26 if (typeof opts !== 'object' || Array.isArray(opts)) {
27 read = opts
28 opts = {}
29 }
30
31 var rs = new Proto(opts)
32 rs._from = Array.isArray(read) ? toFunction(read) : (read || noop)
33 return rs
34}
35
36function ctor(opts, read) {
37 if (typeof opts === 'function') {
38 read = opts
39 opts = {}
40 }
41
42 opts = defaults(opts)
43
44 inherits(Class, Readable)
45 function Class(override) {
46 if (!(this instanceof Class)) return new Class(override)
47 this._reading = false
48 this._callback = check
49 this.destroyed = false
50 Readable.call(this, override || opts)
51
52 var self = this
53 var hwm = this._readableState.highWaterMark
54
55 function check(err, data) {
56 if (self.destroyed) return
57 if (err) return self.destroy(err)
58 if (data === null) return self.push(null)
59 self._reading = false
60 if (self.push(data)) self._read(hwm)
61 }
62 }
63
64 Class.prototype._from = read || noop
65 Class.prototype._read = function(size) {
66 if (this._reading || this.destroyed) return
67 this._reading = true
68 this._from(size, this._callback)
69 }
70
71 Class.prototype.destroy = function(err) {
72 if (this.destroyed) return
73 this.destroyed = true
74
75 var self = this
76 process.nextTick(function() {
77 if (err) self.emit('error', err)
78 self.emit('close')
79 })
80 }
81
82 return Class
83}
84
85function obj(opts, read) {
86 if (typeof opts === 'function' || Array.isArray(opts)) {
87 read = opts
88 opts = {}
89 }
90
91 opts = defaults(opts)
92 opts.objectMode = true
93 opts.highWaterMark = 16
94
95 return from2(opts, read)
96}
97
98function noop () {}
99
100function defaults(opts) {
101 opts = opts || {}
102 return opts
103}