nxkit
Version:
This is a collection of tools, independent of any other libraries
122 lines (121 loc) • 4.66 kB
JavaScript
;
/* ***** BEGIN LICENSE BLOCK *****
* Distributed under the BSD license:
*
* Copyright (c) 2015, xuewen.chu
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of xuewen.chu nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL xuewen.chu BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* ***** END LICENSE BLOCK ***** */
Object.defineProperty(exports, "__esModule", { value: true });
function once(fn) {
var called = false;
return function (self, ...args) {
if (!called) {
called = true;
fn.call(self, ...args);
}
};
}
var noop = function () { };
var isRequest = function (stream /* net.Socket*/) {
return stream.setHeader && typeof stream.abort === 'function';
};
var isChildProcess = function (stream /* net.Socket*/) {
return stream.stdio && Array.isArray(stream.stdio) && stream.stdio.length === 3;
};
function eos(stream, opts, callback) {
var cb = once(callback || noop);
var ws = stream._writableState;
var rs = stream._readableState;
var options = Object.assign({
readable: stream.readable,
writable: stream.writable,
}, opts);
var readable = options.readable;
var writable = options.writable;
var onlegacyfinish = function () {
if (!stream.writable)
onfinish();
};
var onfinish = function () {
writable = false;
if (!readable)
cb(stream);
};
var onend = function () {
readable = false;
if (!writable)
cb(stream);
};
var onexit = function (exitCode) {
cb(stream, exitCode ? new Error('exited with error code: ' + exitCode) : null);
};
var onerror = function (err) {
cb(stream, err);
};
var onclose = function () {
if (readable && !(rs && rs.ended))
return cb(stream, new Error('premature close'));
if (writable && !(ws && ws.ended))
return cb(stream, new Error('premature close'));
};
var onrequest = function () {
stream.req.on('finish', onfinish);
};
if (isRequest(stream)) {
stream.on('complete', onfinish);
stream.on('abort', onclose);
if (stream.req)
onrequest();
else
stream.on('request', onrequest);
}
else if (writable && !ws) { // legacy streams
stream.on('end', onlegacyfinish);
stream.on('close', onlegacyfinish);
}
if (isChildProcess(stream))
stream.on('exit', onexit);
stream.on('end', onend);
stream.on('finish', onfinish);
if (options.error !== false)
stream.on('error', onerror);
stream.on('close', onclose);
return function () {
stream.removeListener('complete', onfinish);
stream.removeListener('abort', onclose);
stream.removeListener('request', onrequest);
if (stream.req)
stream.req.removeListener('finish', onfinish);
stream.removeListener('end', onlegacyfinish);
stream.removeListener('close', onlegacyfinish);
stream.removeListener('finish', onfinish);
stream.removeListener('exit', onexit);
stream.removeListener('end', onend);
stream.removeListener('error', onerror);
stream.removeListener('close', onclose);
};
}
exports.default = eos;