tools/node-hermes/nodelib/internal/streams/utils.js (141 lines of code) (raw):
'use strict';
var _primordials = primordials,
_Symbol = _primordials.Symbol,
SymbolAsyncIterator = _primordials.SymbolAsyncIterator,
SymbolIterator = _primordials.SymbolIterator;
var kDestroyed = _Symbol('kDestroyed');
function isReadableNodeStream(obj) {
var _obj$_readableState;
return !!(obj && typeof obj.pipe === 'function' && typeof obj.on === 'function' && (!obj._writableState || ((_obj$_readableState = obj._readableState) === null || _obj$_readableState === void 0 ? void 0 : _obj$_readableState.readable) !== false) && ( // Duplex
!obj._writableState || obj._readableState) // Writable has .pipe.
);
}
function isWritableNodeStream(obj) {
var _obj$_writableState;
return !!(obj && typeof obj.write === 'function' && typeof obj.on === 'function' && (!obj._readableState || ((_obj$_writableState = obj._writableState) === null || _obj$_writableState === void 0 ? void 0 : _obj$_writableState.writable) !== false) // Duplex
);
}
function isNodeStream(obj) {
return isReadableNodeStream(obj) || isWritableNodeStream(obj);
}
function isIterable(obj, isAsync) {
if (obj == null) return false;
if (isAsync === true) return typeof obj[SymbolAsyncIterator] === 'function';
if (isAsync === false) return typeof obj[SymbolIterator] === 'function';
return typeof obj[SymbolAsyncIterator] === 'function' || typeof obj[SymbolIterator] === 'function';
}
function isDestroyed(stream) {
if (!isNodeStream(stream)) return null;
var wState = stream._writableState;
var rState = stream._readableState;
var state = wState || rState;
return !!(stream.destroyed || stream[kDestroyed] || state !== null && state !== void 0 && state.destroyed);
} // Have been end():d.
function isWritableEnded(stream) {
if (!isWritableNodeStream(stream)) return null;
if (stream.writableEnded === true) return true;
var wState = stream._writableState;
if (wState !== null && wState !== void 0 && wState.errored) return false;
if (typeof (wState === null || wState === void 0 ? void 0 : wState.ended) !== 'boolean') return null;
return wState.ended;
} // Have emitted 'finish'.
function isWritableFinished(stream, strict) {
if (!isWritableNodeStream(stream)) return null;
if (stream.writableFinished === true) return true;
var wState = stream._writableState;
if (wState !== null && wState !== void 0 && wState.errored) return false;
if (typeof (wState === null || wState === void 0 ? void 0 : wState.finished) !== 'boolean') return null;
return !!(wState.finished || strict === false && wState.ended === true && wState.length === 0);
} // Have been push(null):d.
function isReadableEnded(stream) {
if (!isReadableNodeStream(stream)) return null;
if (stream.readableEnded === true) return true;
var rState = stream._readableState;
if (!rState || rState.errored) return false;
if (typeof (rState === null || rState === void 0 ? void 0 : rState.ended) !== 'boolean') return null;
return rState.ended;
} // Have emitted 'end'.
function isReadableFinished(stream, strict) {
if (!isReadableNodeStream(stream)) return null;
var rState = stream._readableState;
if (rState !== null && rState !== void 0 && rState.errored) return false;
if (typeof (rState === null || rState === void 0 ? void 0 : rState.endEmitted) !== 'boolean') return null;
return !!(rState.endEmitted || strict === false && rState.ended === true && rState.length === 0);
}
function isReadable(stream) {
var r = isReadableNodeStream(stream);
if (r === null || typeof stream.readable !== 'boolean') return null;
if (isDestroyed(stream)) return false;
return r && stream.readable && !isReadableFinished(stream);
}
function isWritable(stream) {
var r = isWritableNodeStream(stream);
if (r === null || typeof stream.writable !== 'boolean') return null;
if (isDestroyed(stream)) return false;
return r && stream.writable && !isWritableEnded(stream);
}
function isFinished(stream, opts) {
if (!isNodeStream(stream)) {
return null;
}
if (isDestroyed(stream)) {
return true;
}
if ((opts === null || opts === void 0 ? void 0 : opts.readable) !== false && isReadable(stream)) {
return false;
}
if ((opts === null || opts === void 0 ? void 0 : opts.writable) !== false && isWritable(stream)) {
return false;
}
return true;
}
function isClosed(stream) {
if (!isNodeStream(stream)) {
return null;
}
var wState = stream._writableState;
var rState = stream._readableState;
if (typeof (wState === null || wState === void 0 ? void 0 : wState.closed) === 'boolean' || typeof (rState === null || rState === void 0 ? void 0 : rState.closed) === 'boolean') {
return (wState === null || wState === void 0 ? void 0 : wState.closed) || (rState === null || rState === void 0 ? void 0 : rState.closed);
}
if (typeof stream._closed === 'boolean' && isOutgoingMessage(stream)) {
return stream._closed;
}
return null;
}
function isOutgoingMessage(stream) {
return typeof stream._closed === 'boolean' && typeof stream._defaultKeepAlive === 'boolean' && typeof stream._removedConnection === 'boolean' && typeof stream._removedContLen === 'boolean';
}
function isServerResponse(stream) {
return typeof stream._sent100 === 'boolean' && isOutgoingMessage(stream);
}
function isServerRequest(stream) {
var _stream$req;
return typeof stream._consuming === 'boolean' && typeof stream._dumped === 'boolean' && ((_stream$req = stream.req) === null || _stream$req === void 0 ? void 0 : _stream$req.upgradeOrConnect) === undefined;
}
function willEmitClose(stream) {
if (!isNodeStream(stream)) return null;
var wState = stream._writableState;
var rState = stream._readableState;
var state = wState || rState;
return !state && isServerResponse(stream) || !!(state && state.autoDestroy && state.emitClose && state.closed === false);
}
module.exports = {
kDestroyed: kDestroyed,
isClosed: isClosed,
isDestroyed: isDestroyed,
isFinished: isFinished,
isIterable: isIterable,
isReadable: isReadable,
isReadableNodeStream: isReadableNodeStream,
isReadableEnded: isReadableEnded,
isReadableFinished: isReadableFinished,
isNodeStream: isNodeStream,
isWritable: isWritable,
isWritableNodeStream: isWritableNodeStream,
isWritableEnded: isWritableEnded,
isWritableFinished: isWritableFinished,
isServerRequest: isServerRequest,
isServerResponse: isServerResponse,
willEmitClose: willEmitClose
};