1 var once = require('once');
3 var noop = function() {};
5 var isRequest = function(stream) {
6 return stream.setHeader && typeof stream.abort === 'function';
9 var eos = function(stream, opts, callback) {
10 if (typeof opts === 'function') return eos(stream, null, opts);
13 callback = once(callback || noop);
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);
20 var onlegacyfinish = function() {
21 if (!stream.writable) onfinish();
24 var onfinish = function() {
26 if (!readable) callback();
29 var onend = function() {
31 if (!writable) callback();
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'));
39 var onrequest = function() {
40 stream.req.on('finish', onfinish);
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);
53 stream.on('end', onend);
54 stream.on('finish', onfinish);
55 if (opts.error !== false) stream.on('error', callback);
56 stream.on('close', onclose);