1 | (function() {
|
2 | var stream;
|
3 |
|
4 | stream = require('stream');
|
5 |
|
6 | exports.take = function(base, n, done, dstat) {
|
7 | var ended, fin, rem, wrap, wrapread;
|
8 | rem = n;
|
9 | wrap = stream.Readable();
|
10 | ended = false;
|
11 | if (done != null) {
|
12 | wrap.once('end', done);
|
13 | }
|
14 | base.once('end', function() {
|
15 | ended = true;
|
16 | return fin();
|
17 | });
|
18 | fin = function() {
|
19 | wrap.push(null);
|
20 | return base.removeListener('readable', wrapread);
|
21 | };
|
22 | wrap._read = function(size) {
|
23 | var data;
|
24 | if (ended || rem <= 0) {
|
25 | return;
|
26 | }
|
27 | if (size != null) {
|
28 | size = Math.min(size, rem);
|
29 | } else {
|
30 | size = rem;
|
31 | }
|
32 | data = base.read(size);
|
33 | if (data == null) {
|
34 | data = base.read();
|
35 | }
|
36 | if (data != null) {
|
37 | rem -= data.length;
|
38 | wrap.push(data);
|
39 | if (typeof dstat === "function") {
|
40 | dstat(n - rem, n);
|
41 | }
|
42 | if (rem <= 0) {
|
43 | return fin();
|
44 | }
|
45 | }
|
46 | };
|
47 | wrapread = function() {
|
48 | return wrap._read();
|
49 | };
|
50 | base.on('readable', wrapread);
|
51 | return wrap;
|
52 | };
|
53 |
|
54 | }).call(this);
|