Initial commit
[yaffs-website] / node_modules / end-of-stream / index.js
1 var once = require('once');
2
3 var noop = function() {};
4
5 var isRequest = function(stream) {
6         return stream.setHeader && typeof stream.abort === 'function';
7 };
8
9 var eos = function(stream, opts, callback) {
10         if (typeof opts === 'function') return eos(stream, null, opts);
11         if (!opts) opts = {};
12
13         callback = once(callback || noop);
14
15         var ws = stream._writableState;
16         var rs = stream._readableState;
17         var readable = opts.readable || (opts.readable !== false && stream.readable);
18         var writable = opts.writable || (opts.writable !== false && stream.writable);
19
20         var onlegacyfinish = function() {
21                 if (!stream.writable) onfinish();
22         };
23
24         var onfinish = function() {
25                 writable = false;
26                 if (!readable) callback();
27         };
28
29         var onend = function() {
30                 readable = false;
31                 if (!writable) callback();
32         };
33
34         var onclose = function() {
35                 if (readable && !(rs && rs.ended)) return callback(new Error('premature close'));
36                 if (writable && !(ws && ws.ended)) return callback(new Error('premature close'));
37         };
38
39         var onrequest = function() {
40                 stream.req.on('finish', onfinish);
41         };
42
43         if (isRequest(stream)) {
44                 stream.on('complete', onfinish);
45                 stream.on('abort', onclose);
46                 if (stream.req) onrequest();
47                 else stream.on('request', onrequest);
48         } else if (writable && !ws) { // legacy streams
49                 stream.on('end', onlegacyfinish);
50                 stream.on('close', onlegacyfinish);
51         }
52
53         stream.on('end', onend);
54         stream.on('finish', onfinish);
55         if (opts.error !== false) stream.on('error', callback);
56         stream.on('close', onclose);
57
58         return stream;
59 };
60
61 module.exports = eos;