2024-08-12 12:41:32 -04:00
|
|
|
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
|
2023-02-14 11:38:45 -05:00
|
|
|
// Copyright Joyent and Node contributors. All rights reserved. MIT license.
|
|
|
|
// deno-fmt-ignore-file
|
|
|
|
// deno-lint-ignore-file
|
2023-03-08 06:44:54 -05:00
|
|
|
import { nextTick } from "ext:deno_node/_next_tick.ts";
|
|
|
|
import { AbortController } from "ext:deno_web/03_abort_signal.js";
|
|
|
|
import { Blob } from "ext:deno_web/09_file.js";
|
2023-07-02 14:19:30 -04:00
|
|
|
import { StringDecoder } from "node:string_decoder";
|
2023-05-10 06:30:02 -04:00
|
|
|
import {
|
|
|
|
createDeferredPromise,
|
|
|
|
kEmptyObject,
|
|
|
|
normalizeEncoding,
|
|
|
|
once,
|
|
|
|
promisify,
|
|
|
|
} from "ext:deno_node/internal/util.mjs";
|
|
|
|
import {
|
|
|
|
isArrayBufferView,
|
|
|
|
isAsyncFunction,
|
|
|
|
} from "ext:deno_node/internal/util/types.ts";
|
|
|
|
import { debuglog } from "ext:deno_node/internal/util/debuglog.ts";
|
|
|
|
import { inspect } from "ext:deno_node/internal/util/inspect.mjs";
|
|
|
|
|
|
|
|
import {
|
|
|
|
AbortError,
|
|
|
|
aggregateTwoErrors,
|
|
|
|
ERR_INVALID_ARG_TYPE,
|
|
|
|
ERR_INVALID_ARG_VALUE,
|
|
|
|
ERR_INVALID_RETURN_VALUE,
|
|
|
|
ERR_METHOD_NOT_IMPLEMENTED,
|
|
|
|
ERR_MISSING_ARGS,
|
|
|
|
ERR_MULTIPLE_CALLBACK,
|
|
|
|
ERR_OUT_OF_RANGE,
|
|
|
|
ERR_SOCKET_BAD_PORT,
|
|
|
|
ERR_STREAM_ALREADY_FINISHED,
|
|
|
|
ERR_STREAM_CANNOT_PIPE,
|
|
|
|
ERR_STREAM_DESTROYED,
|
|
|
|
ERR_STREAM_NULL_VALUES,
|
|
|
|
ERR_STREAM_PREMATURE_CLOSE,
|
|
|
|
ERR_STREAM_PUSH_AFTER_EOF,
|
|
|
|
ERR_STREAM_UNSHIFT_AFTER_END_EVENT,
|
|
|
|
ERR_STREAM_WRITE_AFTER_END,
|
|
|
|
ERR_UNKNOWN_ENCODING,
|
|
|
|
ERR_UNKNOWN_SIGNAL,
|
|
|
|
hideStackFrames,
|
|
|
|
} from "ext:deno_node/internal/errors.ts";
|
2023-02-14 11:38:45 -05:00
|
|
|
|
|
|
|
/* esm.sh - esbuild bundle(readable-stream@4.2.0) es2022 production */
|
2023-05-10 06:30:02 -04:00
|
|
|
// generated with
|
|
|
|
// $ esbuild --bundle --legal-comments=none --target=es2022 --tree-shaking=true --format=esm .
|
|
|
|
// ... then making sure the file uses the existing ext:deno_node stuff instead of bundling it
|
2024-01-02 13:08:05 -05:00
|
|
|
import __process$ from "node:process";
|
2023-07-02 14:19:30 -04:00
|
|
|
import __buffer$ from "node:buffer";
|
|
|
|
import __string_decoder$ from "node:string_decoder";
|
|
|
|
import __events$ from "node:events";
|
2023-05-10 06:30:02 -04:00
|
|
|
|
|
|
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
|
|
var __commonJS = (cb, mod) =>
|
|
|
|
function __require() {
|
|
|
|
return mod ||
|
|
|
|
(0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod),
|
|
|
|
mod.exports;
|
|
|
|
};
|
|
|
|
|
|
|
|
// node_modules/buffer/index.js
|
|
|
|
var require_buffer = () => {
|
|
|
|
return __buffer$;
|
|
|
|
};
|
|
|
|
|
|
|
|
// lib/ours/errors.js
|
|
|
|
var require_primordials = __commonJS({
|
|
|
|
"lib/ours/primordials.js"(exports2, module2) {
|
|
|
|
"use strict";
|
|
|
|
module2.exports = {
|
|
|
|
ArrayIsArray(self2) {
|
|
|
|
return Array.isArray(self2);
|
|
|
|
},
|
|
|
|
ArrayPrototypeIncludes(self2, el) {
|
|
|
|
return self2.includes(el);
|
|
|
|
},
|
|
|
|
ArrayPrototypeIndexOf(self2, el) {
|
|
|
|
return self2.indexOf(el);
|
|
|
|
},
|
|
|
|
ArrayPrototypeJoin(self2, sep) {
|
|
|
|
return self2.join(sep);
|
|
|
|
},
|
|
|
|
ArrayPrototypeMap(self2, fn) {
|
|
|
|
return self2.map(fn);
|
|
|
|
},
|
|
|
|
ArrayPrototypePop(self2, el) {
|
|
|
|
return self2.pop(el);
|
|
|
|
},
|
|
|
|
ArrayPrototypePush(self2, el) {
|
|
|
|
return self2.push(el);
|
|
|
|
},
|
|
|
|
ArrayPrototypeSlice(self2, start, end) {
|
|
|
|
return self2.slice(start, end);
|
|
|
|
},
|
|
|
|
Error,
|
|
|
|
FunctionPrototypeCall(fn, thisArgs, ...args) {
|
|
|
|
return fn.call(thisArgs, ...args);
|
|
|
|
},
|
|
|
|
FunctionPrototypeSymbolHasInstance(self2, instance) {
|
|
|
|
return Function.prototype[Symbol.hasInstance].call(self2, instance);
|
|
|
|
},
|
|
|
|
MathFloor: Math.floor,
|
|
|
|
Number,
|
|
|
|
NumberIsInteger: Number.isInteger,
|
|
|
|
NumberIsNaN: Number.isNaN,
|
|
|
|
NumberMAX_SAFE_INTEGER: Number.MAX_SAFE_INTEGER,
|
|
|
|
NumberMIN_SAFE_INTEGER: Number.MIN_SAFE_INTEGER,
|
|
|
|
NumberParseInt: Number.parseInt,
|
|
|
|
ObjectDefineProperties(self2, props) {
|
|
|
|
return Object.defineProperties(self2, props);
|
|
|
|
},
|
|
|
|
ObjectDefineProperty(self2, name, prop) {
|
|
|
|
return Object.defineProperty(self2, name, prop);
|
|
|
|
},
|
|
|
|
ObjectGetOwnPropertyDescriptor(self2, name) {
|
|
|
|
return Object.getOwnPropertyDescriptor(self2, name);
|
|
|
|
},
|
|
|
|
ObjectKeys(obj) {
|
|
|
|
return Object.keys(obj);
|
|
|
|
},
|
|
|
|
ObjectSetPrototypeOf(target, proto) {
|
|
|
|
return Object.setPrototypeOf(target, proto);
|
|
|
|
},
|
|
|
|
Promise,
|
|
|
|
PromisePrototypeCatch(self2, fn) {
|
|
|
|
return self2.catch(fn);
|
|
|
|
},
|
|
|
|
PromisePrototypeThen(self2, thenFn, catchFn) {
|
|
|
|
return self2.then(thenFn, catchFn);
|
|
|
|
},
|
|
|
|
PromiseReject(err) {
|
|
|
|
return Promise.reject(err);
|
|
|
|
},
|
|
|
|
ReflectApply: Reflect.apply,
|
|
|
|
RegExpPrototypeTest(self2, value) {
|
|
|
|
return self2.test(value);
|
|
|
|
},
|
|
|
|
SafeSet: Set,
|
|
|
|
String,
|
|
|
|
StringPrototypeSlice(self2, start, end) {
|
|
|
|
return self2.slice(start, end);
|
|
|
|
},
|
|
|
|
StringPrototypeToLowerCase(self2) {
|
|
|
|
return self2.toLowerCase();
|
|
|
|
},
|
|
|
|
StringPrototypeToUpperCase(self2) {
|
|
|
|
return self2.toUpperCase();
|
|
|
|
},
|
|
|
|
StringPrototypeTrim(self2) {
|
|
|
|
return self2.trim();
|
|
|
|
},
|
|
|
|
Symbol,
|
|
|
|
SymbolAsyncIterator: Symbol.asyncIterator,
|
|
|
|
SymbolHasInstance: Symbol.hasInstance,
|
|
|
|
SymbolIterator: Symbol.iterator,
|
|
|
|
TypedArrayPrototypeSet(self2, buf, len) {
|
|
|
|
return self2.set(buf, len);
|
|
|
|
},
|
|
|
|
Uint8Array,
|
|
|
|
};
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
// lib/internal/validators.js
|
|
|
|
var require_validators = __commonJS({
|
|
|
|
"lib/internal/validators.js"(exports, module) {
|
|
|
|
"use strict";
|
|
|
|
var {
|
|
|
|
ArrayIsArray,
|
|
|
|
ArrayPrototypeIncludes,
|
|
|
|
ArrayPrototypeJoin,
|
|
|
|
ArrayPrototypeMap,
|
|
|
|
NumberIsInteger,
|
|
|
|
NumberIsNaN,
|
|
|
|
NumberMAX_SAFE_INTEGER,
|
|
|
|
NumberMIN_SAFE_INTEGER,
|
|
|
|
NumberParseInt,
|
|
|
|
ObjectPrototypeHasOwnProperty,
|
|
|
|
RegExpPrototypeExec,
|
|
|
|
String: String2,
|
|
|
|
StringPrototypeToUpperCase,
|
|
|
|
StringPrototypeTrim,
|
|
|
|
} = require_primordials();
|
|
|
|
var signals = {};
|
|
|
|
function isInt32(value) {
|
|
|
|
return value === (value | 0);
|
|
|
|
}
|
|
|
|
function isUint32(value) {
|
|
|
|
return value === value >>> 0;
|
|
|
|
}
|
|
|
|
var octalReg = /^[0-7]+$/;
|
|
|
|
var modeDesc = "must be a 32-bit unsigned integer or an octal string";
|
|
|
|
function parseFileMode(value, name, def) {
|
|
|
|
if (typeof value === "undefined") {
|
|
|
|
value = def;
|
|
|
|
}
|
|
|
|
if (typeof value === "string") {
|
|
|
|
if (RegExpPrototypeExec(octalReg, value) === null) {
|
|
|
|
throw new ERR_INVALID_ARG_VALUE(name, value, modeDesc);
|
|
|
|
}
|
|
|
|
value = NumberParseInt(value, 8);
|
|
|
|
}
|
|
|
|
validateUint32(value, name);
|
|
|
|
return value;
|
|
|
|
}
|
|
|
|
var validateInteger = hideStackFrames(
|
|
|
|
(
|
|
|
|
value,
|
|
|
|
name,
|
|
|
|
min = NumberMIN_SAFE_INTEGER,
|
|
|
|
max = NumberMAX_SAFE_INTEGER,
|
|
|
|
) => {
|
|
|
|
if (typeof value !== "number") {
|
|
|
|
throw new ERR_INVALID_ARG_TYPE(name, "number", value);
|
|
|
|
}
|
|
|
|
if (!NumberIsInteger(value)) {
|
|
|
|
throw new ERR_OUT_OF_RANGE(name, "an integer", value);
|
|
|
|
}
|
|
|
|
if (value < min || value > max) {
|
|
|
|
throw new ERR_OUT_OF_RANGE(name, `>= ${min} && <= ${max}`, value);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
);
|
|
|
|
var validateInt32 = hideStackFrames(
|
|
|
|
(value, name, min = -2147483648, max = 2147483647) => {
|
|
|
|
if (typeof value !== "number") {
|
|
|
|
throw new ERR_INVALID_ARG_TYPE(name, "number", value);
|
|
|
|
}
|
|
|
|
if (!NumberIsInteger(value)) {
|
|
|
|
throw new ERR_OUT_OF_RANGE(name, "an integer", value);
|
|
|
|
}
|
|
|
|
if (value < min || value > max) {
|
|
|
|
throw new ERR_OUT_OF_RANGE(name, `>= ${min} && <= ${max}`, value);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
);
|
|
|
|
var validateUint32 = hideStackFrames((value, name, positive = false) => {
|
|
|
|
if (typeof value !== "number") {
|
|
|
|
throw new ERR_INVALID_ARG_TYPE(name, "number", value);
|
|
|
|
}
|
|
|
|
if (!NumberIsInteger(value)) {
|
|
|
|
throw new ERR_OUT_OF_RANGE(name, "an integer", value);
|
|
|
|
}
|
|
|
|
const min = positive ? 1 : 0;
|
|
|
|
const max = 4294967295;
|
|
|
|
if (value < min || value > max) {
|
|
|
|
throw new ERR_OUT_OF_RANGE(name, `>= ${min} && <= ${max}`, value);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
function validateString(value, name) {
|
|
|
|
if (typeof value !== "string") {
|
|
|
|
throw new ERR_INVALID_ARG_TYPE(name, "string", value);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function validateNumber(value, name, min = void 0, max) {
|
|
|
|
if (typeof value !== "number") {
|
|
|
|
throw new ERR_INVALID_ARG_TYPE(name, "number", value);
|
|
|
|
}
|
|
|
|
if (
|
|
|
|
min != null && value < min || max != null && value > max ||
|
|
|
|
(min != null || max != null) && NumberIsNaN(value)
|
|
|
|
) {
|
|
|
|
throw new ERR_OUT_OF_RANGE(
|
|
|
|
name,
|
|
|
|
`${min != null ? `>= ${min}` : ""}${
|
|
|
|
min != null && max != null ? " && " : ""
|
|
|
|
}${max != null ? `<= ${max}` : ""}`,
|
|
|
|
value,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
var validateOneOf = hideStackFrames((value, name, oneOf) => {
|
|
|
|
if (!ArrayPrototypeIncludes(oneOf, value)) {
|
|
|
|
const allowed = ArrayPrototypeJoin(
|
|
|
|
ArrayPrototypeMap(
|
|
|
|
oneOf,
|
|
|
|
(v) => typeof v === "string" ? `'${v}'` : String2(v),
|
|
|
|
),
|
|
|
|
", ",
|
|
|
|
);
|
|
|
|
const reason = "must be one of: " + allowed;
|
|
|
|
throw new ERR_INVALID_ARG_VALUE(name, value, reason);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
function validateBoolean(value, name) {
|
|
|
|
if (typeof value !== "boolean") {
|
|
|
|
throw new ERR_INVALID_ARG_TYPE(name, "boolean", value);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function getOwnPropertyValueOrDefault(options, key, defaultValue) {
|
|
|
|
return options == null || !ObjectPrototypeHasOwnProperty(options, key)
|
|
|
|
? defaultValue
|
|
|
|
: options[key];
|
|
|
|
}
|
|
|
|
var validateObject = hideStackFrames((value, name, options = null) => {
|
|
|
|
const allowArray = getOwnPropertyValueOrDefault(
|
|
|
|
options,
|
|
|
|
"allowArray",
|
|
|
|
false,
|
|
|
|
);
|
|
|
|
const allowFunction = getOwnPropertyValueOrDefault(
|
|
|
|
options,
|
|
|
|
"allowFunction",
|
|
|
|
false,
|
|
|
|
);
|
|
|
|
const nullable = getOwnPropertyValueOrDefault(options, "nullable", false);
|
|
|
|
if (
|
|
|
|
!nullable && value === null || !allowArray && ArrayIsArray(value) ||
|
|
|
|
typeof value !== "object" &&
|
|
|
|
(!allowFunction || typeof value !== "function")
|
|
|
|
) {
|
|
|
|
throw new ERR_INVALID_ARG_TYPE(name, "Object", value);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
var validateArray = hideStackFrames((value, name, minLength = 0) => {
|
|
|
|
if (!ArrayIsArray(value)) {
|
|
|
|
throw new ERR_INVALID_ARG_TYPE(name, "Array", value);
|
|
|
|
}
|
|
|
|
if (value.length < minLength) {
|
|
|
|
const reason = `must be longer than ${minLength}`;
|
|
|
|
throw new ERR_INVALID_ARG_VALUE(name, value, reason);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
function validateSignalName(signal, name = "signal") {
|
|
|
|
validateString(signal, name);
|
|
|
|
if (signals[signal] === void 0) {
|
|
|
|
if (signals[StringPrototypeToUpperCase(signal)] !== void 0) {
|
|
|
|
throw new ERR_UNKNOWN_SIGNAL(
|
|
|
|
signal + " (signals must use all capital letters)",
|
|
|
|
);
|
|
|
|
}
|
|
|
|
throw new ERR_UNKNOWN_SIGNAL(signal);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
var validateBuffer = hideStackFrames((buffer, name = "buffer") => {
|
|
|
|
if (!isArrayBufferView(buffer)) {
|
|
|
|
throw new ERR_INVALID_ARG_TYPE(name, [
|
|
|
|
"Buffer",
|
|
|
|
"TypedArray",
|
|
|
|
"DataView",
|
|
|
|
], buffer);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
function validateEncoding(data, encoding) {
|
|
|
|
const normalizedEncoding = normalizeEncoding(encoding);
|
|
|
|
const length = data.length;
|
|
|
|
if (normalizedEncoding === "hex" && length % 2 !== 0) {
|
|
|
|
throw new ERR_INVALID_ARG_VALUE(
|
|
|
|
"encoding",
|
|
|
|
encoding,
|
|
|
|
`is invalid for data of length ${length}`,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function validatePort(port, name = "Port", allowZero = true) {
|
|
|
|
if (
|
|
|
|
typeof port !== "number" && typeof port !== "string" ||
|
|
|
|
typeof port === "string" && StringPrototypeTrim(port).length === 0 ||
|
|
|
|
+port !== +port >>> 0 || port > 65535 || port === 0 && !allowZero
|
|
|
|
) {
|
|
|
|
throw new ERR_SOCKET_BAD_PORT(name, port, allowZero);
|
|
|
|
}
|
|
|
|
return port | 0;
|
|
|
|
}
|
|
|
|
var validateAbortSignal = hideStackFrames((signal, name) => {
|
|
|
|
if (
|
|
|
|
signal !== void 0 &&
|
|
|
|
(signal === null || typeof signal !== "object" ||
|
|
|
|
!("aborted" in signal))
|
|
|
|
) {
|
|
|
|
throw new ERR_INVALID_ARG_TYPE(name, "AbortSignal", signal);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
var validateFunction = hideStackFrames((value, name) => {
|
|
|
|
if (typeof value !== "function") {
|
|
|
|
throw new ERR_INVALID_ARG_TYPE(name, "Function", value);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
var validatePlainFunction = hideStackFrames((value, name) => {
|
|
|
|
if (typeof value !== "function" || isAsyncFunction(value)) {
|
|
|
|
throw new ERR_INVALID_ARG_TYPE(name, "Function", value);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
var validateUndefined = hideStackFrames((value, name) => {
|
|
|
|
if (value !== void 0) {
|
|
|
|
throw new ERR_INVALID_ARG_TYPE(name, "undefined", value);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
function validateUnion(value, name, union) {
|
|
|
|
if (!ArrayPrototypeIncludes(union, value)) {
|
|
|
|
throw new ERR_INVALID_ARG_TYPE(
|
|
|
|
name,
|
|
|
|
`('${ArrayPrototypeJoin(union, "|")}')`,
|
|
|
|
value,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
module.exports = {
|
|
|
|
isInt32,
|
|
|
|
isUint32,
|
|
|
|
parseFileMode,
|
|
|
|
validateArray,
|
|
|
|
validateBoolean,
|
|
|
|
validateBuffer,
|
|
|
|
validateEncoding,
|
|
|
|
validateFunction,
|
|
|
|
validateInt32,
|
|
|
|
validateInteger,
|
|
|
|
validateNumber,
|
|
|
|
validateObject,
|
|
|
|
validateOneOf,
|
|
|
|
validatePlainFunction,
|
|
|
|
validatePort,
|
|
|
|
validateSignalName,
|
|
|
|
validateString,
|
|
|
|
validateUint32,
|
|
|
|
validateUndefined,
|
|
|
|
validateUnion,
|
|
|
|
validateAbortSignal,
|
|
|
|
};
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
// node_modules/process/browser.js
|
|
|
|
var require_browser2 = () => {
|
|
|
|
return __process$;
|
|
|
|
};
|
|
|
|
|
|
|
|
// lib/internal/streams/utils.js
|
|
|
|
var require_utils = __commonJS({
|
|
|
|
"lib/internal/streams/utils.js"(exports, module) {
|
|
|
|
"use strict";
|
|
|
|
var { Symbol: Symbol2, SymbolAsyncIterator, SymbolIterator } =
|
|
|
|
require_primordials();
|
|
|
|
var kDestroyed = Symbol2("kDestroyed");
|
|
|
|
var kIsErrored = Symbol2("kIsErrored");
|
|
|
|
var kIsReadable = Symbol2("kIsReadable");
|
|
|
|
var kIsDisturbed = Symbol2("kIsDisturbed");
|
|
|
|
function isReadableNodeStream(obj, strict = false) {
|
|
|
|
var _obj$_readableState;
|
|
|
|
return !!(obj && typeof obj.pipe === "function" &&
|
|
|
|
typeof obj.on === "function" &&
|
|
|
|
(!strict ||
|
|
|
|
typeof obj.pause === "function" &&
|
|
|
|
typeof obj.resume === "function") &&
|
|
|
|
(!obj._writableState ||
|
|
|
|
((_obj$_readableState = obj._readableState) === null ||
|
|
|
|
_obj$_readableState === void 0
|
|
|
|
? void 0
|
|
|
|
: _obj$_readableState.readable) !== false) && // Duplex
|
|
|
|
(!obj._writableState || obj._readableState));
|
|
|
|
}
|
|
|
|
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));
|
|
|
|
}
|
|
|
|
function isDuplexNodeStream(obj) {
|
|
|
|
return !!(obj && typeof obj.pipe === "function" && obj._readableState &&
|
|
|
|
typeof obj.on === "function" && typeof obj.write === "function");
|
|
|
|
}
|
|
|
|
function isNodeStream(obj) {
|
|
|
|
return obj &&
|
|
|
|
(obj._readableState || obj._writableState ||
|
|
|
|
typeof obj.write === "function" && typeof obj.on === "function" ||
|
|
|
|
typeof obj.pipe === "function" && typeof obj.on === "function");
|
|
|
|
}
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
const wState = stream._writableState;
|
|
|
|
const rState = stream._readableState;
|
|
|
|
const state = wState || rState;
|
|
|
|
return !!(stream.destroyed || stream[kDestroyed] ||
|
|
|
|
state !== null && state !== void 0 && state.destroyed);
|
|
|
|
}
|
|
|
|
function isWritableEnded(stream) {
|
|
|
|
if (!isWritableNodeStream(stream)) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
if (stream.writableEnded === true) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
const 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;
|
|
|
|
}
|
|
|
|
function isWritableFinished(stream, strict) {
|
|
|
|
if (!isWritableNodeStream(stream)) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
if (stream.writableFinished === true) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
const 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);
|
|
|
|
}
|
|
|
|
function isReadableEnded(stream) {
|
|
|
|
if (!isReadableNodeStream(stream)) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
if (stream.readableEnded === true) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
const 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;
|
|
|
|
}
|
|
|
|
function isReadableFinished(stream, strict) {
|
|
|
|
if (!isReadableNodeStream(stream)) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
const 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) {
|
|
|
|
if (stream && stream[kIsReadable] != null) {
|
|
|
|
return stream[kIsReadable];
|
|
|
|
}
|
|
|
|
if (
|
|
|
|
typeof (stream === null || stream === void 0
|
|
|
|
? void 0
|
|
|
|
: stream.readable) !== "boolean"
|
|
|
|
) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
if (isDestroyed(stream)) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return isReadableNodeStream(stream) && stream.readable &&
|
|
|
|
!isReadableFinished(stream);
|
|
|
|
}
|
|
|
|
function isWritable(stream) {
|
|
|
|
if (
|
|
|
|
typeof (stream === null || stream === void 0
|
|
|
|
? void 0
|
|
|
|
: stream.writable) !== "boolean"
|
|
|
|
) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
if (isDestroyed(stream)) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return isWritableNodeStream(stream) && 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 isWritableErrored(stream) {
|
|
|
|
var _stream$_writableStat, _stream$_writableStat2;
|
|
|
|
if (!isNodeStream(stream)) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
if (stream.writableErrored) {
|
|
|
|
return stream.writableErrored;
|
|
|
|
}
|
|
|
|
return (_stream$_writableStat =
|
|
|
|
(_stream$_writableStat2 = stream._writableState) === null ||
|
|
|
|
_stream$_writableStat2 === void 0
|
|
|
|
? void 0
|
|
|
|
: _stream$_writableStat2.errored) !== null &&
|
|
|
|
_stream$_writableStat !== void 0
|
|
|
|
? _stream$_writableStat
|
|
|
|
: null;
|
|
|
|
}
|
|
|
|
function isReadableErrored(stream) {
|
|
|
|
var _stream$_readableStat, _stream$_readableStat2;
|
|
|
|
if (!isNodeStream(stream)) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
if (stream.readableErrored) {
|
|
|
|
return stream.readableErrored;
|
|
|
|
}
|
|
|
|
return (_stream$_readableStat =
|
|
|
|
(_stream$_readableStat2 = stream._readableState) === null ||
|
|
|
|
_stream$_readableStat2 === void 0
|
|
|
|
? void 0
|
|
|
|
: _stream$_readableStat2.errored) !== null &&
|
|
|
|
_stream$_readableStat !== void 0
|
|
|
|
? _stream$_readableStat
|
|
|
|
: null;
|
|
|
|
}
|
|
|
|
function isClosed(stream) {
|
|
|
|
if (!isNodeStream(stream)) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
if (typeof stream.closed === "boolean") {
|
|
|
|
return stream.closed;
|
|
|
|
}
|
|
|
|
const wState = stream._writableState;
|
|
|
|
const 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) === void 0;
|
|
|
|
}
|
|
|
|
function willEmitClose(stream) {
|
|
|
|
if (!isNodeStream(stream)) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
const wState = stream._writableState;
|
|
|
|
const rState = stream._readableState;
|
|
|
|
const state = wState || rState;
|
|
|
|
return !state && isServerResponse(stream) ||
|
|
|
|
!!(state && state.autoDestroy && state.emitClose &&
|
|
|
|
state.closed === false);
|
|
|
|
}
|
|
|
|
function isDisturbed(stream) {
|
|
|
|
var _stream$kIsDisturbed;
|
|
|
|
return !!(stream &&
|
|
|
|
((_stream$kIsDisturbed = stream[kIsDisturbed]) !== null &&
|
|
|
|
_stream$kIsDisturbed !== void 0
|
|
|
|
? _stream$kIsDisturbed
|
|
|
|
: stream.readableDidRead || stream.readableAborted));
|
|
|
|
}
|
|
|
|
function isErrored(stream) {
|
|
|
|
var _ref,
|
|
|
|
_ref2,
|
|
|
|
_ref3,
|
|
|
|
_ref4,
|
|
|
|
_ref5,
|
|
|
|
_stream$kIsErrored,
|
|
|
|
_stream$_readableStat3,
|
|
|
|
_stream$_writableStat3,
|
|
|
|
_stream$_readableStat4,
|
|
|
|
_stream$_writableStat4;
|
|
|
|
return !!(stream &&
|
|
|
|
((_ref =
|
|
|
|
(_ref2 =
|
|
|
|
(_ref3 =
|
|
|
|
(_ref4 =
|
|
|
|
(_ref5 =
|
|
|
|
(_stream$kIsErrored =
|
|
|
|
stream[kIsErrored]) !== null &&
|
|
|
|
_stream$kIsErrored !== void 0
|
|
|
|
? _stream$kIsErrored
|
|
|
|
: stream.readableErrored) !== null &&
|
|
|
|
_ref5 !== void 0
|
|
|
|
? _ref5
|
|
|
|
: stream.writableErrored) !== null &&
|
|
|
|
_ref4 !== void 0
|
|
|
|
? _ref4
|
|
|
|
: (_stream$_readableStat3 =
|
|
|
|
stream._readableState) === null ||
|
|
|
|
_stream$_readableStat3 === void 0
|
|
|
|
? void 0
|
|
|
|
: _stream$_readableStat3.errorEmitted) !== null &&
|
|
|
|
_ref3 !== void 0
|
|
|
|
? _ref3
|
|
|
|
: (_stream$_writableStat3 = stream._writableState) ===
|
|
|
|
null || _stream$_writableStat3 === void 0
|
|
|
|
? void 0
|
|
|
|
: _stream$_writableStat3.errorEmitted) !== null &&
|
|
|
|
_ref2 !== void 0
|
|
|
|
? _ref2
|
|
|
|
: (_stream$_readableStat4 = stream._readableState) === null ||
|
|
|
|
_stream$_readableStat4 === void 0
|
|
|
|
? void 0
|
|
|
|
: _stream$_readableStat4.errored) !== null && _ref !== void 0
|
|
|
|
? _ref
|
|
|
|
: (_stream$_writableStat4 = stream._writableState) === null ||
|
|
|
|
_stream$_writableStat4 === void 0
|
|
|
|
? void 0
|
|
|
|
: _stream$_writableStat4.errored));
|
|
|
|
}
|
|
|
|
module.exports = {
|
|
|
|
kDestroyed,
|
|
|
|
isDisturbed,
|
|
|
|
kIsDisturbed,
|
|
|
|
isErrored,
|
|
|
|
kIsErrored,
|
|
|
|
isReadable,
|
|
|
|
kIsReadable,
|
|
|
|
isClosed,
|
|
|
|
isDestroyed,
|
|
|
|
isDuplexNodeStream,
|
|
|
|
isFinished,
|
|
|
|
isIterable,
|
|
|
|
isReadableNodeStream,
|
|
|
|
isReadableEnded,
|
|
|
|
isReadableFinished,
|
|
|
|
isReadableErrored,
|
|
|
|
isNodeStream,
|
|
|
|
isWritable,
|
|
|
|
isWritableNodeStream,
|
|
|
|
isWritableEnded,
|
|
|
|
isWritableFinished,
|
|
|
|
isWritableErrored,
|
|
|
|
isServerRequest,
|
|
|
|
isServerResponse,
|
|
|
|
willEmitClose,
|
|
|
|
};
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
// lib/internal/streams/end-of-stream.js
|
|
|
|
var require_end_of_stream = __commonJS({
|
|
|
|
"lib/internal/streams/end-of-stream.js"(exports, module) {
|
|
|
|
var process = require_browser2();
|
|
|
|
var { validateAbortSignal, validateFunction, validateObject } =
|
|
|
|
require_validators();
|
|
|
|
var { Promise: Promise2 } = require_primordials();
|
|
|
|
var {
|
|
|
|
isClosed,
|
|
|
|
isReadable,
|
|
|
|
isReadableNodeStream,
|
|
|
|
isReadableFinished,
|
|
|
|
isReadableErrored,
|
|
|
|
isWritable,
|
|
|
|
isWritableNodeStream,
|
|
|
|
isWritableFinished,
|
|
|
|
isWritableErrored,
|
|
|
|
isNodeStream,
|
|
|
|
willEmitClose: _willEmitClose,
|
|
|
|
} = require_utils();
|
|
|
|
function isRequest(stream) {
|
|
|
|
return stream.setHeader && typeof stream.abort === "function";
|
|
|
|
}
|
|
|
|
var nop = () => {
|
|
|
|
};
|
|
|
|
function eos(stream, options, callback) {
|
|
|
|
var _options$readable, _options$writable;
|
|
|
|
if (arguments.length === 2) {
|
|
|
|
callback = options;
|
|
|
|
options = kEmptyObject;
|
|
|
|
} else if (options == null) {
|
|
|
|
options = kEmptyObject;
|
|
|
|
} else {
|
|
|
|
validateObject(options, "options");
|
|
|
|
}
|
|
|
|
validateFunction(callback, "callback");
|
|
|
|
validateAbortSignal(options.signal, "options.signal");
|
|
|
|
callback = once(callback);
|
|
|
|
const readable = (_options$readable = options.readable) !== null &&
|
|
|
|
_options$readable !== void 0
|
|
|
|
? _options$readable
|
|
|
|
: isReadableNodeStream(stream);
|
|
|
|
const writable = (_options$writable = options.writable) !== null &&
|
|
|
|
_options$writable !== void 0
|
|
|
|
? _options$writable
|
|
|
|
: isWritableNodeStream(stream);
|
|
|
|
if (!isNodeStream(stream)) {
|
|
|
|
throw new ERR_INVALID_ARG_TYPE("stream", "Stream", stream);
|
|
|
|
}
|
|
|
|
const wState = stream._writableState;
|
|
|
|
const rState = stream._readableState;
|
|
|
|
const onlegacyfinish = () => {
|
|
|
|
if (!stream.writable) {
|
|
|
|
onfinish();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
let willEmitClose = _willEmitClose(stream) &&
|
|
|
|
isReadableNodeStream(stream) === readable &&
|
|
|
|
isWritableNodeStream(stream) === writable;
|
|
|
|
let writableFinished = isWritableFinished(stream, false);
|
|
|
|
const onfinish = () => {
|
|
|
|
writableFinished = true;
|
|
|
|
if (stream.destroyed) {
|
|
|
|
willEmitClose = false;
|
|
|
|
}
|
|
|
|
if (willEmitClose && (!stream.readable || readable)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (!readable || readableFinished) {
|
|
|
|
callback.call(stream);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
let readableFinished = isReadableFinished(stream, false);
|
|
|
|
const onend = () => {
|
|
|
|
readableFinished = true;
|
|
|
|
if (stream.destroyed) {
|
|
|
|
willEmitClose = false;
|
|
|
|
}
|
|
|
|
if (willEmitClose && (!stream.writable || writable)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (!writable || writableFinished) {
|
|
|
|
callback.call(stream);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
const onerror = (err) => {
|
|
|
|
callback.call(stream, err);
|
|
|
|
};
|
|
|
|
let closed = isClosed(stream);
|
|
|
|
const onclose = () => {
|
|
|
|
closed = true;
|
|
|
|
const errored = isWritableErrored(stream) || isReadableErrored(stream);
|
|
|
|
if (errored && typeof errored !== "boolean") {
|
|
|
|
return callback.call(stream, errored);
|
|
|
|
}
|
|
|
|
if (
|
|
|
|
readable && !readableFinished && isReadableNodeStream(stream, true)
|
|
|
|
) {
|
|
|
|
if (!isReadableFinished(stream, false)) {
|
|
|
|
return callback.call(stream, new ERR_STREAM_PREMATURE_CLOSE());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (writable && !writableFinished) {
|
|
|
|
if (!isWritableFinished(stream, false)) {
|
|
|
|
return callback.call(stream, new ERR_STREAM_PREMATURE_CLOSE());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
callback.call(stream);
|
|
|
|
};
|
|
|
|
const onrequest = () => {
|
|
|
|
stream.req.on("finish", onfinish);
|
|
|
|
};
|
|
|
|
if (isRequest(stream)) {
|
|
|
|
stream.on("complete", onfinish);
|
|
|
|
if (!willEmitClose) {
|
|
|
|
stream.on("abort", onclose);
|
|
|
|
}
|
|
|
|
if (stream.req) {
|
|
|
|
onrequest();
|
|
|
|
} else {
|
|
|
|
stream.on("request", onrequest);
|
|
|
|
}
|
|
|
|
} else if (writable && !wState) {
|
|
|
|
stream.on("end", onlegacyfinish);
|
|
|
|
stream.on("close", onlegacyfinish);
|
|
|
|
}
|
|
|
|
if (!willEmitClose && typeof stream.aborted === "boolean") {
|
|
|
|
stream.on("aborted", onclose);
|
|
|
|
}
|
|
|
|
stream.on("end", onend);
|
|
|
|
stream.on("finish", onfinish);
|
|
|
|
if (options.error !== false) {
|
|
|
|
stream.on("error", onerror);
|
|
|
|
}
|
|
|
|
stream.on("close", onclose);
|
|
|
|
if (closed) {
|
|
|
|
process.nextTick(onclose);
|
|
|
|
} else if (
|
|
|
|
wState !== null && wState !== void 0 && wState.errorEmitted ||
|
|
|
|
rState !== null && rState !== void 0 && rState.errorEmitted
|
|
|
|
) {
|
|
|
|
if (!willEmitClose) {
|
|
|
|
process.nextTick(onclose);
|
|
|
|
}
|
|
|
|
} else if (
|
|
|
|
!readable && (!willEmitClose || isReadable(stream)) &&
|
|
|
|
(writableFinished || isWritable(stream) === false)
|
|
|
|
) {
|
|
|
|
process.nextTick(onclose);
|
|
|
|
} else if (
|
|
|
|
!writable && (!willEmitClose || isWritable(stream)) &&
|
|
|
|
(readableFinished || isReadable(stream) === false)
|
|
|
|
) {
|
|
|
|
process.nextTick(onclose);
|
|
|
|
} else if (rState && stream.req && stream.aborted) {
|
|
|
|
process.nextTick(onclose);
|
|
|
|
}
|
|
|
|
const cleanup = () => {
|
|
|
|
callback = nop;
|
|
|
|
stream.removeListener("aborted", onclose);
|
|
|
|
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("end", onend);
|
|
|
|
stream.removeListener("error", onerror);
|
|
|
|
stream.removeListener("close", onclose);
|
|
|
|
};
|
|
|
|
if (options.signal && !closed) {
|
|
|
|
const abort = () => {
|
|
|
|
const endCallback = callback;
|
|
|
|
cleanup();
|
|
|
|
endCallback.call(
|
|
|
|
stream,
|
|
|
|
new AbortError(void 0, {
|
|
|
|
cause: options.signal.reason,
|
|
|
|
}),
|
|
|
|
);
|
|
|
|
};
|
|
|
|
if (options.signal.aborted) {
|
|
|
|
process.nextTick(abort);
|
|
|
|
} else {
|
|
|
|
const originalCallback = callback;
|
|
|
|
callback = once((...args) => {
|
|
|
|
options.signal.removeEventListener("abort", abort);
|
|
|
|
originalCallback.apply(stream, args);
|
|
|
|
});
|
|
|
|
options.signal.addEventListener("abort", abort);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return cleanup;
|
|
|
|
}
|
|
|
|
function finished(stream, opts) {
|
|
|
|
return new Promise2((resolve, reject) => {
|
|
|
|
eos(stream, opts, (err) => {
|
|
|
|
if (err) {
|
|
|
|
reject(err);
|
|
|
|
} else {
|
|
|
|
resolve();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
module.exports = eos;
|
|
|
|
module.exports.finished = finished;
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
// lib/internal/streams/operators.js
|
|
|
|
var require_operators = __commonJS({
|
|
|
|
"lib/internal/streams/operators.js"(exports, module) {
|
|
|
|
"use strict";
|
|
|
|
var { validateAbortSignal, validateInteger, validateObject } =
|
|
|
|
require_validators();
|
|
|
|
var kWeakHandler = require_primordials().Symbol("kWeak");
|
|
|
|
var { finished } = require_end_of_stream();
|
|
|
|
var {
|
|
|
|
ArrayPrototypePush,
|
|
|
|
MathFloor,
|
|
|
|
Number: Number2,
|
|
|
|
NumberIsNaN,
|
|
|
|
Promise: Promise2,
|
|
|
|
PromiseReject,
|
|
|
|
PromisePrototypeThen,
|
|
|
|
Symbol: Symbol2,
|
|
|
|
} = require_primordials();
|
|
|
|
var kEmpty = Symbol2("kEmpty");
|
|
|
|
var kEof = Symbol2("kEof");
|
|
|
|
function map(fn, options) {
|
|
|
|
if (typeof fn !== "function") {
|
|
|
|
throw new ERR_INVALID_ARG_TYPE("fn", ["Function", "AsyncFunction"], fn);
|
|
|
|
}
|
|
|
|
if (options != null) {
|
|
|
|
validateObject(options, "options");
|
|
|
|
}
|
|
|
|
if (
|
|
|
|
(options === null || options === void 0 ? void 0 : options.signal) !=
|
|
|
|
null
|
|
|
|
) {
|
|
|
|
validateAbortSignal(options.signal, "options.signal");
|
|
|
|
}
|
|
|
|
let concurrency = 1;
|
|
|
|
if (
|
|
|
|
(options === null || options === void 0
|
|
|
|
? void 0
|
|
|
|
: options.concurrency) != null
|
|
|
|
) {
|
|
|
|
concurrency = MathFloor(options.concurrency);
|
|
|
|
}
|
|
|
|
validateInteger(concurrency, "concurrency", 1);
|
|
|
|
return async function* map2() {
|
|
|
|
var _options$signal, _options$signal2;
|
|
|
|
const ac = new AbortController();
|
|
|
|
const stream = this;
|
|
|
|
const queue = [];
|
|
|
|
const signal = ac.signal;
|
|
|
|
const signalOpt = {
|
|
|
|
signal,
|
|
|
|
};
|
|
|
|
const abort = () => ac.abort();
|
|
|
|
if (
|
|
|
|
options !== null && options !== void 0 &&
|
|
|
|
(_options$signal = options.signal) !== null &&
|
|
|
|
_options$signal !== void 0 && _options$signal.aborted
|
|
|
|
) {
|
|
|
|
abort();
|
|
|
|
}
|
|
|
|
options === null || options === void 0
|
|
|
|
? void 0
|
|
|
|
: (_options$signal2 = options.signal) === null ||
|
|
|
|
_options$signal2 === void 0
|
|
|
|
? void 0
|
|
|
|
: _options$signal2.addEventListener("abort", abort);
|
|
|
|
let next;
|
|
|
|
let resume;
|
|
|
|
let done = false;
|
|
|
|
function onDone() {
|
|
|
|
done = true;
|
|
|
|
}
|
|
|
|
async function pump() {
|
|
|
|
try {
|
|
|
|
for await (let val of stream) {
|
|
|
|
var _val;
|
|
|
|
if (done) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (signal.aborted) {
|
|
|
|
throw new AbortError();
|
|
|
|
}
|
|
|
|
try {
|
|
|
|
val = fn(val, signalOpt);
|
|
|
|
} catch (err) {
|
|
|
|
val = PromiseReject(err);
|
|
|
|
}
|
|
|
|
if (val === kEmpty) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
if (
|
|
|
|
typeof ((_val = val) === null || _val === void 0
|
|
|
|
? void 0
|
|
|
|
: _val.catch) === "function"
|
|
|
|
) {
|
|
|
|
val.catch(onDone);
|
|
|
|
}
|
|
|
|
queue.push(val);
|
|
|
|
if (next) {
|
|
|
|
next();
|
|
|
|
next = null;
|
|
|
|
}
|
|
|
|
if (!done && queue.length && queue.length >= concurrency) {
|
|
|
|
await new Promise2((resolve) => {
|
|
|
|
resume = resolve;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
queue.push(kEof);
|
|
|
|
} catch (err) {
|
|
|
|
const val = PromiseReject(err);
|
|
|
|
PromisePrototypeThen(val, void 0, onDone);
|
|
|
|
queue.push(val);
|
|
|
|
} finally {
|
|
|
|
var _options$signal3;
|
|
|
|
done = true;
|
|
|
|
if (next) {
|
|
|
|
next();
|
|
|
|
next = null;
|
|
|
|
}
|
|
|
|
options === null || options === void 0
|
|
|
|
? void 0
|
|
|
|
: (_options$signal3 = options.signal) === null ||
|
|
|
|
_options$signal3 === void 0
|
|
|
|
? void 0
|
|
|
|
: _options$signal3.removeEventListener("abort", abort);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
pump();
|
|
|
|
try {
|
|
|
|
while (true) {
|
|
|
|
while (queue.length > 0) {
|
|
|
|
const val = await queue[0];
|
|
|
|
if (val === kEof) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (signal.aborted) {
|
|
|
|
throw new AbortError();
|
|
|
|
}
|
|
|
|
if (val !== kEmpty) {
|
|
|
|
yield val;
|
|
|
|
}
|
|
|
|
queue.shift();
|
|
|
|
if (resume) {
|
|
|
|
resume();
|
|
|
|
resume = null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
await new Promise2((resolve) => {
|
|
|
|
next = resolve;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
} finally {
|
|
|
|
ac.abort();
|
|
|
|
done = true;
|
|
|
|
if (resume) {
|
|
|
|
resume();
|
|
|
|
resume = null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}.call(this);
|
|
|
|
}
|
|
|
|
function asIndexedPairs(options = void 0) {
|
|
|
|
if (options != null) {
|
|
|
|
validateObject(options, "options");
|
|
|
|
}
|
|
|
|
if (
|
|
|
|
(options === null || options === void 0 ? void 0 : options.signal) !=
|
|
|
|
null
|
|
|
|
) {
|
|
|
|
validateAbortSignal(options.signal, "options.signal");
|
|
|
|
}
|
|
|
|
return async function* asIndexedPairs2() {
|
|
|
|
let index = 0;
|
|
|
|
for await (const val of this) {
|
|
|
|
var _options$signal4;
|
|
|
|
if (
|
|
|
|
options !== null && options !== void 0 &&
|
|
|
|
(_options$signal4 = options.signal) !== null &&
|
|
|
|
_options$signal4 !== void 0 && _options$signal4.aborted
|
|
|
|
) {
|
|
|
|
throw new AbortError({
|
|
|
|
cause: options.signal.reason,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
yield [index++, val];
|
|
|
|
}
|
|
|
|
}.call(this);
|
|
|
|
}
|
|
|
|
async function some(fn, options = void 0) {
|
|
|
|
for await (const unused of filter.call(this, fn, options)) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
async function every(fn, options = void 0) {
|
|
|
|
if (typeof fn !== "function") {
|
|
|
|
throw new ERR_INVALID_ARG_TYPE("fn", ["Function", "AsyncFunction"], fn);
|
|
|
|
}
|
|
|
|
return !await some.call(
|
|
|
|
this,
|
|
|
|
async (...args) => {
|
|
|
|
return !await fn(...args);
|
|
|
|
},
|
|
|
|
options,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
async function find(fn, options) {
|
|
|
|
for await (const result of filter.call(this, fn, options)) {
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
return void 0;
|
|
|
|
}
|
|
|
|
async function forEach(fn, options) {
|
|
|
|
if (typeof fn !== "function") {
|
|
|
|
throw new ERR_INVALID_ARG_TYPE("fn", ["Function", "AsyncFunction"], fn);
|
|
|
|
}
|
|
|
|
async function forEachFn(value, options2) {
|
|
|
|
await fn(value, options2);
|
|
|
|
return kEmpty;
|
|
|
|
}
|
|
|
|
for await (const unused of map.call(this, forEachFn, options));
|
|
|
|
}
|
|
|
|
function filter(fn, options) {
|
|
|
|
if (typeof fn !== "function") {
|
|
|
|
throw new ERR_INVALID_ARG_TYPE("fn", ["Function", "AsyncFunction"], fn);
|
|
|
|
}
|
|
|
|
async function filterFn(value, options2) {
|
|
|
|
if (await fn(value, options2)) {
|
|
|
|
return value;
|
|
|
|
}
|
|
|
|
return kEmpty;
|
|
|
|
}
|
|
|
|
return map.call(this, filterFn, options);
|
|
|
|
}
|
|
|
|
var ReduceAwareErrMissingArgs = class extends ERR_MISSING_ARGS {
|
|
|
|
constructor() {
|
|
|
|
super("reduce");
|
|
|
|
this.message = "Reduce of an empty stream requires an initial value";
|
|
|
|
}
|
|
|
|
};
|
|
|
|
async function reduce(reducer, initialValue, options) {
|
|
|
|
var _options$signal5;
|
|
|
|
if (typeof reducer !== "function") {
|
|
|
|
throw new ERR_INVALID_ARG_TYPE(
|
|
|
|
"reducer",
|
|
|
|
["Function", "AsyncFunction"],
|
|
|
|
reducer,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
if (options != null) {
|
|
|
|
validateObject(options, "options");
|
|
|
|
}
|
|
|
|
if (
|
|
|
|
(options === null || options === void 0 ? void 0 : options.signal) !=
|
|
|
|
null
|
|
|
|
) {
|
|
|
|
validateAbortSignal(options.signal, "options.signal");
|
|
|
|
}
|
|
|
|
let hasInitialValue = arguments.length > 1;
|
|
|
|
if (
|
|
|
|
options !== null && options !== void 0 &&
|
|
|
|
(_options$signal5 = options.signal) !== null &&
|
|
|
|
_options$signal5 !== void 0 && _options$signal5.aborted
|
|
|
|
) {
|
|
|
|
const err = new AbortError(void 0, {
|
|
|
|
cause: options.signal.reason,
|
|
|
|
});
|
|
|
|
this.once("error", () => {
|
|
|
|
});
|
|
|
|
await finished(this.destroy(err));
|
|
|
|
throw err;
|
|
|
|
}
|
|
|
|
const ac = new AbortController();
|
|
|
|
const signal = ac.signal;
|
|
|
|
if (options !== null && options !== void 0 && options.signal) {
|
|
|
|
const opts = {
|
|
|
|
once: true,
|
|
|
|
[kWeakHandler]: this,
|
|
|
|
};
|
|
|
|
options.signal.addEventListener("abort", () => ac.abort(), opts);
|
|
|
|
}
|
|
|
|
let gotAnyItemFromStream = false;
|
|
|
|
try {
|
|
|
|
for await (const value of this) {
|
|
|
|
var _options$signal6;
|
|
|
|
gotAnyItemFromStream = true;
|
|
|
|
if (
|
|
|
|
options !== null && options !== void 0 &&
|
|
|
|
(_options$signal6 = options.signal) !== null &&
|
|
|
|
_options$signal6 !== void 0 && _options$signal6.aborted
|
|
|
|
) {
|
|
|
|
throw new AbortError();
|
|
|
|
}
|
|
|
|
if (!hasInitialValue) {
|
|
|
|
initialValue = value;
|
|
|
|
hasInitialValue = true;
|
|
|
|
} else {
|
|
|
|
initialValue = await reducer(initialValue, value, {
|
|
|
|
signal,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!gotAnyItemFromStream && !hasInitialValue) {
|
|
|
|
throw new ReduceAwareErrMissingArgs();
|
|
|
|
}
|
|
|
|
} finally {
|
|
|
|
ac.abort();
|
|
|
|
}
|
|
|
|
return initialValue;
|
|
|
|
}
|
|
|
|
async function toArray(options) {
|
|
|
|
if (options != null) {
|
|
|
|
validateObject(options, "options");
|
|
|
|
}
|
|
|
|
if (
|
|
|
|
(options === null || options === void 0 ? void 0 : options.signal) !=
|
|
|
|
null
|
|
|
|
) {
|
|
|
|
validateAbortSignal(options.signal, "options.signal");
|
|
|
|
}
|
|
|
|
const result = [];
|
|
|
|
for await (const val of this) {
|
|
|
|
var _options$signal7;
|
|
|
|
if (
|
|
|
|
options !== null && options !== void 0 &&
|
|
|
|
(_options$signal7 = options.signal) !== null &&
|
|
|
|
_options$signal7 !== void 0 && _options$signal7.aborted
|
|
|
|
) {
|
|
|
|
throw new AbortError(void 0, {
|
|
|
|
cause: options.signal.reason,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
ArrayPrototypePush(result, val);
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
function flatMap(fn, options) {
|
|
|
|
const values = map.call(this, fn, options);
|
|
|
|
return async function* flatMap2() {
|
|
|
|
for await (const val of values) {
|
|
|
|
yield* val;
|
|
|
|
}
|
|
|
|
}.call(this);
|
|
|
|
}
|
|
|
|
function toIntegerOrInfinity(number) {
|
|
|
|
number = Number2(number);
|
|
|
|
if (NumberIsNaN(number)) {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
if (number < 0) {
|
|
|
|
throw new ERR_OUT_OF_RANGE("number", ">= 0", number);
|
|
|
|
}
|
|
|
|
return number;
|
|
|
|
}
|
|
|
|
function drop(number, options = void 0) {
|
|
|
|
if (options != null) {
|
|
|
|
validateObject(options, "options");
|
|
|
|
}
|
|
|
|
if (
|
|
|
|
(options === null || options === void 0 ? void 0 : options.signal) !=
|
|
|
|
null
|
|
|
|
) {
|
|
|
|
validateAbortSignal(options.signal, "options.signal");
|
|
|
|
}
|
|
|
|
number = toIntegerOrInfinity(number);
|
|
|
|
return async function* drop2() {
|
|
|
|
var _options$signal8;
|
|
|
|
if (
|
|
|
|
options !== null && options !== void 0 &&
|
|
|
|
(_options$signal8 = options.signal) !== null &&
|
|
|
|
_options$signal8 !== void 0 && _options$signal8.aborted
|
|
|
|
) {
|
|
|
|
throw new AbortError();
|
|
|
|
}
|
|
|
|
for await (const val of this) {
|
|
|
|
var _options$signal9;
|
|
|
|
if (
|
|
|
|
options !== null && options !== void 0 &&
|
|
|
|
(_options$signal9 = options.signal) !== null &&
|
|
|
|
_options$signal9 !== void 0 && _options$signal9.aborted
|
|
|
|
) {
|
|
|
|
throw new AbortError();
|
|
|
|
}
|
|
|
|
if (number-- <= 0) {
|
|
|
|
yield val;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}.call(this);
|
|
|
|
}
|
|
|
|
function take(number, options = void 0) {
|
|
|
|
if (options != null) {
|
|
|
|
validateObject(options, "options");
|
|
|
|
}
|
|
|
|
if (
|
|
|
|
(options === null || options === void 0 ? void 0 : options.signal) !=
|
|
|
|
null
|
|
|
|
) {
|
|
|
|
validateAbortSignal(options.signal, "options.signal");
|
|
|
|
}
|
|
|
|
number = toIntegerOrInfinity(number);
|
|
|
|
return async function* take2() {
|
|
|
|
var _options$signal10;
|
|
|
|
if (
|
|
|
|
options !== null && options !== void 0 &&
|
|
|
|
(_options$signal10 = options.signal) !== null &&
|
|
|
|
_options$signal10 !== void 0 && _options$signal10.aborted
|
|
|
|
) {
|
|
|
|
throw new AbortError();
|
|
|
|
}
|
|
|
|
for await (const val of this) {
|
|
|
|
var _options$signal11;
|
|
|
|
if (
|
|
|
|
options !== null && options !== void 0 &&
|
|
|
|
(_options$signal11 = options.signal) !== null &&
|
|
|
|
_options$signal11 !== void 0 && _options$signal11.aborted
|
|
|
|
) {
|
|
|
|
throw new AbortError();
|
|
|
|
}
|
|
|
|
if (number-- > 0) {
|
|
|
|
yield val;
|
|
|
|
} else {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}.call(this);
|
|
|
|
}
|
|
|
|
module.exports.streamReturningOperators = {
|
|
|
|
asIndexedPairs,
|
|
|
|
drop,
|
|
|
|
filter,
|
|
|
|
flatMap,
|
|
|
|
map,
|
|
|
|
take,
|
|
|
|
};
|
|
|
|
module.exports.promiseReturningOperators = {
|
|
|
|
every,
|
|
|
|
forEach,
|
|
|
|
reduce,
|
|
|
|
toArray,
|
|
|
|
some,
|
|
|
|
find,
|
|
|
|
};
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
// lib/internal/streams/destroy.js
|
|
|
|
var require_destroy = __commonJS({
|
|
|
|
"lib/internal/streams/destroy.js"(exports, module) {
|
|
|
|
"use strict";
|
|
|
|
var process = require_browser2();
|
|
|
|
var { Symbol: Symbol2 } = require_primordials();
|
|
|
|
var { kDestroyed, isDestroyed, isFinished, isServerRequest } =
|
|
|
|
require_utils();
|
|
|
|
var kDestroy = Symbol2("kDestroy");
|
|
|
|
var kConstruct = Symbol2("kConstruct");
|
|
|
|
function checkError(err, w, r) {
|
|
|
|
if (err) {
|
|
|
|
err.stack;
|
|
|
|
if (w && !w.errored) {
|
|
|
|
w.errored = err;
|
|
|
|
}
|
|
|
|
if (r && !r.errored) {
|
|
|
|
r.errored = err;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function destroy(err, cb) {
|
|
|
|
const r = this._readableState;
|
|
|
|
const w = this._writableState;
|
|
|
|
const s = w || r;
|
|
|
|
if (w && w.destroyed || r && r.destroyed) {
|
|
|
|
if (typeof cb === "function") {
|
|
|
|
cb();
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
checkError(err, w, r);
|
|
|
|
if (w) {
|
|
|
|
w.destroyed = true;
|
|
|
|
}
|
|
|
|
if (r) {
|
|
|
|
r.destroyed = true;
|
|
|
|
}
|
|
|
|
if (!s.constructed) {
|
|
|
|
this.once(kDestroy, function (er) {
|
|
|
|
_destroy(this, aggregateTwoErrors(er, err), cb);
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
_destroy(this, err, cb);
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
function _destroy(self2, err, cb) {
|
|
|
|
let called = false;
|
|
|
|
function onDestroy(err2) {
|
|
|
|
if (called) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
called = true;
|
|
|
|
const r = self2._readableState;
|
|
|
|
const w = self2._writableState;
|
|
|
|
checkError(err2, w, r);
|
|
|
|
if (w) {
|
|
|
|
w.closed = true;
|
|
|
|
}
|
|
|
|
if (r) {
|
|
|
|
r.closed = true;
|
|
|
|
}
|
|
|
|
if (typeof cb === "function") {
|
|
|
|
cb(err2);
|
|
|
|
}
|
|
|
|
if (err2) {
|
|
|
|
process.nextTick(emitErrorCloseNT, self2, err2);
|
|
|
|
} else {
|
|
|
|
process.nextTick(emitCloseNT, self2);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
try {
|
|
|
|
self2._destroy(err || null, onDestroy);
|
|
|
|
} catch (err2) {
|
|
|
|
onDestroy(err2);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function emitErrorCloseNT(self2, err) {
|
|
|
|
emitErrorNT(self2, err);
|
|
|
|
emitCloseNT(self2);
|
|
|
|
}
|
|
|
|
function emitCloseNT(self2) {
|
|
|
|
const r = self2._readableState;
|
|
|
|
const w = self2._writableState;
|
|
|
|
if (w) {
|
|
|
|
w.closeEmitted = true;
|
|
|
|
}
|
|
|
|
if (r) {
|
|
|
|
r.closeEmitted = true;
|
|
|
|
}
|
|
|
|
if (w && w.emitClose || r && r.emitClose) {
|
|
|
|
self2.emit("close");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function emitErrorNT(self2, err) {
|
|
|
|
const r = self2._readableState;
|
|
|
|
const w = self2._writableState;
|
|
|
|
if (w && w.errorEmitted || r && r.errorEmitted) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (w) {
|
|
|
|
w.errorEmitted = true;
|
|
|
|
}
|
|
|
|
if (r) {
|
|
|
|
r.errorEmitted = true;
|
|
|
|
}
|
|
|
|
self2.emit("error", err);
|
|
|
|
}
|
|
|
|
function undestroy() {
|
|
|
|
const r = this._readableState;
|
|
|
|
const w = this._writableState;
|
|
|
|
if (r) {
|
|
|
|
r.constructed = true;
|
|
|
|
r.closed = false;
|
|
|
|
r.closeEmitted = false;
|
|
|
|
r.destroyed = false;
|
|
|
|
r.errored = null;
|
|
|
|
r.errorEmitted = false;
|
|
|
|
r.reading = false;
|
|
|
|
r.ended = r.readable === false;
|
|
|
|
r.endEmitted = r.readable === false;
|
|
|
|
}
|
|
|
|
if (w) {
|
|
|
|
w.constructed = true;
|
|
|
|
w.destroyed = false;
|
|
|
|
w.closed = false;
|
|
|
|
w.closeEmitted = false;
|
|
|
|
w.errored = null;
|
|
|
|
w.errorEmitted = false;
|
|
|
|
w.finalCalled = false;
|
|
|
|
w.prefinished = false;
|
|
|
|
w.ended = w.writable === false;
|
|
|
|
w.ending = w.writable === false;
|
|
|
|
w.finished = w.writable === false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function errorOrDestroy(stream, err, sync) {
|
|
|
|
const r = stream._readableState;
|
|
|
|
const w = stream._writableState;
|
|
|
|
if (w && w.destroyed || r && r.destroyed) {
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
if (r && r.autoDestroy || w && w.autoDestroy) {
|
|
|
|
stream.destroy(err);
|
|
|
|
} else if (err) {
|
|
|
|
err.stack;
|
|
|
|
if (w && !w.errored) {
|
|
|
|
w.errored = err;
|
|
|
|
}
|
|
|
|
if (r && !r.errored) {
|
|
|
|
r.errored = err;
|
|
|
|
}
|
|
|
|
if (sync) {
|
|
|
|
process.nextTick(emitErrorNT, stream, err);
|
|
|
|
} else {
|
|
|
|
emitErrorNT(stream, err);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function construct(stream, cb) {
|
|
|
|
if (typeof stream._construct !== "function") {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
const r = stream._readableState;
|
|
|
|
const w = stream._writableState;
|
|
|
|
if (r) {
|
|
|
|
r.constructed = false;
|
|
|
|
}
|
|
|
|
if (w) {
|
|
|
|
w.constructed = false;
|
|
|
|
}
|
|
|
|
stream.once(kConstruct, cb);
|
|
|
|
if (stream.listenerCount(kConstruct) > 1) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
process.nextTick(constructNT, stream);
|
|
|
|
}
|
|
|
|
function constructNT(stream) {
|
|
|
|
let called = false;
|
|
|
|
function onConstruct(err) {
|
|
|
|
if (called) {
|
|
|
|
errorOrDestroy(
|
|
|
|
stream,
|
|
|
|
err !== null && err !== void 0 ? err : new ERR_MULTIPLE_CALLBACK(),
|
|
|
|
);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
called = true;
|
|
|
|
const r = stream._readableState;
|
|
|
|
const w = stream._writableState;
|
|
|
|
const s = w || r;
|
|
|
|
if (r) {
|
|
|
|
r.constructed = true;
|
|
|
|
}
|
|
|
|
if (w) {
|
|
|
|
w.constructed = true;
|
|
|
|
}
|
|
|
|
if (s.destroyed) {
|
|
|
|
stream.emit(kDestroy, err);
|
|
|
|
} else if (err) {
|
|
|
|
errorOrDestroy(stream, err, true);
|
|
|
|
} else {
|
2024-04-07 23:47:34 -04:00
|
|
|
stream.emit(kConstruct);
|
2023-05-10 06:30:02 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
try {
|
2023-11-22 19:57:05 -05:00
|
|
|
stream._construct((err) => {
|
|
|
|
nextTick(onConstruct, err);
|
|
|
|
});
|
2023-05-10 06:30:02 -04:00
|
|
|
} catch (err) {
|
2023-11-22 19:57:05 -05:00
|
|
|
nextTick(onConstruct, err);
|
2023-05-10 06:30:02 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
function isRequest(stream) {
|
|
|
|
return stream && stream.setHeader && typeof stream.abort === "function";
|
|
|
|
}
|
|
|
|
function emitCloseLegacy(stream) {
|
|
|
|
stream.emit("close");
|
|
|
|
}
|
|
|
|
function emitErrorCloseLegacy(stream, err) {
|
|
|
|
stream.emit("error", err);
|
|
|
|
process.nextTick(emitCloseLegacy, stream);
|
|
|
|
}
|
|
|
|
function destroyer(stream, err) {
|
|
|
|
if (!stream || isDestroyed(stream)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (!err && !isFinished(stream)) {
|
|
|
|
err = new AbortError();
|
|
|
|
}
|
|
|
|
if (isServerRequest(stream)) {
|
|
|
|
stream.socket = null;
|
|
|
|
stream.destroy(err);
|
|
|
|
} else if (isRequest(stream)) {
|
|
|
|
stream.abort();
|
|
|
|
} else if (isRequest(stream.req)) {
|
|
|
|
stream.req.abort();
|
|
|
|
} else if (typeof stream.destroy === "function") {
|
|
|
|
stream.destroy(err);
|
|
|
|
} else if (typeof stream.close === "function") {
|
|
|
|
stream.close();
|
|
|
|
} else if (err) {
|
|
|
|
process.nextTick(emitErrorCloseLegacy, stream, err);
|
|
|
|
} else {
|
|
|
|
process.nextTick(emitCloseLegacy, stream);
|
|
|
|
}
|
|
|
|
if (!stream.destroyed) {
|
|
|
|
stream[kDestroyed] = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
module.exports = {
|
|
|
|
construct,
|
|
|
|
destroyer,
|
|
|
|
destroy,
|
|
|
|
undestroy,
|
|
|
|
errorOrDestroy,
|
|
|
|
};
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
// node_modules/events/events.js
|
|
|
|
var require_events = __commonJS({
|
|
|
|
"node_modules/events/events.js"(exports, module) {
|
|
|
|
"use strict";
|
|
|
|
var R = typeof Reflect === "object" ? Reflect : null;
|
|
|
|
var ReflectApply = R && typeof R.apply === "function"
|
|
|
|
? R.apply
|
|
|
|
: function ReflectApply2(target, receiver, args) {
|
|
|
|
return Function.prototype.apply.call(target, receiver, args);
|
|
|
|
};
|
|
|
|
var ReflectOwnKeys;
|
|
|
|
if (R && typeof R.ownKeys === "function") {
|
|
|
|
ReflectOwnKeys = R.ownKeys;
|
|
|
|
} else if (Object.getOwnPropertySymbols) {
|
|
|
|
ReflectOwnKeys = function ReflectOwnKeys2(target) {
|
|
|
|
return Object.getOwnPropertyNames(target).concat(
|
|
|
|
Object.getOwnPropertySymbols(target),
|
|
|
|
);
|
|
|
|
};
|
|
|
|
} else {
|
|
|
|
ReflectOwnKeys = function ReflectOwnKeys2(target) {
|
|
|
|
return Object.getOwnPropertyNames(target);
|
|
|
|
};
|
|
|
|
}
|
|
|
|
function ProcessEmitWarning(warning) {
|
|
|
|
if (console && console.warn) {
|
|
|
|
console.warn(warning);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
var NumberIsNaN = Number.isNaN || function NumberIsNaN2(value) {
|
|
|
|
return value !== value;
|
|
|
|
};
|
|
|
|
function EventEmitter() {
|
|
|
|
EventEmitter.init.call(this);
|
|
|
|
}
|
|
|
|
module.exports = EventEmitter;
|
|
|
|
module.exports.once = once;
|
|
|
|
EventEmitter.EventEmitter = EventEmitter;
|
|
|
|
EventEmitter.prototype._events = void 0;
|
|
|
|
EventEmitter.prototype._eventsCount = 0;
|
|
|
|
EventEmitter.prototype._maxListeners = void 0;
|
|
|
|
var defaultMaxListeners = 10;
|
|
|
|
function checkListener(listener) {
|
|
|
|
if (typeof listener !== "function") {
|
|
|
|
throw new TypeError(
|
|
|
|
'The "listener" argument must be of type Function. Received type ' +
|
|
|
|
typeof listener,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Object.defineProperty(EventEmitter, "defaultMaxListeners", {
|
|
|
|
enumerable: true,
|
|
|
|
get: function () {
|
|
|
|
return defaultMaxListeners;
|
|
|
|
},
|
|
|
|
set: function (arg) {
|
|
|
|
if (typeof arg !== "number" || arg < 0 || NumberIsNaN(arg)) {
|
|
|
|
throw new RangeError(
|
|
|
|
'The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' +
|
|
|
|
arg + ".",
|
|
|
|
);
|
|
|
|
}
|
|
|
|
defaultMaxListeners = arg;
|
|
|
|
},
|
|
|
|
});
|
|
|
|
EventEmitter.init = function () {
|
|
|
|
if (
|
|
|
|
this._events === void 0 ||
|
|
|
|
this._events === Object.getPrototypeOf(this)._events
|
|
|
|
) {
|
|
|
|
this._events = /* @__PURE__ */ Object.create(null);
|
|
|
|
this._eventsCount = 0;
|
|
|
|
}
|
|
|
|
this._maxListeners = this._maxListeners || void 0;
|
|
|
|
};
|
|
|
|
EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {
|
|
|
|
if (typeof n !== "number" || n < 0 || NumberIsNaN(n)) {
|
|
|
|
throw new RangeError(
|
|
|
|
'The value of "n" is out of range. It must be a non-negative number. Received ' +
|
|
|
|
n + ".",
|
|
|
|
);
|
|
|
|
}
|
|
|
|
this._maxListeners = n;
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
function _getMaxListeners(that) {
|
|
|
|
if (that._maxListeners === void 0) {
|
|
|
|
return EventEmitter.defaultMaxListeners;
|
|
|
|
}
|
|
|
|
return that._maxListeners;
|
|
|
|
}
|
|
|
|
EventEmitter.prototype.getMaxListeners = function getMaxListeners() {
|
|
|
|
return _getMaxListeners(this);
|
|
|
|
};
|
|
|
|
EventEmitter.prototype.emit = function emit(type) {
|
|
|
|
var args = [];
|
|
|
|
for (var i = 1; i < arguments.length; i++) {
|
|
|
|
args.push(arguments[i]);
|
|
|
|
}
|
|
|
|
var doError = type === "error";
|
|
|
|
var events = this._events;
|
|
|
|
if (events !== void 0) {
|
|
|
|
doError = doError && events.error === void 0;
|
|
|
|
} else if (!doError) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if (doError) {
|
|
|
|
var er;
|
|
|
|
if (args.length > 0) {
|
|
|
|
er = args[0];
|
|
|
|
}
|
|
|
|
if (er instanceof Error) {
|
|
|
|
throw er;
|
|
|
|
}
|
|
|
|
var err = new Error(
|
|
|
|
"Unhandled error." + (er ? " (" + er.message + ")" : ""),
|
|
|
|
);
|
|
|
|
err.context = er;
|
|
|
|
throw err;
|
|
|
|
}
|
|
|
|
var handler = events[type];
|
|
|
|
if (handler === void 0) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if (typeof handler === "function") {
|
|
|
|
ReflectApply(handler, this, args);
|
|
|
|
} else {
|
|
|
|
var len = handler.length;
|
|
|
|
var listeners = arrayClone(handler, len);
|
|
|
|
for (var i = 0; i < len; ++i) {
|
|
|
|
ReflectApply(listeners[i], this, args);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
};
|
|
|
|
function _addListener(target, type, listener, prepend) {
|
|
|
|
var m;
|
|
|
|
var events;
|
|
|
|
var existing;
|
|
|
|
checkListener(listener);
|
|
|
|
events = target._events;
|
|
|
|
if (events === void 0) {
|
|
|
|
events = target._events = /* @__PURE__ */ Object.create(null);
|
|
|
|
target._eventsCount = 0;
|
|
|
|
} else {
|
|
|
|
if (events.newListener !== void 0) {
|
|
|
|
target.emit(
|
|
|
|
"newListener",
|
|
|
|
type,
|
|
|
|
listener.listener ? listener.listener : listener,
|
|
|
|
);
|
|
|
|
events = target._events;
|
|
|
|
}
|
|
|
|
existing = events[type];
|
|
|
|
}
|
|
|
|
if (existing === void 0) {
|
|
|
|
existing = events[type] = listener;
|
|
|
|
++target._eventsCount;
|
|
|
|
} else {
|
|
|
|
if (typeof existing === "function") {
|
|
|
|
existing = events[type] = prepend
|
|
|
|
? [listener, existing]
|
|
|
|
: [existing, listener];
|
|
|
|
} else if (prepend) {
|
|
|
|
existing.unshift(listener);
|
|
|
|
} else {
|
|
|
|
existing.push(listener);
|
|
|
|
}
|
|
|
|
m = _getMaxListeners(target);
|
|
|
|
if (m > 0 && existing.length > m && !existing.warned) {
|
|
|
|
existing.warned = true;
|
|
|
|
var w = new Error(
|
|
|
|
"Possible EventEmitter memory leak detected. " + existing.length +
|
|
|
|
" " + String(type) +
|
|
|
|
" listeners added. Use emitter.setMaxListeners() to increase limit",
|
|
|
|
);
|
|
|
|
w.name = "MaxListenersExceededWarning";
|
|
|
|
w.emitter = target;
|
|
|
|
w.type = type;
|
|
|
|
w.count = existing.length;
|
|
|
|
ProcessEmitWarning(w);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return target;
|
|
|
|
}
|
|
|
|
EventEmitter.prototype.addListener = function addListener(type, listener) {
|
|
|
|
return _addListener(this, type, listener, false);
|
|
|
|
};
|
|
|
|
EventEmitter.prototype.on = EventEmitter.prototype.addListener;
|
|
|
|
EventEmitter.prototype.prependListener = function prependListener(
|
|
|
|
type,
|
|
|
|
listener,
|
|
|
|
) {
|
|
|
|
return _addListener(this, type, listener, true);
|
|
|
|
};
|
|
|
|
function onceWrapper() {
|
|
|
|
if (!this.fired) {
|
|
|
|
this.target.removeListener(this.type, this.wrapFn);
|
|
|
|
this.fired = true;
|
|
|
|
if (arguments.length === 0) {
|
|
|
|
return this.listener.call(this.target);
|
|
|
|
}
|
|
|
|
return this.listener.apply(this.target, arguments);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function _onceWrap(target, type, listener) {
|
|
|
|
var state = { fired: false, wrapFn: void 0, target, type, listener };
|
|
|
|
var wrapped = onceWrapper.bind(state);
|
|
|
|
wrapped.listener = listener;
|
|
|
|
state.wrapFn = wrapped;
|
|
|
|
return wrapped;
|
|
|
|
}
|
|
|
|
EventEmitter.prototype.once = function once2(type, listener) {
|
|
|
|
checkListener(listener);
|
|
|
|
this.on(type, _onceWrap(this, type, listener));
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
EventEmitter.prototype.prependOnceListener = function prependOnceListener(
|
|
|
|
type,
|
|
|
|
listener,
|
|
|
|
) {
|
|
|
|
checkListener(listener);
|
|
|
|
this.prependListener(type, _onceWrap(this, type, listener));
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
EventEmitter.prototype.removeListener = function removeListener(
|
|
|
|
type,
|
|
|
|
listener,
|
|
|
|
) {
|
|
|
|
var list, events, position, i, originalListener;
|
|
|
|
checkListener(listener);
|
|
|
|
events = this._events;
|
|
|
|
if (events === void 0) {
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
list = events[type];
|
|
|
|
if (list === void 0) {
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
if (list === listener || list.listener === listener) {
|
|
|
|
if (--this._eventsCount === 0) {
|
|
|
|
this._events = /* @__PURE__ */ Object.create(null);
|
|
|
|
} else {
|
|
|
|
delete events[type];
|
|
|
|
if (events.removeListener) {
|
|
|
|
this.emit("removeListener", type, list.listener || listener);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else if (typeof list !== "function") {
|
|
|
|
position = -1;
|
|
|
|
for (i = list.length - 1; i >= 0; i--) {
|
|
|
|
if (list[i] === listener || list[i].listener === listener) {
|
|
|
|
originalListener = list[i].listener;
|
|
|
|
position = i;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (position < 0) {
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
if (position === 0) {
|
|
|
|
list.shift();
|
|
|
|
} else {
|
|
|
|
spliceOne(list, position);
|
|
|
|
}
|
|
|
|
if (list.length === 1) {
|
|
|
|
events[type] = list[0];
|
|
|
|
}
|
|
|
|
if (events.removeListener !== void 0) {
|
|
|
|
this.emit("removeListener", type, originalListener || listener);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
EventEmitter.prototype.off = EventEmitter.prototype.removeListener;
|
|
|
|
EventEmitter.prototype.removeAllListeners = function removeAllListeners(
|
|
|
|
type,
|
|
|
|
) {
|
|
|
|
var listeners, events, i;
|
|
|
|
events = this._events;
|
|
|
|
if (events === void 0) {
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
if (events.removeListener === void 0) {
|
|
|
|
if (arguments.length === 0) {
|
|
|
|
this._events = /* @__PURE__ */ Object.create(null);
|
|
|
|
this._eventsCount = 0;
|
|
|
|
} else if (events[type] !== void 0) {
|
|
|
|
if (--this._eventsCount === 0) {
|
|
|
|
this._events = /* @__PURE__ */ Object.create(null);
|
|
|
|
} else {
|
|
|
|
delete events[type];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
if (arguments.length === 0) {
|
|
|
|
var keys = Object.keys(events);
|
|
|
|
var key;
|
|
|
|
for (i = 0; i < keys.length; ++i) {
|
|
|
|
key = keys[i];
|
|
|
|
if (key === "removeListener") {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
this.removeAllListeners(key);
|
|
|
|
}
|
|
|
|
this.removeAllListeners("removeListener");
|
|
|
|
this._events = /* @__PURE__ */ Object.create(null);
|
|
|
|
this._eventsCount = 0;
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
listeners = events[type];
|
|
|
|
if (typeof listeners === "function") {
|
|
|
|
this.removeListener(type, listeners);
|
|
|
|
} else if (listeners !== void 0) {
|
|
|
|
for (i = listeners.length - 1; i >= 0; i--) {
|
|
|
|
this.removeListener(type, listeners[i]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
function _listeners(target, type, unwrap) {
|
|
|
|
var events = target._events;
|
|
|
|
if (events === void 0) {
|
|
|
|
return [];
|
|
|
|
}
|
|
|
|
var evlistener = events[type];
|
|
|
|
if (evlistener === void 0) {
|
|
|
|
return [];
|
|
|
|
}
|
|
|
|
if (typeof evlistener === "function") {
|
|
|
|
return unwrap ? [evlistener.listener || evlistener] : [evlistener];
|
|
|
|
}
|
|
|
|
return unwrap
|
|
|
|
? unwrapListeners(evlistener)
|
|
|
|
: arrayClone(evlistener, evlistener.length);
|
|
|
|
}
|
|
|
|
EventEmitter.prototype.listeners = function listeners(type) {
|
|
|
|
return _listeners(this, type, true);
|
|
|
|
};
|
|
|
|
EventEmitter.prototype.rawListeners = function rawListeners(type) {
|
|
|
|
return _listeners(this, type, false);
|
|
|
|
};
|
|
|
|
EventEmitter.listenerCount = function (emitter, type) {
|
|
|
|
if (typeof emitter.listenerCount === "function") {
|
|
|
|
return emitter.listenerCount(type);
|
|
|
|
} else {
|
|
|
|
return listenerCount.call(emitter, type);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
EventEmitter.prototype.listenerCount = listenerCount;
|
|
|
|
function listenerCount(type) {
|
|
|
|
var events = this._events;
|
|
|
|
if (events !== void 0) {
|
|
|
|
var evlistener = events[type];
|
|
|
|
if (typeof evlistener === "function") {
|
|
|
|
return 1;
|
|
|
|
} else if (evlistener !== void 0) {
|
|
|
|
return evlistener.length;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
EventEmitter.prototype.eventNames = function eventNames() {
|
|
|
|
return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];
|
|
|
|
};
|
|
|
|
function arrayClone(arr, n) {
|
|
|
|
var copy = new Array(n);
|
|
|
|
for (var i = 0; i < n; ++i) {
|
|
|
|
copy[i] = arr[i];
|
|
|
|
}
|
|
|
|
return copy;
|
|
|
|
}
|
|
|
|
function spliceOne(list, index) {
|
|
|
|
for (; index + 1 < list.length; index++) {
|
|
|
|
list[index] = list[index + 1];
|
|
|
|
}
|
|
|
|
list.pop();
|
|
|
|
}
|
|
|
|
function unwrapListeners(arr) {
|
|
|
|
var ret = new Array(arr.length);
|
|
|
|
for (var i = 0; i < ret.length; ++i) {
|
|
|
|
ret[i] = arr[i].listener || arr[i];
|
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
function once(emitter, name) {
|
|
|
|
return new Promise(function (resolve, reject) {
|
|
|
|
function errorListener(err) {
|
|
|
|
emitter.removeListener(name, resolver);
|
|
|
|
reject(err);
|
|
|
|
}
|
|
|
|
function resolver() {
|
|
|
|
if (typeof emitter.removeListener === "function") {
|
|
|
|
emitter.removeListener("error", errorListener);
|
|
|
|
}
|
|
|
|
resolve([].slice.call(arguments));
|
|
|
|
}
|
|
|
|
|
|
|
|
eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });
|
|
|
|
if (name !== "error") {
|
|
|
|
addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
function addErrorHandlerIfEventEmitter(emitter, handler, flags) {
|
|
|
|
if (typeof emitter.on === "function") {
|
|
|
|
eventTargetAgnosticAddListener(emitter, "error", handler, flags);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function eventTargetAgnosticAddListener(emitter, name, listener, flags) {
|
|
|
|
if (typeof emitter.on === "function") {
|
|
|
|
if (flags.once) {
|
|
|
|
emitter.once(name, listener);
|
|
|
|
} else {
|
|
|
|
emitter.on(name, listener);
|
|
|
|
}
|
|
|
|
} else if (typeof emitter.addEventListener === "function") {
|
|
|
|
emitter.addEventListener(name, function wrapListener(arg) {
|
|
|
|
if (flags.once) {
|
|
|
|
emitter.removeEventListener(name, wrapListener);
|
|
|
|
}
|
|
|
|
listener(arg);
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
throw new TypeError(
|
|
|
|
'The "emitter" argument must be of type EventEmitter. Received type ' +
|
|
|
|
typeof emitter,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
// lib/internal/streams/legacy.js
|
|
|
|
var require_legacy = __commonJS({
|
|
|
|
"lib/internal/streams/legacy.js"(exports, module) {
|
|
|
|
"use strict";
|
|
|
|
var { ArrayIsArray, ObjectSetPrototypeOf } = require_primordials();
|
|
|
|
var { EventEmitter: EE } = require_events();
|
|
|
|
function Stream(opts) {
|
|
|
|
EE.call(this, opts);
|
|
|
|
}
|
|
|
|
ObjectSetPrototypeOf(Stream.prototype, EE.prototype);
|
|
|
|
ObjectSetPrototypeOf(Stream, EE);
|
|
|
|
Stream.prototype.pipe = function (dest, options) {
|
|
|
|
const source = this;
|
|
|
|
function ondata(chunk) {
|
|
|
|
if (dest.writable && dest.write(chunk) === false && source.pause) {
|
|
|
|
source.pause();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
source.on("data", ondata);
|
|
|
|
function ondrain() {
|
|
|
|
if (source.readable && source.resume) {
|
|
|
|
source.resume();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
dest.on("drain", ondrain);
|
|
|
|
if (!dest._isStdio && (!options || options.end !== false)) {
|
|
|
|
source.on("end", onend);
|
|
|
|
source.on("close", onclose);
|
|
|
|
}
|
|
|
|
let didOnEnd = false;
|
|
|
|
function onend() {
|
|
|
|
if (didOnEnd) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
didOnEnd = true;
|
|
|
|
dest.end();
|
|
|
|
}
|
|
|
|
function onclose() {
|
|
|
|
if (didOnEnd) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
didOnEnd = true;
|
|
|
|
if (typeof dest.destroy === "function") {
|
|
|
|
dest.destroy();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function onerror(er) {
|
|
|
|
cleanup();
|
|
|
|
if (EE.listenerCount(this, "error") === 0) {
|
|
|
|
this.emit("error", er);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
prependListener(source, "error", onerror);
|
|
|
|
prependListener(dest, "error", onerror);
|
|
|
|
function cleanup() {
|
|
|
|
source.removeListener("data", ondata);
|
|
|
|
dest.removeListener("drain", ondrain);
|
|
|
|
source.removeListener("end", onend);
|
|
|
|
source.removeListener("close", onclose);
|
|
|
|
source.removeListener("error", onerror);
|
|
|
|
dest.removeListener("error", onerror);
|
|
|
|
source.removeListener("end", cleanup);
|
|
|
|
source.removeListener("close", cleanup);
|
|
|
|
dest.removeListener("close", cleanup);
|
|
|
|
}
|
|
|
|
source.on("end", cleanup);
|
|
|
|
source.on("close", cleanup);
|
|
|
|
dest.on("close", cleanup);
|
|
|
|
dest.emit("pipe", source);
|
|
|
|
return dest;
|
|
|
|
};
|
|
|
|
function prependListener(emitter, event, fn) {
|
|
|
|
if (typeof emitter.prependListener === "function") {
|
|
|
|
return emitter.prependListener(event, fn);
|
|
|
|
}
|
|
|
|
if (!emitter._events || !emitter._events[event]) {
|
|
|
|
emitter.on(event, fn);
|
|
|
|
} else if (ArrayIsArray(emitter._events[event])) {
|
|
|
|
emitter._events[event].unshift(fn);
|
|
|
|
} else {
|
|
|
|
emitter._events[event] = [fn, emitter._events[event]];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
module.exports = {
|
|
|
|
Stream,
|
|
|
|
prependListener,
|
|
|
|
};
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
// lib/internal/streams/add-abort-signal.js
|
|
|
|
var require_add_abort_signal = __commonJS({
|
|
|
|
"lib/internal/streams/add-abort-signal.js"(exports, module) {
|
|
|
|
"use strict";
|
|
|
|
var eos = require_end_of_stream();
|
|
|
|
var validateAbortSignal = (signal, name) => {
|
|
|
|
if (typeof signal !== "object" || !("aborted" in signal)) {
|
|
|
|
throw new ERR_INVALID_ARG_TYPE(name, "AbortSignal", signal);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
function isNodeStream(obj) {
|
|
|
|
return !!(obj && typeof obj.pipe === "function");
|
|
|
|
}
|
|
|
|
module.exports.addAbortSignal = function addAbortSignal(signal, stream) {
|
|
|
|
validateAbortSignal(signal, "signal");
|
|
|
|
if (!isNodeStream(stream)) {
|
|
|
|
throw new ERR_INVALID_ARG_TYPE("stream", "stream.Stream", stream);
|
|
|
|
}
|
|
|
|
return module.exports.addAbortSignalNoValidate(signal, stream);
|
|
|
|
};
|
|
|
|
module.exports.addAbortSignalNoValidate = function (signal, stream) {
|
|
|
|
if (typeof signal !== "object" || !("aborted" in signal)) {
|
|
|
|
return stream;
|
|
|
|
}
|
|
|
|
const onAbort = () => {
|
|
|
|
stream.destroy(
|
|
|
|
new AbortError(void 0, {
|
|
|
|
cause: signal.reason,
|
|
|
|
}),
|
|
|
|
);
|
|
|
|
};
|
|
|
|
if (signal.aborted) {
|
|
|
|
onAbort();
|
|
|
|
} else {
|
|
|
|
signal.addEventListener("abort", onAbort);
|
|
|
|
eos(stream, () => signal.removeEventListener("abort", onAbort));
|
|
|
|
}
|
|
|
|
return stream;
|
|
|
|
};
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
// lib/internal/streams/buffer_list.js
|
|
|
|
var require_buffer_list = __commonJS({
|
|
|
|
"lib/internal/streams/buffer_list.js"(exports, module) {
|
|
|
|
"use strict";
|
|
|
|
var {
|
|
|
|
StringPrototypeSlice,
|
|
|
|
SymbolIterator,
|
|
|
|
TypedArrayPrototypeSet,
|
|
|
|
Uint8Array: Uint8Array2,
|
|
|
|
} = require_primordials();
|
|
|
|
var { Buffer: Buffer2 } = require_buffer();
|
|
|
|
module.exports = class BufferList {
|
|
|
|
constructor() {
|
|
|
|
this.head = null;
|
|
|
|
this.tail = null;
|
|
|
|
this.length = 0;
|
|
|
|
}
|
|
|
|
push(v) {
|
|
|
|
const entry = {
|
|
|
|
data: v,
|
|
|
|
next: null,
|
|
|
|
};
|
|
|
|
if (this.length > 0) {
|
|
|
|
this.tail.next = entry;
|
|
|
|
} else {
|
|
|
|
this.head = entry;
|
|
|
|
}
|
|
|
|
this.tail = entry;
|
|
|
|
++this.length;
|
|
|
|
}
|
|
|
|
unshift(v) {
|
|
|
|
const entry = {
|
|
|
|
data: v,
|
|
|
|
next: this.head,
|
|
|
|
};
|
|
|
|
if (this.length === 0) {
|
|
|
|
this.tail = entry;
|
|
|
|
}
|
|
|
|
this.head = entry;
|
|
|
|
++this.length;
|
|
|
|
}
|
|
|
|
shift() {
|
|
|
|
if (this.length === 0) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
const ret = this.head.data;
|
|
|
|
if (this.length === 1) {
|
|
|
|
this.head = this.tail = null;
|
|
|
|
} else {
|
|
|
|
this.head = this.head.next;
|
|
|
|
}
|
|
|
|
--this.length;
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
clear() {
|
|
|
|
this.head = this.tail = null;
|
|
|
|
this.length = 0;
|
|
|
|
}
|
|
|
|
join(s) {
|
|
|
|
if (this.length === 0) {
|
|
|
|
return "";
|
|
|
|
}
|
|
|
|
let p = this.head;
|
|
|
|
let ret = "" + p.data;
|
|
|
|
while ((p = p.next) !== null) {
|
|
|
|
ret += s + p.data;
|
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
concat(n) {
|
|
|
|
if (this.length === 0) {
|
|
|
|
return Buffer2.alloc(0);
|
|
|
|
}
|
|
|
|
const ret = Buffer2.allocUnsafe(n >>> 0);
|
|
|
|
let p = this.head;
|
|
|
|
let i = 0;
|
|
|
|
while (p) {
|
|
|
|
TypedArrayPrototypeSet(ret, p.data, i);
|
|
|
|
i += p.data.length;
|
|
|
|
p = p.next;
|
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
// Consumes a specified amount of bytes or characters from the buffered data.
|
|
|
|
consume(n, hasStrings) {
|
|
|
|
const data = this.head.data;
|
|
|
|
if (n < data.length) {
|
|
|
|
const slice = data.slice(0, n);
|
|
|
|
this.head.data = data.slice(n);
|
|
|
|
return slice;
|
|
|
|
}
|
|
|
|
if (n === data.length) {
|
|
|
|
return this.shift();
|
|
|
|
}
|
|
|
|
return hasStrings ? this._getString(n) : this._getBuffer(n);
|
|
|
|
}
|
|
|
|
first() {
|
|
|
|
return this.head.data;
|
|
|
|
}
|
|
|
|
*[SymbolIterator]() {
|
|
|
|
for (let p = this.head; p; p = p.next) {
|
|
|
|
yield p.data;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Consumes a specified amount of characters from the buffered data.
|
|
|
|
_getString(n) {
|
|
|
|
let ret = "";
|
|
|
|
let p = this.head;
|
|
|
|
let c = 0;
|
|
|
|
do {
|
|
|
|
const str = p.data;
|
|
|
|
if (n > str.length) {
|
|
|
|
ret += str;
|
|
|
|
n -= str.length;
|
|
|
|
} else {
|
|
|
|
if (n === str.length) {
|
|
|
|
ret += str;
|
|
|
|
++c;
|
|
|
|
if (p.next) {
|
|
|
|
this.head = p.next;
|
|
|
|
} else {
|
|
|
|
this.head = this.tail = null;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
ret += StringPrototypeSlice(str, 0, n);
|
|
|
|
this.head = p;
|
|
|
|
p.data = StringPrototypeSlice(str, n);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
++c;
|
|
|
|
} while ((p = p.next) !== null);
|
|
|
|
this.length -= c;
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
// Consumes a specified amount of bytes from the buffered data.
|
|
|
|
_getBuffer(n) {
|
|
|
|
const ret = Buffer2.allocUnsafe(n);
|
|
|
|
const retLen = n;
|
|
|
|
let p = this.head;
|
|
|
|
let c = 0;
|
|
|
|
do {
|
|
|
|
const buf = p.data;
|
|
|
|
if (n > buf.length) {
|
|
|
|
TypedArrayPrototypeSet(ret, buf, retLen - n);
|
|
|
|
n -= buf.length;
|
|
|
|
} else {
|
|
|
|
if (n === buf.length) {
|
|
|
|
TypedArrayPrototypeSet(ret, buf, retLen - n);
|
|
|
|
++c;
|
|
|
|
if (p.next) {
|
|
|
|
this.head = p.next;
|
|
|
|
} else {
|
|
|
|
this.head = this.tail = null;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
TypedArrayPrototypeSet(
|
|
|
|
ret,
|
|
|
|
new Uint8Array2(buf.buffer, buf.byteOffset, n),
|
|
|
|
retLen - n,
|
|
|
|
);
|
|
|
|
this.head = p;
|
|
|
|
p.data = buf.slice(n);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
++c;
|
|
|
|
} while ((p = p.next) !== null);
|
|
|
|
this.length -= c;
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
// Make sure the linked list only shows the minimal necessary information.
|
|
|
|
[Symbol.for("nodejs.util.inspect.custom")](_, options) {
|
|
|
|
return inspect(this, {
|
|
|
|
...options,
|
|
|
|
// Only inspect one level.
|
|
|
|
depth: 0,
|
|
|
|
// It should not recurse.
|
|
|
|
customInspect: false,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
};
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
// lib/internal/streams/state.js
|
|
|
|
var require_state = __commonJS({
|
|
|
|
"lib/internal/streams/state.js"(exports, module) {
|
|
|
|
"use strict";
|
|
|
|
var { MathFloor, NumberIsInteger } = require_primordials();
|
|
|
|
function highWaterMarkFrom(options, isDuplex, duplexKey) {
|
|
|
|
return options.highWaterMark != null
|
|
|
|
? options.highWaterMark
|
|
|
|
: isDuplex
|
|
|
|
? options[duplexKey]
|
|
|
|
: null;
|
|
|
|
}
|
|
|
|
function getDefaultHighWaterMark(objectMode) {
|
|
|
|
return objectMode ? 16 : 16 * 1024;
|
|
|
|
}
|
|
|
|
function getHighWaterMark(state, options, duplexKey, isDuplex) {
|
|
|
|
const hwm = highWaterMarkFrom(options, isDuplex, duplexKey);
|
|
|
|
if (hwm != null) {
|
|
|
|
if (!NumberIsInteger(hwm) || hwm < 0) {
|
|
|
|
const name = isDuplex
|
|
|
|
? `options.${duplexKey}`
|
|
|
|
: "options.highWaterMark";
|
|
|
|
throw new ERR_INVALID_ARG_VALUE(name, hwm);
|
|
|
|
}
|
|
|
|
return MathFloor(hwm);
|
|
|
|
}
|
|
|
|
return getDefaultHighWaterMark(state.objectMode);
|
|
|
|
}
|
|
|
|
module.exports = {
|
|
|
|
getHighWaterMark,
|
|
|
|
getDefaultHighWaterMark,
|
|
|
|
};
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
// node_modules/safe-buffer/index.js
|
|
|
|
var require_safe_buffer = __commonJS({
|
|
|
|
"node_modules/safe-buffer/index.js"(exports, module) {
|
|
|
|
var buffer = require_buffer();
|
|
|
|
var Buffer2 = buffer.Buffer;
|
|
|
|
function copyProps(src, dst) {
|
|
|
|
for (var key in src) {
|
|
|
|
dst[key] = src[key];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (
|
|
|
|
Buffer2.from && Buffer2.alloc && Buffer2.allocUnsafe &&
|
|
|
|
Buffer2.allocUnsafeSlow
|
|
|
|
) {
|
|
|
|
module.exports = buffer;
|
|
|
|
} else {
|
|
|
|
copyProps(buffer, exports);
|
|
|
|
exports.Buffer = SafeBuffer;
|
|
|
|
}
|
|
|
|
function SafeBuffer(arg, encodingOrOffset, length) {
|
|
|
|
return Buffer2(arg, encodingOrOffset, length);
|
|
|
|
}
|
|
|
|
SafeBuffer.prototype = Object.create(Buffer2.prototype);
|
|
|
|
copyProps(Buffer2, SafeBuffer);
|
|
|
|
SafeBuffer.from = function (arg, encodingOrOffset, length) {
|
|
|
|
if (typeof arg === "number") {
|
|
|
|
throw new TypeError("Argument must not be a number");
|
|
|
|
}
|
|
|
|
return Buffer2(arg, encodingOrOffset, length);
|
|
|
|
};
|
|
|
|
SafeBuffer.alloc = function (size, fill, encoding) {
|
|
|
|
if (typeof size !== "number") {
|
|
|
|
throw new TypeError("Argument must be a number");
|
|
|
|
}
|
|
|
|
var buf = Buffer2(size);
|
|
|
|
if (fill !== void 0) {
|
|
|
|
if (typeof encoding === "string") {
|
|
|
|
buf.fill(fill, encoding);
|
|
|
|
} else {
|
|
|
|
buf.fill(fill);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
buf.fill(0);
|
|
|
|
}
|
|
|
|
return buf;
|
|
|
|
};
|
|
|
|
SafeBuffer.allocUnsafe = function (size) {
|
|
|
|
if (typeof size !== "number") {
|
|
|
|
throw new TypeError("Argument must be a number");
|
|
|
|
}
|
|
|
|
return Buffer2(size);
|
|
|
|
};
|
|
|
|
SafeBuffer.allocUnsafeSlow = function (size) {
|
|
|
|
if (typeof size !== "number") {
|
|
|
|
throw new TypeError("Argument must be a number");
|
|
|
|
}
|
|
|
|
return buffer.SlowBuffer(size);
|
|
|
|
};
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
// lib/internal/streams/from.js
|
|
|
|
var require_from = __commonJS({
|
|
|
|
"lib/internal/streams/from.js"(exports, module) {
|
|
|
|
"use strict";
|
|
|
|
var process = require_browser2();
|
|
|
|
var { PromisePrototypeThen, SymbolAsyncIterator, SymbolIterator } =
|
|
|
|
require_primordials();
|
|
|
|
var { Buffer: Buffer2 } = require_buffer();
|
|
|
|
function from(Readable, iterable, opts) {
|
|
|
|
let iterator;
|
|
|
|
if (typeof iterable === "string" || iterable instanceof Buffer2) {
|
|
|
|
return new Readable({
|
|
|
|
objectMode: true,
|
|
|
|
...opts,
|
|
|
|
read() {
|
|
|
|
this.push(iterable);
|
|
|
|
this.push(null);
|
|
|
|
},
|
|
|
|
});
|
|
|
|
}
|
|
|
|
let isAsync;
|
|
|
|
if (iterable && iterable[SymbolAsyncIterator]) {
|
|
|
|
isAsync = true;
|
|
|
|
iterator = iterable[SymbolAsyncIterator]();
|
|
|
|
} else if (iterable && iterable[SymbolIterator]) {
|
|
|
|
isAsync = false;
|
|
|
|
iterator = iterable[SymbolIterator]();
|
|
|
|
} else {
|
|
|
|
throw new ERR_INVALID_ARG_TYPE("iterable", ["Iterable"], iterable);
|
|
|
|
}
|
|
|
|
const readable = new Readable({
|
|
|
|
objectMode: true,
|
|
|
|
highWaterMark: 1,
|
|
|
|
// TODO(ronag): What options should be allowed?
|
|
|
|
...opts,
|
|
|
|
});
|
|
|
|
let reading = false;
|
|
|
|
readable._read = function () {
|
|
|
|
if (!reading) {
|
|
|
|
reading = true;
|
|
|
|
next();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
readable._destroy = function (error, cb) {
|
|
|
|
PromisePrototypeThen(
|
|
|
|
close(error),
|
|
|
|
() => process.nextTick(cb, error),
|
|
|
|
// nextTick is here in case cb throws
|
|
|
|
(e) => process.nextTick(cb, e || error),
|
|
|
|
);
|
|
|
|
};
|
|
|
|
async function close(error) {
|
|
|
|
const hadError = error !== void 0 && error !== null;
|
|
|
|
const hasThrow = typeof iterator.throw === "function";
|
|
|
|
if (hadError && hasThrow) {
|
|
|
|
const { value, done } = await iterator.throw(error);
|
|
|
|
await value;
|
|
|
|
if (done) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (typeof iterator.return === "function") {
|
|
|
|
const { value } = await iterator.return();
|
|
|
|
await value;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
async function next() {
|
|
|
|
for (;;) {
|
|
|
|
try {
|
|
|
|
const { value, done } = isAsync
|
|
|
|
? await iterator.next()
|
|
|
|
: iterator.next();
|
|
|
|
if (done) {
|
|
|
|
readable.push(null);
|
|
|
|
} else {
|
|
|
|
const res = value && typeof value.then === "function"
|
|
|
|
? await value
|
|
|
|
: value;
|
|
|
|
if (res === null) {
|
|
|
|
reading = false;
|
|
|
|
throw new ERR_STREAM_NULL_VALUES();
|
|
|
|
} else if (readable.push(res)) {
|
|
|
|
continue;
|
|
|
|
} else {
|
|
|
|
reading = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} catch (err) {
|
|
|
|
readable.destroy(err);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return readable;
|
|
|
|
}
|
|
|
|
module.exports = from;
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
// lib/internal/streams/readable.js
|
|
|
|
var require_readable = __commonJS({
|
|
|
|
"lib/internal/streams/readable.js"(exports, module) {
|
|
|
|
var process = require_browser2();
|
|
|
|
var {
|
|
|
|
ArrayPrototypeIndexOf,
|
|
|
|
NumberIsInteger,
|
|
|
|
NumberIsNaN,
|
|
|
|
NumberParseInt,
|
|
|
|
ObjectDefineProperties,
|
|
|
|
ObjectKeys,
|
|
|
|
ObjectSetPrototypeOf,
|
|
|
|
Promise: Promise2,
|
|
|
|
SafeSet,
|
|
|
|
SymbolAsyncIterator,
|
|
|
|
Symbol: Symbol2,
|
|
|
|
} = require_primordials();
|
|
|
|
module.exports = Readable;
|
|
|
|
Readable.ReadableState = ReadableState;
|
|
|
|
var { EventEmitter: EE } = require_events();
|
|
|
|
var { Stream, prependListener } = require_legacy();
|
|
|
|
var { Buffer: Buffer2 } = require_buffer();
|
|
|
|
var { addAbortSignal } = require_add_abort_signal();
|
|
|
|
var eos = require_end_of_stream();
|
|
|
|
var debug = debuglog("stream", (fn) => {
|
|
|
|
debug = fn;
|
|
|
|
});
|
|
|
|
var BufferList = require_buffer_list();
|
|
|
|
var destroyImpl = require_destroy();
|
|
|
|
var { getHighWaterMark, getDefaultHighWaterMark } = require_state();
|
|
|
|
var { validateObject } = require_validators();
|
|
|
|
var kPaused = Symbol2("kPaused");
|
|
|
|
var from = require_from();
|
|
|
|
ObjectSetPrototypeOf(Readable.prototype, Stream.prototype);
|
|
|
|
ObjectSetPrototypeOf(Readable, Stream);
|
|
|
|
var nop = () => {
|
|
|
|
};
|
|
|
|
var { errorOrDestroy } = destroyImpl;
|
|
|
|
function ReadableState(options, stream, isDuplex) {
|
|
|
|
if (typeof isDuplex !== "boolean") {
|
|
|
|
isDuplex = stream instanceof require_duplex();
|
|
|
|
}
|
|
|
|
this.objectMode = !!(options && options.objectMode);
|
|
|
|
if (isDuplex) {
|
|
|
|
this.objectMode = this.objectMode ||
|
|
|
|
!!(options && options.readableObjectMode);
|
|
|
|
}
|
|
|
|
this.highWaterMark = options
|
|
|
|
? getHighWaterMark(this, options, "readableHighWaterMark", isDuplex)
|
|
|
|
: getDefaultHighWaterMark(false);
|
|
|
|
this.buffer = new BufferList();
|
|
|
|
this.length = 0;
|
|
|
|
this.pipes = [];
|
|
|
|
this.flowing = null;
|
|
|
|
this.ended = false;
|
|
|
|
this.endEmitted = false;
|
|
|
|
this.reading = false;
|
|
|
|
this.constructed = true;
|
|
|
|
this.sync = true;
|
|
|
|
this.needReadable = false;
|
|
|
|
this.emittedReadable = false;
|
|
|
|
this.readableListening = false;
|
|
|
|
this.resumeScheduled = false;
|
|
|
|
this[kPaused] = null;
|
|
|
|
this.errorEmitted = false;
|
|
|
|
this.emitClose = !options || options.emitClose !== false;
|
|
|
|
this.autoDestroy = !options || options.autoDestroy !== false;
|
|
|
|
this.destroyed = false;
|
|
|
|
this.errored = null;
|
|
|
|
this.closed = false;
|
|
|
|
this.closeEmitted = false;
|
|
|
|
this.defaultEncoding = options && options.defaultEncoding || "utf8";
|
|
|
|
this.awaitDrainWriters = null;
|
|
|
|
this.multiAwaitDrain = false;
|
|
|
|
this.readingMore = false;
|
|
|
|
this.dataEmitted = false;
|
|
|
|
this.decoder = null;
|
|
|
|
this.encoding = null;
|
|
|
|
if (options && options.encoding) {
|
|
|
|
this.decoder = new StringDecoder(options.encoding);
|
|
|
|
this.encoding = options.encoding;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function Readable(options) {
|
|
|
|
if (!(this instanceof Readable)) {
|
|
|
|
return new Readable(options);
|
|
|
|
}
|
|
|
|
const isDuplex = this instanceof require_duplex();
|
|
|
|
this._readableState = new ReadableState(options, this, isDuplex);
|
|
|
|
if (options) {
|
|
|
|
if (typeof options.read === "function") {
|
|
|
|
this._read = options.read;
|
|
|
|
}
|
|
|
|
if (typeof options.destroy === "function") {
|
|
|
|
this._destroy = options.destroy;
|
|
|
|
}
|
|
|
|
if (typeof options.construct === "function") {
|
|
|
|
this._construct = options.construct;
|
|
|
|
}
|
|
|
|
if (options.signal && !isDuplex) {
|
|
|
|
addAbortSignal(options.signal, this);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Stream.call(this, options);
|
|
|
|
destroyImpl.construct(this, () => {
|
|
|
|
if (this._readableState.needReadable) {
|
|
|
|
maybeReadMore(this, this._readableState);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
Readable.prototype.destroy = destroyImpl.destroy;
|
|
|
|
Readable.prototype._undestroy = destroyImpl.undestroy;
|
|
|
|
Readable.prototype._destroy = function (err, cb) {
|
|
|
|
cb(err);
|
|
|
|
};
|
|
|
|
Readable.prototype[EE.captureRejectionSymbol] = function (err) {
|
|
|
|
this.destroy(err);
|
|
|
|
};
|
|
|
|
Readable.prototype.push = function (chunk, encoding) {
|
|
|
|
return readableAddChunk(this, chunk, encoding, false);
|
|
|
|
};
|
|
|
|
Readable.prototype.unshift = function (chunk, encoding) {
|
|
|
|
return readableAddChunk(this, chunk, encoding, true);
|
|
|
|
};
|
|
|
|
function readableAddChunk(stream, chunk, encoding, addToFront) {
|
|
|
|
debug("readableAddChunk", chunk);
|
|
|
|
const state = stream._readableState;
|
|
|
|
let err;
|
|
|
|
if (!state.objectMode) {
|
|
|
|
if (typeof chunk === "string") {
|
|
|
|
encoding = encoding || state.defaultEncoding;
|
|
|
|
if (state.encoding !== encoding) {
|
|
|
|
if (addToFront && state.encoding) {
|
|
|
|
chunk = Buffer2.from(chunk, encoding).toString(state.encoding);
|
|
|
|
} else {
|
|
|
|
chunk = Buffer2.from(chunk, encoding);
|
|
|
|
encoding = "";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else if (chunk instanceof Buffer2) {
|
|
|
|
encoding = "";
|
|
|
|
} else if (Stream._isUint8Array(chunk)) {
|
|
|
|
chunk = Stream._uint8ArrayToBuffer(chunk);
|
|
|
|
encoding = "";
|
|
|
|
} else if (chunk != null) {
|
|
|
|
err = new ERR_INVALID_ARG_TYPE("chunk", [
|
|
|
|
"string",
|
|
|
|
"Buffer",
|
|
|
|
"Uint8Array",
|
|
|
|
], chunk);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (err) {
|
|
|
|
errorOrDestroy(stream, err);
|
|
|
|
} else if (chunk === null) {
|
|
|
|
state.reading = false;
|
|
|
|
onEofChunk(stream, state);
|
|
|
|
} else if (state.objectMode || chunk && chunk.length > 0) {
|
|
|
|
if (addToFront) {
|
|
|
|
if (state.endEmitted) {
|
|
|
|
errorOrDestroy(stream, new ERR_STREAM_UNSHIFT_AFTER_END_EVENT());
|
|
|
|
} else if (state.destroyed || state.errored) {
|
|
|
|
return false;
|
|
|
|
} else {
|
|
|
|
addChunk(stream, state, chunk, true);
|
|
|
|
}
|
|
|
|
} else if (state.ended) {
|
|
|
|
errorOrDestroy(stream, new ERR_STREAM_PUSH_AFTER_EOF());
|
|
|
|
} else if (state.destroyed || state.errored) {
|
|
|
|
return false;
|
|
|
|
} else {
|
|
|
|
state.reading = false;
|
|
|
|
if (state.decoder && !encoding) {
|
|
|
|
chunk = state.decoder.write(chunk);
|
|
|
|
if (state.objectMode || chunk.length !== 0) {
|
|
|
|
addChunk(stream, state, chunk, false);
|
|
|
|
} else {
|
|
|
|
maybeReadMore(stream, state);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
addChunk(stream, state, chunk, false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else if (!addToFront) {
|
|
|
|
state.reading = false;
|
|
|
|
maybeReadMore(stream, state);
|
|
|
|
}
|
|
|
|
return !state.ended &&
|
|
|
|
(state.length < state.highWaterMark || state.length === 0);
|
|
|
|
}
|
|
|
|
function addChunk(stream, state, chunk, addToFront) {
|
|
|
|
if (
|
|
|
|
state.flowing && state.length === 0 && !state.sync &&
|
|
|
|
stream.listenerCount("data") > 0
|
|
|
|
) {
|
|
|
|
if (state.multiAwaitDrain) {
|
|
|
|
state.awaitDrainWriters.clear();
|
|
|
|
} else {
|
|
|
|
state.awaitDrainWriters = null;
|
|
|
|
}
|
|
|
|
state.dataEmitted = true;
|
|
|
|
stream.emit("data", chunk);
|
|
|
|
} else {
|
|
|
|
state.length += state.objectMode ? 1 : chunk.length;
|
|
|
|
if (addToFront) {
|
|
|
|
state.buffer.unshift(chunk);
|
|
|
|
} else {
|
|
|
|
state.buffer.push(chunk);
|
|
|
|
}
|
|
|
|
if (state.needReadable) {
|
|
|
|
emitReadable(stream);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
maybeReadMore(stream, state);
|
|
|
|
}
|
|
|
|
Readable.prototype.isPaused = function () {
|
|
|
|
const state = this._readableState;
|
|
|
|
return state[kPaused] === true || state.flowing === false;
|
|
|
|
};
|
|
|
|
Readable.prototype.setEncoding = function (enc) {
|
|
|
|
const decoder = new StringDecoder(enc);
|
|
|
|
this._readableState.decoder = decoder;
|
|
|
|
this._readableState.encoding = this._readableState.decoder.encoding;
|
|
|
|
const buffer = this._readableState.buffer;
|
|
|
|
let content = "";
|
|
|
|
for (const data of buffer) {
|
|
|
|
content += decoder.write(data);
|
|
|
|
}
|
|
|
|
buffer.clear();
|
|
|
|
if (content !== "") {
|
|
|
|
buffer.push(content);
|
|
|
|
}
|
|
|
|
this._readableState.length = content.length;
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
var MAX_HWM = 1073741824;
|
|
|
|
function computeNewHighWaterMark(n) {
|
|
|
|
if (n > MAX_HWM) {
|
|
|
|
throw new ERR_OUT_OF_RANGE("size", "<= 1GiB", n);
|
|
|
|
} else {
|
|
|
|
n--;
|
|
|
|
n |= n >>> 1;
|
|
|
|
n |= n >>> 2;
|
|
|
|
n |= n >>> 4;
|
|
|
|
n |= n >>> 8;
|
|
|
|
n |= n >>> 16;
|
|
|
|
n++;
|
|
|
|
}
|
|
|
|
return n;
|
|
|
|
}
|
|
|
|
function howMuchToRead(n, state) {
|
|
|
|
if (n <= 0 || state.length === 0 && state.ended) {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
if (state.objectMode) {
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
if (NumberIsNaN(n)) {
|
|
|
|
if (state.flowing && state.length) {
|
|
|
|
return state.buffer.first().length;
|
|
|
|
}
|
|
|
|
return state.length;
|
|
|
|
}
|
|
|
|
if (n <= state.length) {
|
|
|
|
return n;
|
|
|
|
}
|
|
|
|
return state.ended ? state.length : 0;
|
|
|
|
}
|
|
|
|
Readable.prototype.read = function (n) {
|
|
|
|
debug("read", n);
|
|
|
|
if (n === void 0) {
|
|
|
|
n = NaN;
|
|
|
|
} else if (!NumberIsInteger(n)) {
|
|
|
|
n = NumberParseInt(n, 10);
|
|
|
|
}
|
|
|
|
const state = this._readableState;
|
|
|
|
const nOrig = n;
|
|
|
|
if (n > state.highWaterMark) {
|
|
|
|
state.highWaterMark = computeNewHighWaterMark(n);
|
|
|
|
}
|
|
|
|
if (n !== 0) {
|
|
|
|
state.emittedReadable = false;
|
|
|
|
}
|
|
|
|
if (
|
|
|
|
n === 0 && state.needReadable &&
|
|
|
|
((state.highWaterMark !== 0
|
|
|
|
? state.length >= state.highWaterMark
|
|
|
|
: state.length > 0) || state.ended)
|
|
|
|
) {
|
|
|
|
debug("read: emitReadable", state.length, state.ended);
|
|
|
|
if (state.length === 0 && state.ended) {
|
|
|
|
endReadable(this);
|
|
|
|
} else {
|
|
|
|
emitReadable(this);
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
n = howMuchToRead(n, state);
|
|
|
|
if (n === 0 && state.ended) {
|
|
|
|
if (state.length === 0) {
|
|
|
|
endReadable(this);
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
let doRead = state.needReadable;
|
|
|
|
debug("need readable", doRead);
|
|
|
|
if (state.length === 0 || state.length - n < state.highWaterMark) {
|
|
|
|
doRead = true;
|
|
|
|
debug("length less than watermark", doRead);
|
|
|
|
}
|
|
|
|
if (
|
|
|
|
state.ended || state.reading || state.destroyed || state.errored ||
|
|
|
|
!state.constructed
|
|
|
|
) {
|
|
|
|
doRead = false;
|
|
|
|
debug("reading, ended or constructing", doRead);
|
|
|
|
} else if (doRead) {
|
|
|
|
debug("do read");
|
|
|
|
state.reading = true;
|
|
|
|
state.sync = true;
|
|
|
|
if (state.length === 0) {
|
|
|
|
state.needReadable = true;
|
|
|
|
}
|
|
|
|
try {
|
|
|
|
this._read(state.highWaterMark);
|
|
|
|
} catch (err) {
|
|
|
|
errorOrDestroy(this, err);
|
|
|
|
}
|
|
|
|
state.sync = false;
|
|
|
|
if (!state.reading) {
|
|
|
|
n = howMuchToRead(nOrig, state);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
let ret;
|
|
|
|
if (n > 0) {
|
|
|
|
ret = fromList(n, state);
|
|
|
|
} else {
|
|
|
|
ret = null;
|
|
|
|
}
|
|
|
|
if (ret === null) {
|
|
|
|
state.needReadable = state.length <= state.highWaterMark;
|
|
|
|
n = 0;
|
|
|
|
} else {
|
|
|
|
state.length -= n;
|
|
|
|
if (state.multiAwaitDrain) {
|
|
|
|
state.awaitDrainWriters.clear();
|
|
|
|
} else {
|
|
|
|
state.awaitDrainWriters = null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (state.length === 0) {
|
|
|
|
if (!state.ended) {
|
|
|
|
state.needReadable = true;
|
|
|
|
}
|
|
|
|
if (nOrig !== n && state.ended) {
|
|
|
|
endReadable(this);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (ret !== null && !state.errorEmitted && !state.closeEmitted) {
|
|
|
|
state.dataEmitted = true;
|
|
|
|
this.emit("data", ret);
|
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
};
|
|
|
|
function onEofChunk(stream, state) {
|
|
|
|
debug("onEofChunk");
|
|
|
|
if (state.ended) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (state.decoder) {
|
|
|
|
const chunk = state.decoder.end();
|
|
|
|
if (chunk && chunk.length) {
|
|
|
|
state.buffer.push(chunk);
|
|
|
|
state.length += state.objectMode ? 1 : chunk.length;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
state.ended = true;
|
|
|
|
if (state.sync) {
|
|
|
|
emitReadable(stream);
|
|
|
|
} else {
|
|
|
|
state.needReadable = false;
|
|
|
|
state.emittedReadable = true;
|
|
|
|
emitReadable_(stream);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function emitReadable(stream) {
|
|
|
|
const state = stream._readableState;
|
|
|
|
debug("emitReadable", state.needReadable, state.emittedReadable);
|
|
|
|
state.needReadable = false;
|
|
|
|
if (!state.emittedReadable) {
|
|
|
|
debug("emitReadable", state.flowing);
|
|
|
|
state.emittedReadable = true;
|
|
|
|
process.nextTick(emitReadable_, stream);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function emitReadable_(stream) {
|
|
|
|
const state = stream._readableState;
|
|
|
|
debug("emitReadable_", state.destroyed, state.length, state.ended);
|
|
|
|
if (!state.destroyed && !state.errored && (state.length || state.ended)) {
|
|
|
|
stream.emit("readable");
|
|
|
|
state.emittedReadable = false;
|
|
|
|
}
|
|
|
|
state.needReadable = !state.flowing && !state.ended &&
|
|
|
|
state.length <= state.highWaterMark;
|
|
|
|
flow(stream);
|
|
|
|
}
|
|
|
|
function maybeReadMore(stream, state) {
|
|
|
|
if (!state.readingMore && state.constructed) {
|
|
|
|
state.readingMore = true;
|
|
|
|
process.nextTick(maybeReadMore_, stream, state);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function maybeReadMore_(stream, state) {
|
|
|
|
while (
|
|
|
|
!state.reading && !state.ended &&
|
|
|
|
(state.length < state.highWaterMark ||
|
|
|
|
state.flowing && state.length === 0)
|
|
|
|
) {
|
|
|
|
const len = state.length;
|
|
|
|
debug("maybeReadMore read 0");
|
|
|
|
stream.read(0);
|
|
|
|
if (len === state.length) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
state.readingMore = false;
|
|
|
|
}
|
|
|
|
Readable.prototype._read = function (n) {
|
|
|
|
throw new ERR_METHOD_NOT_IMPLEMENTED("_read()");
|
|
|
|
};
|
|
|
|
Readable.prototype.pipe = function (dest, pipeOpts) {
|
|
|
|
const src = this;
|
|
|
|
const state = this._readableState;
|
|
|
|
if (state.pipes.length === 1) {
|
|
|
|
if (!state.multiAwaitDrain) {
|
|
|
|
state.multiAwaitDrain = true;
|
|
|
|
state.awaitDrainWriters = new SafeSet(
|
|
|
|
state.awaitDrainWriters ? [state.awaitDrainWriters] : [],
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
state.pipes.push(dest);
|
|
|
|
debug("pipe count=%d opts=%j", state.pipes.length, pipeOpts);
|
|
|
|
const doEnd = (!pipeOpts || pipeOpts.end !== false) &&
|
|
|
|
dest !== process.stdout && dest !== process.stderr;
|
|
|
|
const endFn = doEnd ? onend : unpipe;
|
|
|
|
if (state.endEmitted) {
|
|
|
|
process.nextTick(endFn);
|
|
|
|
} else {
|
|
|
|
src.once("end", endFn);
|
|
|
|
}
|
|
|
|
dest.on("unpipe", onunpipe);
|
|
|
|
function onunpipe(readable, unpipeInfo) {
|
|
|
|
debug("onunpipe");
|
|
|
|
if (readable === src) {
|
|
|
|
if (unpipeInfo && unpipeInfo.hasUnpiped === false) {
|
|
|
|
unpipeInfo.hasUnpiped = true;
|
|
|
|
cleanup();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function onend() {
|
|
|
|
debug("onend");
|
|
|
|
dest.end();
|
|
|
|
}
|
|
|
|
let ondrain;
|
|
|
|
let cleanedUp = false;
|
|
|
|
function cleanup() {
|
|
|
|
debug("cleanup");
|
|
|
|
dest.removeListener("close", onclose);
|
|
|
|
dest.removeListener("finish", onfinish);
|
|
|
|
if (ondrain) {
|
|
|
|
dest.removeListener("drain", ondrain);
|
|
|
|
}
|
|
|
|
dest.removeListener("error", onerror);
|
|
|
|
dest.removeListener("unpipe", onunpipe);
|
|
|
|
src.removeListener("end", onend);
|
|
|
|
src.removeListener("end", unpipe);
|
|
|
|
src.removeListener("data", ondata);
|
|
|
|
cleanedUp = true;
|
|
|
|
if (
|
|
|
|
ondrain && state.awaitDrainWriters &&
|
|
|
|
(!dest._writableState || dest._writableState.needDrain)
|
|
|
|
) {
|
|
|
|
ondrain();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function pause() {
|
|
|
|
if (!cleanedUp) {
|
|
|
|
if (state.pipes.length === 1 && state.pipes[0] === dest) {
|
|
|
|
debug("false write response, pause", 0);
|
|
|
|
state.awaitDrainWriters = dest;
|
|
|
|
state.multiAwaitDrain = false;
|
|
|
|
} else if (state.pipes.length > 1 && state.pipes.includes(dest)) {
|
|
|
|
debug("false write response, pause", state.awaitDrainWriters.size);
|
|
|
|
state.awaitDrainWriters.add(dest);
|
|
|
|
}
|
|
|
|
src.pause();
|
|
|
|
}
|
|
|
|
if (!ondrain) {
|
|
|
|
ondrain = pipeOnDrain(src, dest);
|
|
|
|
dest.on("drain", ondrain);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
src.on("data", ondata);
|
|
|
|
function ondata(chunk) {
|
|
|
|
debug("ondata");
|
|
|
|
const ret = dest.write(chunk);
|
|
|
|
debug("dest.write", ret);
|
|
|
|
if (ret === false) {
|
|
|
|
pause();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function onerror(er) {
|
|
|
|
debug("onerror", er);
|
|
|
|
unpipe();
|
|
|
|
dest.removeListener("error", onerror);
|
|
|
|
if (dest.listenerCount("error") === 0) {
|
|
|
|
const s = dest._writableState || dest._readableState;
|
|
|
|
if (s && !s.errorEmitted) {
|
|
|
|
errorOrDestroy(dest, er);
|
|
|
|
} else {
|
|
|
|
dest.emit("error", er);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
prependListener(dest, "error", onerror);
|
|
|
|
function onclose() {
|
|
|
|
dest.removeListener("finish", onfinish);
|
|
|
|
unpipe();
|
|
|
|
}
|
|
|
|
dest.once("close", onclose);
|
|
|
|
function onfinish() {
|
|
|
|
debug("onfinish");
|
|
|
|
dest.removeListener("close", onclose);
|
|
|
|
unpipe();
|
|
|
|
}
|
|
|
|
dest.once("finish", onfinish);
|
|
|
|
function unpipe() {
|
|
|
|
debug("unpipe");
|
|
|
|
src.unpipe(dest);
|
|
|
|
}
|
|
|
|
dest.emit("pipe", src);
|
|
|
|
if (dest.writableNeedDrain === true) {
|
|
|
|
if (state.flowing) {
|
|
|
|
pause();
|
|
|
|
}
|
|
|
|
} else if (!state.flowing) {
|
|
|
|
debug("pipe resume");
|
|
|
|
src.resume();
|
|
|
|
}
|
|
|
|
return dest;
|
|
|
|
};
|
|
|
|
function pipeOnDrain(src, dest) {
|
|
|
|
return function pipeOnDrainFunctionResult() {
|
|
|
|
const state = src._readableState;
|
|
|
|
if (state.awaitDrainWriters === dest) {
|
|
|
|
debug("pipeOnDrain", 1);
|
|
|
|
state.awaitDrainWriters = null;
|
|
|
|
} else if (state.multiAwaitDrain) {
|
|
|
|
debug("pipeOnDrain", state.awaitDrainWriters.size);
|
|
|
|
state.awaitDrainWriters.delete(dest);
|
|
|
|
}
|
|
|
|
if (
|
|
|
|
(!state.awaitDrainWriters || state.awaitDrainWriters.size === 0) &&
|
|
|
|
src.listenerCount("data")
|
|
|
|
) {
|
|
|
|
src.resume();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
Readable.prototype.unpipe = function (dest) {
|
|
|
|
const state = this._readableState;
|
|
|
|
const unpipeInfo = {
|
|
|
|
hasUnpiped: false,
|
|
|
|
};
|
|
|
|
if (state.pipes.length === 0) {
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
if (!dest) {
|
|
|
|
const dests = state.pipes;
|
|
|
|
state.pipes = [];
|
|
|
|
this.pause();
|
|
|
|
for (let i = 0; i < dests.length; i++) {
|
|
|
|
dests[i].emit("unpipe", this, {
|
|
|
|
hasUnpiped: false,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
const index = ArrayPrototypeIndexOf(state.pipes, dest);
|
|
|
|
if (index === -1) {
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
state.pipes.splice(index, 1);
|
|
|
|
if (state.pipes.length === 0) {
|
|
|
|
this.pause();
|
|
|
|
}
|
|
|
|
dest.emit("unpipe", this, unpipeInfo);
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
Readable.prototype.on = function (ev, fn) {
|
|
|
|
const res = Stream.prototype.on.call(this, ev, fn);
|
|
|
|
const state = this._readableState;
|
|
|
|
if (ev === "data") {
|
|
|
|
state.readableListening = this.listenerCount("readable") > 0;
|
|
|
|
if (state.flowing !== false) {
|
|
|
|
this.resume();
|
|
|
|
}
|
|
|
|
} else if (ev === "readable") {
|
|
|
|
if (!state.endEmitted && !state.readableListening) {
|
|
|
|
state.readableListening = state.needReadable = true;
|
|
|
|
state.flowing = false;
|
|
|
|
state.emittedReadable = false;
|
|
|
|
debug("on readable", state.length, state.reading);
|
|
|
|
if (state.length) {
|
|
|
|
emitReadable(this);
|
|
|
|
} else if (!state.reading) {
|
|
|
|
process.nextTick(nReadingNextTick, this);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return res;
|
|
|
|
};
|
|
|
|
Readable.prototype.addListener = Readable.prototype.on;
|
|
|
|
Readable.prototype.removeListener = function (ev, fn) {
|
|
|
|
const res = Stream.prototype.removeListener.call(this, ev, fn);
|
|
|
|
if (ev === "readable") {
|
|
|
|
process.nextTick(updateReadableListening, this);
|
|
|
|
}
|
|
|
|
return res;
|
|
|
|
};
|
|
|
|
Readable.prototype.off = Readable.prototype.removeListener;
|
|
|
|
Readable.prototype.removeAllListeners = function (ev) {
|
|
|
|
const res = Stream.prototype.removeAllListeners.apply(this, arguments);
|
|
|
|
if (ev === "readable" || ev === void 0) {
|
|
|
|
process.nextTick(updateReadableListening, this);
|
|
|
|
}
|
|
|
|
return res;
|
|
|
|
};
|
|
|
|
function updateReadableListening(self2) {
|
|
|
|
const state = self2._readableState;
|
|
|
|
state.readableListening = self2.listenerCount("readable") > 0;
|
|
|
|
if (state.resumeScheduled && state[kPaused] === false) {
|
|
|
|
state.flowing = true;
|
|
|
|
} else if (self2.listenerCount("data") > 0) {
|
|
|
|
self2.resume();
|
|
|
|
} else if (!state.readableListening) {
|
|
|
|
state.flowing = null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function nReadingNextTick(self2) {
|
|
|
|
debug("readable nexttick read 0");
|
|
|
|
self2.read(0);
|
|
|
|
}
|
|
|
|
Readable.prototype.resume = function () {
|
|
|
|
const state = this._readableState;
|
|
|
|
if (!state.flowing) {
|
|
|
|
debug("resume");
|
|
|
|
state.flowing = !state.readableListening;
|
|
|
|
resume(this, state);
|
|
|
|
}
|
|
|
|
state[kPaused] = false;
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
function resume(stream, state) {
|
|
|
|
if (!state.resumeScheduled) {
|
|
|
|
state.resumeScheduled = true;
|
|
|
|
process.nextTick(resume_, stream, state);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function resume_(stream, state) {
|
|
|
|
debug("resume", state.reading);
|
|
|
|
if (!state.reading) {
|
|
|
|
stream.read(0);
|
|
|
|
}
|
|
|
|
state.resumeScheduled = false;
|
|
|
|
stream.emit("resume");
|
|
|
|
flow(stream);
|
|
|
|
if (state.flowing && !state.reading) {
|
|
|
|
stream.read(0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Readable.prototype.pause = function () {
|
|
|
|
debug("call pause flowing=%j", this._readableState.flowing);
|
|
|
|
if (this._readableState.flowing !== false) {
|
|
|
|
debug("pause");
|
|
|
|
this._readableState.flowing = false;
|
|
|
|
this.emit("pause");
|
|
|
|
}
|
|
|
|
this._readableState[kPaused] = true;
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
function flow(stream) {
|
|
|
|
const state = stream._readableState;
|
|
|
|
debug("flow", state.flowing);
|
|
|
|
while (state.flowing && stream.read() !== null);
|
|
|
|
}
|
|
|
|
Readable.prototype.wrap = function (stream) {
|
|
|
|
let paused = false;
|
|
|
|
stream.on("data", (chunk) => {
|
|
|
|
if (!this.push(chunk) && stream.pause) {
|
|
|
|
paused = true;
|
|
|
|
stream.pause();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
stream.on("end", () => {
|
|
|
|
this.push(null);
|
|
|
|
});
|
|
|
|
stream.on("error", (err) => {
|
|
|
|
errorOrDestroy(this, err);
|
|
|
|
});
|
|
|
|
stream.on("close", () => {
|
|
|
|
this.destroy();
|
|
|
|
});
|
|
|
|
stream.on("destroy", () => {
|
|
|
|
this.destroy();
|
|
|
|
});
|
|
|
|
this._read = () => {
|
|
|
|
if (paused && stream.resume) {
|
|
|
|
paused = false;
|
|
|
|
stream.resume();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
const streamKeys = ObjectKeys(stream);
|
|
|
|
for (let j = 1; j < streamKeys.length; j++) {
|
|
|
|
const i = streamKeys[j];
|
|
|
|
if (this[i] === void 0 && typeof stream[i] === "function") {
|
|
|
|
this[i] = stream[i].bind(stream);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
Readable.prototype[SymbolAsyncIterator] = function () {
|
|
|
|
return streamToAsyncIterator(this);
|
|
|
|
};
|
|
|
|
Readable.prototype.iterator = function (options) {
|
|
|
|
if (options !== void 0) {
|
|
|
|
validateObject(options, "options");
|
|
|
|
}
|
|
|
|
return streamToAsyncIterator(this, options);
|
|
|
|
};
|
|
|
|
function streamToAsyncIterator(stream, options) {
|
|
|
|
if (typeof stream.read !== "function") {
|
|
|
|
stream = Readable.wrap(stream, {
|
|
|
|
objectMode: true,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
const iter = createAsyncIterator(stream, options);
|
|
|
|
iter.stream = stream;
|
|
|
|
return iter;
|
|
|
|
}
|
|
|
|
async function* createAsyncIterator(stream, options) {
|
|
|
|
let callback = nop;
|
|
|
|
function next(resolve) {
|
|
|
|
if (this === stream) {
|
|
|
|
callback();
|
|
|
|
callback = nop;
|
|
|
|
} else {
|
|
|
|
callback = resolve;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
stream.on("readable", next);
|
|
|
|
let error;
|
|
|
|
const cleanup = eos(
|
|
|
|
stream,
|
|
|
|
{
|
|
|
|
writable: false,
|
|
|
|
},
|
|
|
|
(err) => {
|
|
|
|
error = err ? aggregateTwoErrors(error, err) : null;
|
|
|
|
callback();
|
|
|
|
callback = nop;
|
|
|
|
},
|
|
|
|
);
|
|
|
|
try {
|
|
|
|
while (true) {
|
|
|
|
const chunk = stream.destroyed ? null : stream.read();
|
|
|
|
if (chunk !== null) {
|
|
|
|
yield chunk;
|
|
|
|
} else if (error) {
|
|
|
|
throw error;
|
|
|
|
} else if (error === null) {
|
|
|
|
return;
|
|
|
|
} else {
|
|
|
|
await new Promise2(next);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} catch (err) {
|
|
|
|
error = aggregateTwoErrors(error, err);
|
|
|
|
throw error;
|
|
|
|
} finally {
|
|
|
|
if (
|
|
|
|
(error ||
|
|
|
|
(options === null || options === void 0
|
|
|
|
? void 0
|
|
|
|
: options.destroyOnReturn) !== false) &&
|
|
|
|
(error === void 0 || stream._readableState.autoDestroy)
|
|
|
|
) {
|
|
|
|
destroyImpl.destroyer(stream, null);
|
|
|
|
} else {
|
|
|
|
stream.off("readable", next);
|
|
|
|
cleanup();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
ObjectDefineProperties(Readable.prototype, {
|
|
|
|
readable: {
|
|
|
|
__proto__: null,
|
|
|
|
get() {
|
|
|
|
const r = this._readableState;
|
|
|
|
return !!r && r.readable !== false && !r.destroyed &&
|
|
|
|
!r.errorEmitted && !r.endEmitted;
|
|
|
|
},
|
|
|
|
set(val) {
|
|
|
|
if (this._readableState) {
|
|
|
|
this._readableState.readable = !!val;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
},
|
|
|
|
readableDidRead: {
|
|
|
|
__proto__: null,
|
|
|
|
enumerable: false,
|
|
|
|
get: function () {
|
|
|
|
return this._readableState.dataEmitted;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
readableAborted: {
|
|
|
|
__proto__: null,
|
|
|
|
enumerable: false,
|
|
|
|
get: function () {
|
|
|
|
return !!(this._readableState.readable !== false &&
|
|
|
|
(this._readableState.destroyed || this._readableState.errored) &&
|
|
|
|
!this._readableState.endEmitted);
|
|
|
|
},
|
|
|
|
},
|
|
|
|
readableHighWaterMark: {
|
|
|
|
__proto__: null,
|
|
|
|
enumerable: false,
|
|
|
|
get: function () {
|
|
|
|
return this._readableState.highWaterMark;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
readableBuffer: {
|
|
|
|
__proto__: null,
|
|
|
|
enumerable: false,
|
|
|
|
get: function () {
|
|
|
|
return this._readableState && this._readableState.buffer;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
readableFlowing: {
|
|
|
|
__proto__: null,
|
|
|
|
enumerable: false,
|
|
|
|
get: function () {
|
|
|
|
return this._readableState.flowing;
|
|
|
|
},
|
|
|
|
set: function (state) {
|
|
|
|
if (this._readableState) {
|
|
|
|
this._readableState.flowing = state;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
},
|
|
|
|
readableLength: {
|
|
|
|
__proto__: null,
|
|
|
|
enumerable: false,
|
|
|
|
get() {
|
|
|
|
return this._readableState.length;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
readableObjectMode: {
|
|
|
|
__proto__: null,
|
|
|
|
enumerable: false,
|
|
|
|
get() {
|
|
|
|
return this._readableState ? this._readableState.objectMode : false;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
readableEncoding: {
|
|
|
|
__proto__: null,
|
|
|
|
enumerable: false,
|
|
|
|
get() {
|
|
|
|
return this._readableState ? this._readableState.encoding : null;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
errored: {
|
|
|
|
__proto__: null,
|
|
|
|
enumerable: false,
|
|
|
|
get() {
|
|
|
|
return this._readableState ? this._readableState.errored : null;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
closed: {
|
|
|
|
__proto__: null,
|
|
|
|
get() {
|
|
|
|
return this._readableState ? this._readableState.closed : false;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
destroyed: {
|
|
|
|
__proto__: null,
|
|
|
|
enumerable: false,
|
|
|
|
get() {
|
|
|
|
return this._readableState ? this._readableState.destroyed : false;
|
|
|
|
},
|
|
|
|
set(value) {
|
|
|
|
if (!this._readableState) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
this._readableState.destroyed = value;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
readableEnded: {
|
|
|
|
__proto__: null,
|
|
|
|
enumerable: false,
|
|
|
|
get() {
|
|
|
|
return this._readableState ? this._readableState.endEmitted : false;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
});
|
|
|
|
ObjectDefineProperties(ReadableState.prototype, {
|
|
|
|
// Legacy getter for `pipesCount`.
|
|
|
|
pipesCount: {
|
|
|
|
__proto__: null,
|
|
|
|
get() {
|
|
|
|
return this.pipes.length;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
// Legacy property for `paused`.
|
|
|
|
paused: {
|
|
|
|
__proto__: null,
|
|
|
|
get() {
|
|
|
|
return this[kPaused] !== false;
|
|
|
|
},
|
|
|
|
set(value) {
|
|
|
|
this[kPaused] = !!value;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
});
|
|
|
|
Readable._fromList = fromList;
|
|
|
|
function fromList(n, state) {
|
|
|
|
if (state.length === 0) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
let ret;
|
|
|
|
if (state.objectMode) {
|
|
|
|
ret = state.buffer.shift();
|
|
|
|
} else if (!n || n >= state.length) {
|
|
|
|
if (state.decoder) {
|
|
|
|
ret = state.buffer.join("");
|
|
|
|
} else if (state.buffer.length === 1) {
|
|
|
|
ret = state.buffer.first();
|
|
|
|
} else {
|
|
|
|
ret = state.buffer.concat(state.length);
|
|
|
|
}
|
|
|
|
state.buffer.clear();
|
|
|
|
} else {
|
|
|
|
ret = state.buffer.consume(n, state.decoder);
|
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
function endReadable(stream) {
|
|
|
|
const state = stream._readableState;
|
|
|
|
debug("endReadable", state.endEmitted);
|
|
|
|
if (!state.endEmitted) {
|
|
|
|
state.ended = true;
|
|
|
|
process.nextTick(endReadableNT, state, stream);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function endReadableNT(state, stream) {
|
|
|
|
debug("endReadableNT", state.endEmitted, state.length);
|
|
|
|
if (
|
|
|
|
!state.errored && !state.closeEmitted && !state.endEmitted &&
|
|
|
|
state.length === 0
|
|
|
|
) {
|
|
|
|
state.endEmitted = true;
|
|
|
|
stream.emit("end");
|
|
|
|
if (stream.writable && stream.allowHalfOpen === false) {
|
|
|
|
process.nextTick(endWritableNT, stream);
|
|
|
|
} else if (state.autoDestroy) {
|
|
|
|
const wState = stream._writableState;
|
|
|
|
const autoDestroy = !wState || wState.autoDestroy && // We don't expect the writable to ever 'finish'
|
|
|
|
// if writable is explicitly set to false.
|
|
|
|
(wState.finished || wState.writable === false);
|
|
|
|
if (autoDestroy) {
|
|
|
|
stream.destroy();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function endWritableNT(stream) {
|
|
|
|
const writable = stream.writable && !stream.writableEnded &&
|
|
|
|
!stream.destroyed;
|
|
|
|
if (writable) {
|
|
|
|
stream.end();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Readable.from = function (iterable, opts) {
|
|
|
|
return from(Readable, iterable, opts);
|
|
|
|
};
|
|
|
|
var webStreamsAdapters;
|
|
|
|
function lazyWebStreams() {
|
|
|
|
if (webStreamsAdapters === void 0) {
|
|
|
|
webStreamsAdapters = {};
|
|
|
|
}
|
|
|
|
return webStreamsAdapters;
|
|
|
|
}
|
|
|
|
Readable.fromWeb = function (readableStream, options) {
|
|
|
|
return lazyWebStreams().newStreamReadableFromReadableStream(
|
|
|
|
readableStream,
|
|
|
|
options,
|
|
|
|
);
|
|
|
|
};
|
|
|
|
Readable.toWeb = function (streamReadable, options) {
|
|
|
|
return lazyWebStreams().newReadableStreamFromStreamReadable(
|
|
|
|
streamReadable,
|
|
|
|
options,
|
|
|
|
);
|
|
|
|
};
|
|
|
|
Readable.wrap = function (src, options) {
|
|
|
|
var _ref, _src$readableObjectMo;
|
|
|
|
return new Readable({
|
|
|
|
objectMode:
|
|
|
|
(_ref = (_src$readableObjectMo = src.readableObjectMode) !== null &&
|
|
|
|
_src$readableObjectMo !== void 0
|
|
|
|
? _src$readableObjectMo
|
|
|
|
: src.objectMode) !== null && _ref !== void 0
|
|
|
|
? _ref
|
|
|
|
: true,
|
|
|
|
...options,
|
|
|
|
destroy(err, callback) {
|
|
|
|
destroyImpl.destroyer(src, err);
|
|
|
|
callback(err);
|
|
|
|
},
|
|
|
|
}).wrap(src);
|
|
|
|
};
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
// lib/internal/streams/writable.js
|
|
|
|
var require_writable = __commonJS({
|
|
|
|
"lib/internal/streams/writable.js"(exports, module) {
|
|
|
|
var process = require_browser2();
|
|
|
|
var {
|
|
|
|
ArrayPrototypeSlice,
|
|
|
|
Error: Error2,
|
|
|
|
FunctionPrototypeSymbolHasInstance,
|
|
|
|
ObjectDefineProperty,
|
|
|
|
ObjectDefineProperties,
|
|
|
|
ObjectSetPrototypeOf,
|
|
|
|
StringPrototypeToLowerCase,
|
|
|
|
Symbol: Symbol2,
|
|
|
|
SymbolHasInstance,
|
|
|
|
} = require_primordials();
|
|
|
|
module.exports = Writable;
|
|
|
|
Writable.WritableState = WritableState;
|
|
|
|
var { EventEmitter: EE } = require_events();
|
|
|
|
var Stream = require_legacy().Stream;
|
|
|
|
var { Buffer: Buffer2 } = require_buffer();
|
|
|
|
var destroyImpl = require_destroy();
|
|
|
|
var { addAbortSignal } = require_add_abort_signal();
|
|
|
|
var { getHighWaterMark, getDefaultHighWaterMark } = require_state();
|
|
|
|
var { errorOrDestroy } = destroyImpl;
|
|
|
|
ObjectSetPrototypeOf(Writable.prototype, Stream.prototype);
|
|
|
|
ObjectSetPrototypeOf(Writable, Stream);
|
|
|
|
function nop() {
|
|
|
|
}
|
|
|
|
var kOnFinished = Symbol2("kOnFinished");
|
|
|
|
function WritableState(options, stream, isDuplex) {
|
|
|
|
if (typeof isDuplex !== "boolean") {
|
|
|
|
isDuplex = stream instanceof require_duplex();
|
|
|
|
}
|
|
|
|
this.objectMode = !!(options && options.objectMode);
|
|
|
|
if (isDuplex) {
|
|
|
|
this.objectMode = this.objectMode ||
|
|
|
|
!!(options && options.writableObjectMode);
|
|
|
|
}
|
|
|
|
this.highWaterMark = options
|
|
|
|
? getHighWaterMark(this, options, "writableHighWaterMark", isDuplex)
|
|
|
|
: getDefaultHighWaterMark(false);
|
|
|
|
this.finalCalled = false;
|
|
|
|
this.needDrain = false;
|
|
|
|
this.ending = false;
|
|
|
|
this.ended = false;
|
|
|
|
this.finished = false;
|
|
|
|
this.destroyed = false;
|
|
|
|
const noDecode = !!(options && options.decodeStrings === false);
|
|
|
|
this.decodeStrings = !noDecode;
|
2024-06-11 07:41:44 -04:00
|
|
|
const defaultEncoding = options?.defaultEncoding;
|
|
|
|
if (defaultEncoding == null) {
|
|
|
|
this.defaultEncoding = 'utf8';
|
|
|
|
} else if (Buffer2.isEncoding(defaultEncoding)) {
|
|
|
|
this.defaultEncoding = defaultEncoding;
|
|
|
|
} else {
|
|
|
|
throw new ERR_UNKNOWN_ENCODING(defaultEncoding);
|
|
|
|
}
|
2023-05-10 06:30:02 -04:00
|
|
|
this.length = 0;
|
|
|
|
this.writing = false;
|
|
|
|
this.corked = 0;
|
|
|
|
this.sync = true;
|
|
|
|
this.bufferProcessing = false;
|
|
|
|
this.onwrite = onwrite.bind(void 0, stream);
|
|
|
|
this.writecb = null;
|
|
|
|
this.writelen = 0;
|
|
|
|
this.afterWriteTickInfo = null;
|
|
|
|
resetBuffer(this);
|
|
|
|
this.pendingcb = 0;
|
|
|
|
this.constructed = true;
|
|
|
|
this.prefinished = false;
|
|
|
|
this.errorEmitted = false;
|
|
|
|
this.emitClose = !options || options.emitClose !== false;
|
|
|
|
this.autoDestroy = !options || options.autoDestroy !== false;
|
|
|
|
this.errored = null;
|
|
|
|
this.closed = false;
|
|
|
|
this.closeEmitted = false;
|
|
|
|
this[kOnFinished] = [];
|
|
|
|
}
|
|
|
|
function resetBuffer(state) {
|
|
|
|
state.buffered = [];
|
|
|
|
state.bufferedIndex = 0;
|
|
|
|
state.allBuffers = true;
|
|
|
|
state.allNoop = true;
|
|
|
|
}
|
|
|
|
WritableState.prototype.getBuffer = function getBuffer() {
|
|
|
|
return ArrayPrototypeSlice(this.buffered, this.bufferedIndex);
|
|
|
|
};
|
|
|
|
ObjectDefineProperty(WritableState.prototype, "bufferedRequestCount", {
|
|
|
|
__proto__: null,
|
|
|
|
get() {
|
|
|
|
return this.buffered.length - this.bufferedIndex;
|
|
|
|
},
|
|
|
|
});
|
|
|
|
function Writable(options) {
|
|
|
|
const isDuplex = this instanceof require_duplex();
|
|
|
|
if (!isDuplex && !FunctionPrototypeSymbolHasInstance(Writable, this)) {
|
|
|
|
return new Writable(options);
|
|
|
|
}
|
|
|
|
this._writableState = new WritableState(options, this, isDuplex);
|
|
|
|
if (options) {
|
|
|
|
if (typeof options.write === "function") {
|
|
|
|
this._write = options.write;
|
|
|
|
}
|
|
|
|
if (typeof options.writev === "function") {
|
|
|
|
this._writev = options.writev;
|
|
|
|
}
|
|
|
|
if (typeof options.destroy === "function") {
|
|
|
|
this._destroy = options.destroy;
|
|
|
|
}
|
|
|
|
if (typeof options.final === "function") {
|
|
|
|
this._final = options.final;
|
|
|
|
}
|
|
|
|
if (typeof options.construct === "function") {
|
|
|
|
this._construct = options.construct;
|
|
|
|
}
|
|
|
|
if (options.signal) {
|
|
|
|
addAbortSignal(options.signal, this);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Stream.call(this, options);
|
|
|
|
destroyImpl.construct(this, () => {
|
|
|
|
const state = this._writableState;
|
|
|
|
if (!state.writing) {
|
|
|
|
clearBuffer(this, state);
|
|
|
|
}
|
|
|
|
finishMaybe(this, state);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
ObjectDefineProperty(Writable, SymbolHasInstance, {
|
|
|
|
__proto__: null,
|
|
|
|
value: function (object) {
|
|
|
|
if (FunctionPrototypeSymbolHasInstance(this, object)) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
if (this !== Writable) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return object && object._writableState instanceof WritableState;
|
|
|
|
},
|
|
|
|
});
|
|
|
|
Writable.prototype.pipe = function () {
|
|
|
|
errorOrDestroy(this, new ERR_STREAM_CANNOT_PIPE());
|
|
|
|
};
|
|
|
|
function _write(stream, chunk, encoding, cb) {
|
|
|
|
const state = stream._writableState;
|
|
|
|
if (typeof encoding === "function") {
|
|
|
|
cb = encoding;
|
2024-06-11 07:41:44 -04:00
|
|
|
// Simulates https://github.com/nodejs/node/commit/dbed0319ac438dcbd6e92483f3280b1dc6767e00
|
|
|
|
encoding = state.objectMode ? undefined : state.defaultEncoding;
|
2023-05-10 06:30:02 -04:00
|
|
|
} else {
|
|
|
|
if (!encoding) {
|
2024-06-11 07:41:44 -04:00
|
|
|
// Simulates https://github.com/nodejs/node/commit/dbed0319ac438dcbd6e92483f3280b1dc6767e00
|
|
|
|
encoding = state.objectMode ? undefined : state.defaultEncoding;
|
2023-05-10 06:30:02 -04:00
|
|
|
} else if (encoding !== "buffer" && !Buffer2.isEncoding(encoding)) {
|
|
|
|
throw new ERR_UNKNOWN_ENCODING(encoding);
|
|
|
|
}
|
|
|
|
if (typeof cb !== "function") {
|
|
|
|
cb = nop;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (chunk === null) {
|
|
|
|
throw new ERR_STREAM_NULL_VALUES();
|
|
|
|
} else if (!state.objectMode) {
|
|
|
|
if (typeof chunk === "string") {
|
|
|
|
if (state.decodeStrings !== false) {
|
|
|
|
chunk = Buffer2.from(chunk, encoding);
|
|
|
|
encoding = "buffer";
|
|
|
|
}
|
|
|
|
} else if (chunk instanceof Buffer2) {
|
|
|
|
encoding = "buffer";
|
|
|
|
} else if (Stream._isUint8Array(chunk)) {
|
|
|
|
chunk = Stream._uint8ArrayToBuffer(chunk);
|
|
|
|
encoding = "buffer";
|
|
|
|
} else {
|
|
|
|
throw new ERR_INVALID_ARG_TYPE("chunk", [
|
|
|
|
"string",
|
|
|
|
"Buffer",
|
|
|
|
"Uint8Array",
|
|
|
|
], chunk);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
let err;
|
|
|
|
if (state.ending) {
|
|
|
|
err = new ERR_STREAM_WRITE_AFTER_END();
|
|
|
|
} else if (state.destroyed) {
|
|
|
|
err = new ERR_STREAM_DESTROYED("write");
|
|
|
|
}
|
|
|
|
if (err) {
|
|
|
|
process.nextTick(cb, err);
|
|
|
|
errorOrDestroy(stream, err, true);
|
|
|
|
return err;
|
|
|
|
}
|
|
|
|
state.pendingcb++;
|
|
|
|
return writeOrBuffer(stream, state, chunk, encoding, cb);
|
|
|
|
}
|
|
|
|
Writable.prototype.write = function (chunk, encoding, cb) {
|
|
|
|
return _write(this, chunk, encoding, cb) === true;
|
|
|
|
};
|
|
|
|
Writable.prototype.cork = function () {
|
|
|
|
this._writableState.corked++;
|
|
|
|
};
|
|
|
|
Writable.prototype.uncork = function () {
|
|
|
|
const state = this._writableState;
|
|
|
|
if (state.corked) {
|
|
|
|
state.corked--;
|
|
|
|
if (!state.writing) {
|
|
|
|
clearBuffer(this, state);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
Writable.prototype.setDefaultEncoding = function setDefaultEncoding(
|
|
|
|
encoding,
|
|
|
|
) {
|
|
|
|
if (typeof encoding === "string") {
|
|
|
|
encoding = StringPrototypeToLowerCase(encoding);
|
|
|
|
}
|
|
|
|
if (!Buffer2.isEncoding(encoding)) {
|
|
|
|
throw new ERR_UNKNOWN_ENCODING(encoding);
|
|
|
|
}
|
|
|
|
this._writableState.defaultEncoding = encoding;
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
function writeOrBuffer(stream, state, chunk, encoding, callback) {
|
|
|
|
const len = state.objectMode ? 1 : chunk.length;
|
|
|
|
state.length += len;
|
|
|
|
const ret = state.length < state.highWaterMark;
|
|
|
|
if (!ret) {
|
|
|
|
state.needDrain = true;
|
|
|
|
}
|
|
|
|
if (
|
|
|
|
state.writing || state.corked || state.errored || !state.constructed
|
|
|
|
) {
|
|
|
|
state.buffered.push({
|
|
|
|
chunk,
|
|
|
|
encoding,
|
|
|
|
callback,
|
|
|
|
});
|
|
|
|
if (state.allBuffers && encoding !== "buffer") {
|
|
|
|
state.allBuffers = false;
|
|
|
|
}
|
|
|
|
if (state.allNoop && callback !== nop) {
|
|
|
|
state.allNoop = false;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
state.writelen = len;
|
|
|
|
state.writecb = callback;
|
|
|
|
state.writing = true;
|
|
|
|
state.sync = true;
|
|
|
|
stream._write(chunk, encoding, state.onwrite);
|
|
|
|
state.sync = false;
|
|
|
|
}
|
|
|
|
return ret && !state.errored && !state.destroyed;
|
|
|
|
}
|
|
|
|
function doWrite(stream, state, writev, len, chunk, encoding, cb) {
|
|
|
|
state.writelen = len;
|
|
|
|
state.writecb = cb;
|
|
|
|
state.writing = true;
|
|
|
|
state.sync = true;
|
|
|
|
if (state.destroyed) {
|
|
|
|
state.onwrite(new ERR_STREAM_DESTROYED("write"));
|
|
|
|
} else if (writev) {
|
|
|
|
stream._writev(chunk, state.onwrite);
|
|
|
|
} else {
|
|
|
|
stream._write(chunk, encoding, state.onwrite);
|
|
|
|
}
|
|
|
|
state.sync = false;
|
|
|
|
}
|
|
|
|
function onwriteError(stream, state, er, cb) {
|
|
|
|
--state.pendingcb;
|
|
|
|
cb(er);
|
|
|
|
errorBuffer(state);
|
|
|
|
errorOrDestroy(stream, er);
|
|
|
|
}
|
|
|
|
function onwrite(stream, er) {
|
|
|
|
const state = stream._writableState;
|
|
|
|
const sync = state.sync;
|
|
|
|
const cb = state.writecb;
|
|
|
|
if (typeof cb !== "function") {
|
|
|
|
errorOrDestroy(stream, new ERR_MULTIPLE_CALLBACK());
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
state.writing = false;
|
|
|
|
state.writecb = null;
|
|
|
|
state.length -= state.writelen;
|
|
|
|
state.writelen = 0;
|
|
|
|
if (er) {
|
|
|
|
er.stack;
|
|
|
|
if (!state.errored) {
|
|
|
|
state.errored = er;
|
|
|
|
}
|
|
|
|
if (stream._readableState && !stream._readableState.errored) {
|
|
|
|
stream._readableState.errored = er;
|
|
|
|
}
|
|
|
|
if (sync) {
|
|
|
|
process.nextTick(onwriteError, stream, state, er, cb);
|
|
|
|
} else {
|
|
|
|
onwriteError(stream, state, er, cb);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (state.buffered.length > state.bufferedIndex) {
|
|
|
|
clearBuffer(stream, state);
|
|
|
|
}
|
|
|
|
if (sync) {
|
|
|
|
if (
|
|
|
|
state.afterWriteTickInfo !== null &&
|
|
|
|
state.afterWriteTickInfo.cb === cb
|
|
|
|
) {
|
|
|
|
state.afterWriteTickInfo.count++;
|
|
|
|
} else {
|
|
|
|
state.afterWriteTickInfo = {
|
|
|
|
count: 1,
|
|
|
|
cb,
|
|
|
|
stream,
|
|
|
|
state,
|
|
|
|
};
|
|
|
|
process.nextTick(afterWriteTick, state.afterWriteTickInfo);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
afterWrite(stream, state, 1, cb);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function afterWriteTick({ stream, state, count, cb }) {
|
|
|
|
state.afterWriteTickInfo = null;
|
|
|
|
return afterWrite(stream, state, count, cb);
|
|
|
|
}
|
|
|
|
function afterWrite(stream, state, count, cb) {
|
|
|
|
const needDrain = !state.ending && !stream.destroyed &&
|
|
|
|
state.length === 0 && state.needDrain;
|
|
|
|
if (needDrain) {
|
|
|
|
state.needDrain = false;
|
|
|
|
stream.emit("drain");
|
|
|
|
}
|
|
|
|
while (count-- > 0) {
|
|
|
|
state.pendingcb--;
|
2024-06-11 07:41:44 -04:00
|
|
|
cb(null);
|
2023-05-10 06:30:02 -04:00
|
|
|
}
|
|
|
|
if (state.destroyed) {
|
|
|
|
errorBuffer(state);
|
|
|
|
}
|
|
|
|
finishMaybe(stream, state);
|
|
|
|
}
|
|
|
|
function errorBuffer(state) {
|
|
|
|
if (state.writing) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
for (let n = state.bufferedIndex; n < state.buffered.length; ++n) {
|
|
|
|
var _state$errored;
|
|
|
|
const { chunk, callback } = state.buffered[n];
|
|
|
|
const len = state.objectMode ? 1 : chunk.length;
|
|
|
|
state.length -= len;
|
|
|
|
callback(
|
|
|
|
(_state$errored = state.errored) !== null && _state$errored !== void 0
|
|
|
|
? _state$errored
|
|
|
|
: new ERR_STREAM_DESTROYED("write"),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
const onfinishCallbacks = state[kOnFinished].splice(0);
|
|
|
|
for (let i = 0; i < onfinishCallbacks.length; i++) {
|
|
|
|
var _state$errored2;
|
|
|
|
onfinishCallbacks[i](
|
|
|
|
(_state$errored2 = state.errored) !== null &&
|
|
|
|
_state$errored2 !== void 0
|
|
|
|
? _state$errored2
|
|
|
|
: new ERR_STREAM_DESTROYED("end"),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
resetBuffer(state);
|
|
|
|
}
|
|
|
|
function clearBuffer(stream, state) {
|
|
|
|
if (
|
|
|
|
state.corked || state.bufferProcessing || state.destroyed ||
|
|
|
|
!state.constructed
|
|
|
|
) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
const { buffered, bufferedIndex, objectMode } = state;
|
|
|
|
const bufferedLength = buffered.length - bufferedIndex;
|
|
|
|
if (!bufferedLength) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
let i = bufferedIndex;
|
|
|
|
state.bufferProcessing = true;
|
|
|
|
if (bufferedLength > 1 && stream._writev) {
|
|
|
|
state.pendingcb -= bufferedLength - 1;
|
|
|
|
const callback = state.allNoop ? nop : (err) => {
|
|
|
|
for (let n = i; n < buffered.length; ++n) {
|
|
|
|
buffered[n].callback(err);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
const chunks = state.allNoop && i === 0
|
|
|
|
? buffered
|
|
|
|
: ArrayPrototypeSlice(buffered, i);
|
|
|
|
chunks.allBuffers = state.allBuffers;
|
|
|
|
doWrite(stream, state, true, state.length, chunks, "", callback);
|
|
|
|
resetBuffer(state);
|
|
|
|
} else {
|
|
|
|
do {
|
|
|
|
const { chunk, encoding, callback } = buffered[i];
|
|
|
|
buffered[i++] = null;
|
|
|
|
const len = objectMode ? 1 : chunk.length;
|
|
|
|
doWrite(stream, state, false, len, chunk, encoding, callback);
|
|
|
|
} while (i < buffered.length && !state.writing);
|
|
|
|
if (i === buffered.length) {
|
|
|
|
resetBuffer(state);
|
|
|
|
} else if (i > 256) {
|
|
|
|
buffered.splice(0, i);
|
|
|
|
state.bufferedIndex = 0;
|
|
|
|
} else {
|
|
|
|
state.bufferedIndex = i;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
state.bufferProcessing = false;
|
|
|
|
}
|
|
|
|
Writable.prototype._write = function (chunk, encoding, cb) {
|
|
|
|
if (this._writev) {
|
|
|
|
this._writev(
|
|
|
|
[
|
|
|
|
{
|
|
|
|
chunk,
|
|
|
|
encoding,
|
|
|
|
},
|
|
|
|
],
|
|
|
|
cb,
|
|
|
|
);
|
|
|
|
} else {
|
|
|
|
throw new ERR_METHOD_NOT_IMPLEMENTED("_write()");
|
|
|
|
}
|
|
|
|
};
|
|
|
|
Writable.prototype._writev = null;
|
|
|
|
Writable.prototype.end = function (chunk, encoding, cb) {
|
|
|
|
const state = this._writableState;
|
|
|
|
if (typeof chunk === "function") {
|
|
|
|
cb = chunk;
|
|
|
|
chunk = null;
|
|
|
|
encoding = null;
|
|
|
|
} else if (typeof encoding === "function") {
|
|
|
|
cb = encoding;
|
|
|
|
encoding = null;
|
|
|
|
}
|
|
|
|
let err;
|
|
|
|
if (chunk !== null && chunk !== void 0) {
|
|
|
|
const ret = _write(this, chunk, encoding);
|
|
|
|
if (ret instanceof Error2) {
|
|
|
|
err = ret;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (state.corked) {
|
|
|
|
state.corked = 1;
|
|
|
|
this.uncork();
|
|
|
|
}
|
|
|
|
if (err) {
|
|
|
|
} else if (!state.errored && !state.ending) {
|
|
|
|
state.ending = true;
|
|
|
|
finishMaybe(this, state, true);
|
|
|
|
state.ended = true;
|
|
|
|
} else if (state.finished) {
|
|
|
|
err = new ERR_STREAM_ALREADY_FINISHED("end");
|
|
|
|
} else if (state.destroyed) {
|
|
|
|
err = new ERR_STREAM_DESTROYED("end");
|
|
|
|
}
|
|
|
|
if (typeof cb === "function") {
|
2024-06-11 07:41:44 -04:00
|
|
|
if (err) {
|
2023-05-10 06:30:02 -04:00
|
|
|
process.nextTick(cb, err);
|
2024-06-11 07:41:44 -04:00
|
|
|
} else if (state.finished) {
|
|
|
|
process.nextTick(cb, null);
|
2023-05-10 06:30:02 -04:00
|
|
|
} else {
|
|
|
|
state[kOnFinished].push(cb);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
function needFinish(state) {
|
|
|
|
return state.ending && !state.destroyed && state.constructed &&
|
|
|
|
state.length === 0 && !state.errored && state.buffered.length === 0 &&
|
|
|
|
!state.finished && !state.writing && !state.errorEmitted &&
|
|
|
|
!state.closeEmitted;
|
|
|
|
}
|
|
|
|
function callFinal(stream, state) {
|
|
|
|
let called = false;
|
|
|
|
function onFinish(err) {
|
|
|
|
if (called) {
|
|
|
|
errorOrDestroy(
|
|
|
|
stream,
|
|
|
|
err !== null && err !== void 0 ? err : ERR_MULTIPLE_CALLBACK(),
|
|
|
|
);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
called = true;
|
|
|
|
state.pendingcb--;
|
|
|
|
if (err) {
|
|
|
|
const onfinishCallbacks = state[kOnFinished].splice(0);
|
|
|
|
for (let i = 0; i < onfinishCallbacks.length; i++) {
|
|
|
|
onfinishCallbacks[i](err);
|
|
|
|
}
|
|
|
|
errorOrDestroy(stream, err, state.sync);
|
|
|
|
} else if (needFinish(state)) {
|
|
|
|
state.prefinished = true;
|
|
|
|
stream.emit("prefinish");
|
|
|
|
state.pendingcb++;
|
|
|
|
process.nextTick(finish, stream, state);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
state.sync = true;
|
|
|
|
state.pendingcb++;
|
|
|
|
try {
|
|
|
|
stream._final(onFinish);
|
|
|
|
} catch (err) {
|
|
|
|
onFinish(err);
|
|
|
|
}
|
|
|
|
state.sync = false;
|
|
|
|
}
|
|
|
|
function prefinish(stream, state) {
|
|
|
|
if (!state.prefinished && !state.finalCalled) {
|
|
|
|
if (typeof stream._final === "function" && !state.destroyed) {
|
|
|
|
state.finalCalled = true;
|
|
|
|
callFinal(stream, state);
|
|
|
|
} else {
|
|
|
|
state.prefinished = true;
|
|
|
|
stream.emit("prefinish");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function finishMaybe(stream, state, sync) {
|
|
|
|
if (needFinish(state)) {
|
|
|
|
prefinish(stream, state);
|
|
|
|
if (state.pendingcb === 0) {
|
|
|
|
if (sync) {
|
|
|
|
state.pendingcb++;
|
|
|
|
process.nextTick(
|
|
|
|
(stream2, state2) => {
|
|
|
|
if (needFinish(state2)) {
|
|
|
|
finish(stream2, state2);
|
|
|
|
} else {
|
|
|
|
state2.pendingcb--;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
stream,
|
|
|
|
state,
|
|
|
|
);
|
|
|
|
} else if (needFinish(state)) {
|
|
|
|
state.pendingcb++;
|
|
|
|
finish(stream, state);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function finish(stream, state) {
|
|
|
|
state.pendingcb--;
|
|
|
|
state.finished = true;
|
|
|
|
const onfinishCallbacks = state[kOnFinished].splice(0);
|
|
|
|
for (let i = 0; i < onfinishCallbacks.length; i++) {
|
2024-06-11 07:41:44 -04:00
|
|
|
onfinishCallbacks[i](null);
|
2023-05-10 06:30:02 -04:00
|
|
|
}
|
|
|
|
stream.emit("finish");
|
|
|
|
if (state.autoDestroy) {
|
|
|
|
const rState = stream._readableState;
|
|
|
|
const autoDestroy = !rState || rState.autoDestroy && // We don't expect the readable to ever 'end'
|
|
|
|
// if readable is explicitly set to false.
|
|
|
|
(rState.endEmitted || rState.readable === false);
|
|
|
|
if (autoDestroy) {
|
|
|
|
stream.destroy();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
ObjectDefineProperties(Writable.prototype, {
|
|
|
|
closed: {
|
|
|
|
__proto__: null,
|
|
|
|
get() {
|
|
|
|
return this._writableState ? this._writableState.closed : false;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
destroyed: {
|
|
|
|
__proto__: null,
|
|
|
|
get() {
|
|
|
|
return this._writableState ? this._writableState.destroyed : false;
|
|
|
|
},
|
|
|
|
set(value) {
|
|
|
|
if (this._writableState) {
|
|
|
|
this._writableState.destroyed = value;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
},
|
|
|
|
writable: {
|
|
|
|
__proto__: null,
|
|
|
|
get() {
|
|
|
|
const w = this._writableState;
|
|
|
|
return !!w && w.writable !== false && !w.destroyed && !w.errored &&
|
|
|
|
!w.ending && !w.ended;
|
|
|
|
},
|
|
|
|
set(val) {
|
|
|
|
if (this._writableState) {
|
|
|
|
this._writableState.writable = !!val;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
},
|
|
|
|
writableFinished: {
|
|
|
|
__proto__: null,
|
|
|
|
get() {
|
|
|
|
return this._writableState ? this._writableState.finished : false;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
writableObjectMode: {
|
|
|
|
__proto__: null,
|
|
|
|
get() {
|
|
|
|
return this._writableState ? this._writableState.objectMode : false;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
writableBuffer: {
|
|
|
|
__proto__: null,
|
|
|
|
get() {
|
|
|
|
return this._writableState && this._writableState.getBuffer();
|
|
|
|
},
|
|
|
|
},
|
|
|
|
writableEnded: {
|
|
|
|
__proto__: null,
|
|
|
|
get() {
|
|
|
|
return this._writableState ? this._writableState.ending : false;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
writableNeedDrain: {
|
|
|
|
__proto__: null,
|
|
|
|
get() {
|
|
|
|
const wState = this._writableState;
|
|
|
|
if (!wState) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return !wState.destroyed && !wState.ending && wState.needDrain;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
writableHighWaterMark: {
|
|
|
|
__proto__: null,
|
|
|
|
get() {
|
|
|
|
return this._writableState && this._writableState.highWaterMark;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
writableCorked: {
|
|
|
|
__proto__: null,
|
|
|
|
get() {
|
|
|
|
return this._writableState ? this._writableState.corked : 0;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
writableLength: {
|
|
|
|
__proto__: null,
|
|
|
|
get() {
|
|
|
|
return this._writableState && this._writableState.length;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
errored: {
|
|
|
|
__proto__: null,
|
|
|
|
enumerable: false,
|
|
|
|
get() {
|
|
|
|
return this._writableState ? this._writableState.errored : null;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
writableAborted: {
|
|
|
|
__proto__: null,
|
|
|
|
enumerable: false,
|
|
|
|
get: function () {
|
|
|
|
return !!(this._writableState.writable !== false &&
|
|
|
|
(this._writableState.destroyed || this._writableState.errored) &&
|
|
|
|
!this._writableState.finished);
|
|
|
|
},
|
|
|
|
},
|
|
|
|
});
|
|
|
|
var destroy = destroyImpl.destroy;
|
|
|
|
Writable.prototype.destroy = function (err, cb) {
|
|
|
|
const state = this._writableState;
|
|
|
|
if (
|
|
|
|
!state.destroyed &&
|
|
|
|
(state.bufferedIndex < state.buffered.length ||
|
|
|
|
state[kOnFinished].length)
|
|
|
|
) {
|
|
|
|
process.nextTick(errorBuffer, state);
|
|
|
|
}
|
|
|
|
destroy.call(this, err, cb);
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
Writable.prototype._undestroy = destroyImpl.undestroy;
|
|
|
|
Writable.prototype._destroy = function (err, cb) {
|
|
|
|
cb(err);
|
|
|
|
};
|
|
|
|
Writable.prototype[EE.captureRejectionSymbol] = function (err) {
|
|
|
|
this.destroy(err);
|
|
|
|
};
|
|
|
|
var webStreamsAdapters;
|
|
|
|
function lazyWebStreams() {
|
|
|
|
if (webStreamsAdapters === void 0) {
|
|
|
|
webStreamsAdapters = {};
|
|
|
|
}
|
|
|
|
return webStreamsAdapters;
|
|
|
|
}
|
|
|
|
Writable.fromWeb = function (writableStream, options) {
|
|
|
|
return lazyWebStreams().newStreamWritableFromWritableStream(
|
|
|
|
writableStream,
|
|
|
|
options,
|
|
|
|
);
|
|
|
|
};
|
|
|
|
Writable.toWeb = function (streamWritable) {
|
|
|
|
return lazyWebStreams().newWritableStreamFromStreamWritable(
|
|
|
|
streamWritable,
|
|
|
|
);
|
|
|
|
};
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
// lib/internal/streams/duplexify.js
|
|
|
|
var require_duplexify = __commonJS({
|
|
|
|
"lib/internal/streams/duplexify.js"(exports, module) {
|
|
|
|
var process = require_browser2();
|
|
|
|
var bufferModule = require_buffer();
|
|
|
|
var {
|
|
|
|
isReadable,
|
|
|
|
isWritable,
|
|
|
|
isIterable,
|
|
|
|
isNodeStream,
|
|
|
|
isReadableNodeStream,
|
|
|
|
isWritableNodeStream,
|
|
|
|
isDuplexNodeStream,
|
|
|
|
} = require_utils();
|
|
|
|
var eos = require_end_of_stream();
|
|
|
|
var { destroyer } = require_destroy();
|
|
|
|
var Duplex = require_duplex();
|
|
|
|
var Readable = require_readable();
|
|
|
|
var from = require_from();
|
|
|
|
var isBlob = typeof Blob !== "undefined"
|
|
|
|
? function isBlob2(b) {
|
|
|
|
return b instanceof Blob;
|
|
|
|
}
|
|
|
|
: function isBlob2(b) {
|
|
|
|
return false;
|
|
|
|
};
|
|
|
|
var { FunctionPrototypeCall } = require_primordials();
|
|
|
|
var Duplexify = class extends Duplex {
|
|
|
|
constructor(options) {
|
|
|
|
super(options);
|
|
|
|
if (
|
|
|
|
(options === null || options === void 0
|
|
|
|
? void 0
|
|
|
|
: options.readable) === false
|
|
|
|
) {
|
|
|
|
this._readableState.readable = false;
|
|
|
|
this._readableState.ended = true;
|
|
|
|
this._readableState.endEmitted = true;
|
|
|
|
}
|
|
|
|
if (
|
|
|
|
(options === null || options === void 0
|
|
|
|
? void 0
|
|
|
|
: options.writable) === false
|
|
|
|
) {
|
|
|
|
this._writableState.writable = false;
|
|
|
|
this._writableState.ending = true;
|
|
|
|
this._writableState.ended = true;
|
|
|
|
this._writableState.finished = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
module.exports = function duplexify(body, name) {
|
|
|
|
if (isDuplexNodeStream(body)) {
|
|
|
|
return body;
|
|
|
|
}
|
|
|
|
if (isReadableNodeStream(body)) {
|
|
|
|
return _duplexify({
|
|
|
|
readable: body,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
if (isWritableNodeStream(body)) {
|
|
|
|
return _duplexify({
|
|
|
|
writable: body,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
if (isNodeStream(body)) {
|
|
|
|
return _duplexify({
|
|
|
|
writable: false,
|
|
|
|
readable: false,
|
|
|
|
});
|
|
|
|
}
|
2023-11-27 22:14:57 -05:00
|
|
|
|
2023-05-10 06:30:02 -04:00
|
|
|
if (typeof body === "function") {
|
|
|
|
const { value, write, final, destroy } = fromAsyncGen(body);
|
|
|
|
if (isIterable(value)) {
|
|
|
|
return from(Duplexify, value, {
|
|
|
|
// TODO (ronag): highWaterMark?
|
|
|
|
objectMode: true,
|
|
|
|
write,
|
|
|
|
final,
|
|
|
|
destroy,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
const then2 = value === null || value === void 0 ? void 0 : value.then;
|
|
|
|
if (typeof then2 === "function") {
|
|
|
|
let d;
|
|
|
|
const promise = FunctionPrototypeCall(
|
|
|
|
then2,
|
|
|
|
value,
|
|
|
|
(val) => {
|
|
|
|
if (val != null) {
|
|
|
|
throw new ERR_INVALID_RETURN_VALUE("nully", "body", val);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
(err) => {
|
|
|
|
destroyer(d, err);
|
|
|
|
},
|
|
|
|
);
|
|
|
|
return d = new Duplexify({
|
|
|
|
// TODO (ronag): highWaterMark?
|
|
|
|
objectMode: true,
|
|
|
|
readable: false,
|
|
|
|
write,
|
|
|
|
final(cb) {
|
|
|
|
final(async () => {
|
|
|
|
try {
|
|
|
|
await promise;
|
|
|
|
process.nextTick(cb, null);
|
|
|
|
} catch (err) {
|
|
|
|
process.nextTick(cb, err);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
},
|
|
|
|
destroy,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
throw new ERR_INVALID_RETURN_VALUE(
|
|
|
|
"Iterable, AsyncIterable or AsyncFunction",
|
|
|
|
name,
|
|
|
|
value,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
if (isBlob(body)) {
|
|
|
|
return duplexify(body.arrayBuffer());
|
|
|
|
}
|
|
|
|
if (isIterable(body)) {
|
|
|
|
return from(Duplexify, body, {
|
|
|
|
// TODO (ronag): highWaterMark?
|
|
|
|
objectMode: true,
|
|
|
|
writable: false,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
if (
|
|
|
|
typeof (body === null || body === void 0 ? void 0 : body.writable) ===
|
|
|
|
"object" ||
|
|
|
|
typeof (body === null || body === void 0 ? void 0 : body.readable) ===
|
|
|
|
"object"
|
|
|
|
) {
|
|
|
|
const readable = body !== null && body !== void 0 && body.readable
|
|
|
|
? isReadableNodeStream(
|
|
|
|
body === null || body === void 0 ? void 0 : body.readable,
|
|
|
|
)
|
|
|
|
? body === null || body === void 0 ? void 0 : body.readable
|
|
|
|
: duplexify(body.readable)
|
|
|
|
: void 0;
|
|
|
|
const writable = body !== null && body !== void 0 && body.writable
|
|
|
|
? isWritableNodeStream(
|
|
|
|
body === null || body === void 0 ? void 0 : body.writable,
|
|
|
|
)
|
|
|
|
? body === null || body === void 0 ? void 0 : body.writable
|
|
|
|
: duplexify(body.writable)
|
|
|
|
: void 0;
|
|
|
|
return _duplexify({
|
|
|
|
readable,
|
|
|
|
writable,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
const then = body === null || body === void 0 ? void 0 : body.then;
|
|
|
|
if (typeof then === "function") {
|
|
|
|
let d;
|
|
|
|
FunctionPrototypeCall(
|
|
|
|
then,
|
|
|
|
body,
|
|
|
|
(val) => {
|
|
|
|
if (val != null) {
|
|
|
|
d.push(val);
|
|
|
|
}
|
|
|
|
d.push(null);
|
|
|
|
},
|
|
|
|
(err) => {
|
|
|
|
destroyer(d, err);
|
|
|
|
},
|
|
|
|
);
|
|
|
|
return d = new Duplexify({
|
|
|
|
objectMode: true,
|
|
|
|
writable: false,
|
|
|
|
read() {
|
|
|
|
},
|
|
|
|
});
|
|
|
|
}
|
|
|
|
throw new ERR_INVALID_ARG_TYPE(
|
|
|
|
name,
|
|
|
|
[
|
|
|
|
"Blob",
|
|
|
|
"ReadableStream",
|
|
|
|
"WritableStream",
|
|
|
|
"Stream",
|
|
|
|
"Iterable",
|
|
|
|
"AsyncIterable",
|
|
|
|
"Function",
|
|
|
|
"{ readable, writable } pair",
|
|
|
|
"Promise",
|
|
|
|
],
|
|
|
|
body,
|
|
|
|
);
|
|
|
|
};
|
|
|
|
function fromAsyncGen(fn) {
|
|
|
|
let { promise, resolve } = createDeferredPromise();
|
|
|
|
const ac = new AbortController();
|
|
|
|
const signal = ac.signal;
|
|
|
|
const value = fn(
|
|
|
|
async function* () {
|
|
|
|
while (true) {
|
|
|
|
const _promise = promise;
|
|
|
|
promise = null;
|
|
|
|
const { chunk, done, cb } = await _promise;
|
|
|
|
process.nextTick(cb);
|
|
|
|
if (done) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (signal.aborted) {
|
|
|
|
throw new AbortError(void 0, {
|
|
|
|
cause: signal.reason,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
({ promise, resolve } = createDeferredPromise());
|
|
|
|
yield chunk;
|
|
|
|
}
|
|
|
|
}(),
|
|
|
|
{
|
|
|
|
signal,
|
|
|
|
},
|
|
|
|
);
|
|
|
|
return {
|
|
|
|
value,
|
|
|
|
write(chunk, encoding, cb) {
|
|
|
|
const _resolve = resolve;
|
|
|
|
resolve = null;
|
|
|
|
_resolve({
|
|
|
|
chunk,
|
|
|
|
done: false,
|
|
|
|
cb,
|
|
|
|
});
|
|
|
|
},
|
|
|
|
final(cb) {
|
|
|
|
const _resolve = resolve;
|
|
|
|
resolve = null;
|
|
|
|
_resolve({
|
|
|
|
done: true,
|
|
|
|
cb,
|
|
|
|
});
|
|
|
|
},
|
|
|
|
destroy(err, cb) {
|
|
|
|
ac.abort();
|
|
|
|
cb(err);
|
|
|
|
},
|
|
|
|
};
|
|
|
|
}
|
|
|
|
function _duplexify(pair) {
|
|
|
|
const r = pair.readable && typeof pair.readable.read !== "function"
|
|
|
|
? Readable.wrap(pair.readable)
|
|
|
|
: pair.readable;
|
|
|
|
const w = pair.writable;
|
|
|
|
let readable = !!isReadable(r);
|
|
|
|
let writable = !!isWritable(w);
|
|
|
|
let ondrain;
|
|
|
|
let onfinish;
|
|
|
|
let onreadable;
|
|
|
|
let onclose;
|
|
|
|
let d;
|
|
|
|
function onfinished(err) {
|
|
|
|
const cb = onclose;
|
|
|
|
onclose = null;
|
|
|
|
if (cb) {
|
|
|
|
cb(err);
|
|
|
|
} else if (err) {
|
|
|
|
d.destroy(err);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
d = new Duplexify({
|
|
|
|
// TODO (ronag): highWaterMark?
|
|
|
|
readableObjectMode:
|
|
|
|
!!(r !== null && r !== void 0 && r.readableObjectMode),
|
|
|
|
writableObjectMode:
|
|
|
|
!!(w !== null && w !== void 0 && w.writableObjectMode),
|
|
|
|
readable,
|
|
|
|
writable,
|
|
|
|
});
|
|
|
|
if (writable) {
|
|
|
|
eos(w, (err) => {
|
|
|
|
writable = false;
|
|
|
|
if (err) {
|
|
|
|
destroyer(r, err);
|
|
|
|
}
|
|
|
|
onfinished(err);
|
|
|
|
});
|
|
|
|
d._write = function (chunk, encoding, callback) {
|
|
|
|
if (w.write(chunk, encoding)) {
|
|
|
|
callback();
|
|
|
|
} else {
|
|
|
|
ondrain = callback;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
d._final = function (callback) {
|
|
|
|
w.end();
|
|
|
|
onfinish = callback;
|
|
|
|
};
|
|
|
|
w.on("drain", function () {
|
|
|
|
if (ondrain) {
|
|
|
|
const cb = ondrain;
|
|
|
|
ondrain = null;
|
|
|
|
cb();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
w.on("finish", function () {
|
|
|
|
if (onfinish) {
|
|
|
|
const cb = onfinish;
|
|
|
|
onfinish = null;
|
|
|
|
cb();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
if (readable) {
|
|
|
|
eos(r, (err) => {
|
|
|
|
readable = false;
|
|
|
|
if (err) {
|
|
|
|
destroyer(r, err);
|
|
|
|
}
|
|
|
|
onfinished(err);
|
|
|
|
});
|
|
|
|
r.on("readable", function () {
|
|
|
|
if (onreadable) {
|
|
|
|
const cb = onreadable;
|
|
|
|
onreadable = null;
|
|
|
|
cb();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
r.on("end", function () {
|
|
|
|
d.push(null);
|
|
|
|
});
|
|
|
|
d._read = function () {
|
|
|
|
while (true) {
|
|
|
|
const buf = r.read();
|
|
|
|
if (buf === null) {
|
|
|
|
onreadable = d._read;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (!d.push(buf)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
d._destroy = function (err, callback) {
|
|
|
|
if (!err && onclose !== null) {
|
|
|
|
err = new AbortError();
|
|
|
|
}
|
|
|
|
onreadable = null;
|
|
|
|
ondrain = null;
|
|
|
|
onfinish = null;
|
|
|
|
if (onclose === null) {
|
|
|
|
callback(err);
|
|
|
|
} else {
|
|
|
|
onclose = callback;
|
|
|
|
destroyer(w, err);
|
|
|
|
destroyer(r, err);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
return d;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
// lib/internal/streams/duplex.js
|
|
|
|
var require_duplex = __commonJS({
|
|
|
|
"lib/internal/streams/duplex.js"(exports, module) {
|
|
|
|
"use strict";
|
|
|
|
var {
|
|
|
|
ObjectDefineProperties,
|
|
|
|
ObjectGetOwnPropertyDescriptor,
|
|
|
|
ObjectKeys,
|
|
|
|
ObjectSetPrototypeOf,
|
|
|
|
} = require_primordials();
|
|
|
|
module.exports = Duplex;
|
|
|
|
var Readable = require_readable();
|
|
|
|
var Writable = require_writable();
|
|
|
|
ObjectSetPrototypeOf(Duplex.prototype, Readable.prototype);
|
|
|
|
ObjectSetPrototypeOf(Duplex, Readable);
|
|
|
|
{
|
|
|
|
const keys = ObjectKeys(Writable.prototype);
|
|
|
|
for (let i = 0; i < keys.length; i++) {
|
|
|
|
const method = keys[i];
|
|
|
|
if (!Duplex.prototype[method]) {
|
|
|
|
Duplex.prototype[method] = Writable.prototype[method];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function Duplex(options) {
|
|
|
|
if (!(this instanceof Duplex)) {
|
|
|
|
return new Duplex(options);
|
|
|
|
}
|
|
|
|
Readable.call(this, options);
|
|
|
|
Writable.call(this, options);
|
|
|
|
if (options) {
|
|
|
|
this.allowHalfOpen = options.allowHalfOpen !== false;
|
|
|
|
if (options.readable === false) {
|
|
|
|
this._readableState.readable = false;
|
|
|
|
this._readableState.ended = true;
|
|
|
|
this._readableState.endEmitted = true;
|
|
|
|
}
|
|
|
|
if (options.writable === false) {
|
|
|
|
this._writableState.writable = false;
|
|
|
|
this._writableState.ending = true;
|
|
|
|
this._writableState.ended = true;
|
|
|
|
this._writableState.finished = true;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
this.allowHalfOpen = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
ObjectDefineProperties(Duplex.prototype, {
|
|
|
|
writable: {
|
|
|
|
__proto__: null,
|
|
|
|
...ObjectGetOwnPropertyDescriptor(Writable.prototype, "writable"),
|
|
|
|
},
|
|
|
|
writableHighWaterMark: {
|
|
|
|
__proto__: null,
|
|
|
|
...ObjectGetOwnPropertyDescriptor(
|
|
|
|
Writable.prototype,
|
|
|
|
"writableHighWaterMark",
|
|
|
|
),
|
|
|
|
},
|
|
|
|
writableObjectMode: {
|
|
|
|
__proto__: null,
|
|
|
|
...ObjectGetOwnPropertyDescriptor(
|
|
|
|
Writable.prototype,
|
|
|
|
"writableObjectMode",
|
|
|
|
),
|
|
|
|
},
|
|
|
|
writableBuffer: {
|
|
|
|
__proto__: null,
|
|
|
|
...ObjectGetOwnPropertyDescriptor(Writable.prototype, "writableBuffer"),
|
|
|
|
},
|
|
|
|
writableLength: {
|
|
|
|
__proto__: null,
|
|
|
|
...ObjectGetOwnPropertyDescriptor(Writable.prototype, "writableLength"),
|
|
|
|
},
|
|
|
|
writableFinished: {
|
|
|
|
__proto__: null,
|
|
|
|
...ObjectGetOwnPropertyDescriptor(
|
|
|
|
Writable.prototype,
|
|
|
|
"writableFinished",
|
|
|
|
),
|
|
|
|
},
|
|
|
|
writableCorked: {
|
|
|
|
__proto__: null,
|
|
|
|
...ObjectGetOwnPropertyDescriptor(Writable.prototype, "writableCorked"),
|
|
|
|
},
|
|
|
|
writableEnded: {
|
|
|
|
__proto__: null,
|
|
|
|
...ObjectGetOwnPropertyDescriptor(Writable.prototype, "writableEnded"),
|
|
|
|
},
|
|
|
|
writableNeedDrain: {
|
|
|
|
__proto__: null,
|
|
|
|
...ObjectGetOwnPropertyDescriptor(
|
|
|
|
Writable.prototype,
|
|
|
|
"writableNeedDrain",
|
|
|
|
),
|
|
|
|
},
|
|
|
|
destroyed: {
|
|
|
|
__proto__: null,
|
|
|
|
get() {
|
|
|
|
if (
|
|
|
|
this._readableState === void 0 || this._writableState === void 0
|
|
|
|
) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return this._readableState.destroyed && this._writableState.destroyed;
|
|
|
|
},
|
|
|
|
set(value) {
|
|
|
|
if (this._readableState && this._writableState) {
|
|
|
|
this._readableState.destroyed = value;
|
|
|
|
this._writableState.destroyed = value;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
},
|
|
|
|
});
|
|
|
|
var webStreamsAdapters;
|
|
|
|
function lazyWebStreams() {
|
|
|
|
if (webStreamsAdapters === void 0) {
|
|
|
|
webStreamsAdapters = {};
|
|
|
|
}
|
|
|
|
return webStreamsAdapters;
|
|
|
|
}
|
|
|
|
Duplex.fromWeb = function (pair, options) {
|
|
|
|
return lazyWebStreams().newStreamDuplexFromReadableWritablePair(
|
|
|
|
pair,
|
|
|
|
options,
|
|
|
|
);
|
|
|
|
};
|
|
|
|
Duplex.toWeb = function (duplex) {
|
|
|
|
return lazyWebStreams().newReadableWritablePairFromDuplex(duplex);
|
|
|
|
};
|
|
|
|
var duplexify;
|
|
|
|
Duplex.from = function (body) {
|
|
|
|
if (!duplexify) {
|
|
|
|
duplexify = require_duplexify();
|
|
|
|
}
|
|
|
|
return duplexify(body, "body");
|
|
|
|
};
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
// lib/internal/streams/transform.js
|
|
|
|
var require_transform = __commonJS({
|
|
|
|
"lib/internal/streams/transform.js"(exports, module) {
|
|
|
|
"use strict";
|
|
|
|
var { ObjectSetPrototypeOf, Symbol: Symbol2 } = require_primordials();
|
|
|
|
module.exports = Transform;
|
|
|
|
var Duplex = require_duplex();
|
|
|
|
var { getHighWaterMark } = require_state();
|
|
|
|
ObjectSetPrototypeOf(Transform.prototype, Duplex.prototype);
|
|
|
|
ObjectSetPrototypeOf(Transform, Duplex);
|
|
|
|
var kCallback = Symbol2("kCallback");
|
|
|
|
function Transform(options) {
|
|
|
|
if (!(this instanceof Transform)) {
|
|
|
|
return new Transform(options);
|
|
|
|
}
|
|
|
|
const readableHighWaterMark = options
|
|
|
|
? getHighWaterMark(this, options, "readableHighWaterMark", true)
|
|
|
|
: null;
|
|
|
|
if (readableHighWaterMark === 0) {
|
|
|
|
options = {
|
|
|
|
...options,
|
|
|
|
highWaterMark: null,
|
|
|
|
readableHighWaterMark,
|
|
|
|
// TODO (ronag): 0 is not optimal since we have
|
|
|
|
// a "bug" where we check needDrain before calling _write and not after.
|
|
|
|
// Refs: https://github.com/nodejs/node/pull/32887
|
|
|
|
// Refs: https://github.com/nodejs/node/pull/35941
|
|
|
|
writableHighWaterMark: options.writableHighWaterMark || 0,
|
|
|
|
};
|
|
|
|
}
|
|
|
|
Duplex.call(this, options);
|
|
|
|
this._readableState.sync = false;
|
|
|
|
this[kCallback] = null;
|
|
|
|
if (options) {
|
|
|
|
if (typeof options.transform === "function") {
|
|
|
|
this._transform = options.transform;
|
|
|
|
}
|
|
|
|
if (typeof options.flush === "function") {
|
|
|
|
this._flush = options.flush;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
this.on("prefinish", prefinish);
|
|
|
|
}
|
|
|
|
function final(cb) {
|
|
|
|
if (typeof this._flush === "function" && !this.destroyed) {
|
|
|
|
this._flush((er, data) => {
|
|
|
|
if (er) {
|
|
|
|
if (cb) {
|
|
|
|
cb(er);
|
|
|
|
} else {
|
|
|
|
this.destroy(er);
|
|
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (data != null) {
|
|
|
|
this.push(data);
|
|
|
|
}
|
|
|
|
this.push(null);
|
|
|
|
if (cb) {
|
|
|
|
cb();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
this.push(null);
|
|
|
|
if (cb) {
|
|
|
|
cb();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function prefinish() {
|
|
|
|
if (this._final !== final) {
|
|
|
|
final.call(this);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Transform.prototype._final = final;
|
|
|
|
Transform.prototype._transform = function (chunk, encoding, callback) {
|
|
|
|
throw new ERR_METHOD_NOT_IMPLEMENTED("_transform()");
|
|
|
|
};
|
|
|
|
Transform.prototype._write = function (chunk, encoding, callback) {
|
|
|
|
const rState = this._readableState;
|
|
|
|
const wState = this._writableState;
|
|
|
|
const length = rState.length;
|
|
|
|
this._transform(chunk, encoding, (err, val) => {
|
|
|
|
if (err) {
|
|
|
|
callback(err);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (val != null) {
|
|
|
|
this.push(val);
|
|
|
|
}
|
|
|
|
if (
|
|
|
|
wState.ended || // Backwards compat.
|
|
|
|
length === rState.length || // Backwards compat.
|
|
|
|
rState.length < rState.highWaterMark
|
|
|
|
) {
|
|
|
|
callback();
|
|
|
|
} else {
|
|
|
|
this[kCallback] = callback;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
};
|
|
|
|
Transform.prototype._read = function () {
|
|
|
|
if (this[kCallback]) {
|
|
|
|
const callback = this[kCallback];
|
|
|
|
this[kCallback] = null;
|
|
|
|
callback();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
// lib/internal/streams/passthrough.js
|
|
|
|
var require_passthrough = __commonJS({
|
|
|
|
"lib/internal/streams/passthrough.js"(exports, module) {
|
|
|
|
"use strict";
|
|
|
|
var { ObjectSetPrototypeOf } = require_primordials();
|
|
|
|
module.exports = PassThrough;
|
|
|
|
var Transform = require_transform();
|
|
|
|
ObjectSetPrototypeOf(PassThrough.prototype, Transform.prototype);
|
|
|
|
ObjectSetPrototypeOf(PassThrough, Transform);
|
|
|
|
function PassThrough(options) {
|
|
|
|
if (!(this instanceof PassThrough)) {
|
|
|
|
return new PassThrough(options);
|
|
|
|
}
|
|
|
|
Transform.call(this, options);
|
|
|
|
}
|
|
|
|
PassThrough.prototype._transform = function (chunk, encoding, cb) {
|
|
|
|
cb(null, chunk);
|
|
|
|
};
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
// lib/internal/streams/pipeline.js
|
|
|
|
var require_pipeline = __commonJS({
|
|
|
|
"lib/internal/streams/pipeline.js"(exports, module) {
|
|
|
|
var process = require_browser2();
|
|
|
|
var { ArrayIsArray, Promise: Promise2, SymbolAsyncIterator } =
|
|
|
|
require_primordials();
|
|
|
|
var eos = require_end_of_stream();
|
|
|
|
var destroyImpl = require_destroy();
|
|
|
|
var Duplex = require_duplex();
|
|
|
|
var { validateFunction, validateAbortSignal } = require_validators();
|
|
|
|
var { isIterable, isReadable, isReadableNodeStream, isNodeStream } =
|
|
|
|
require_utils();
|
|
|
|
var PassThrough;
|
|
|
|
var Readable;
|
|
|
|
function destroyer(stream, reading, writing) {
|
|
|
|
let finished = false;
|
|
|
|
stream.on("close", () => {
|
|
|
|
finished = true;
|
|
|
|
});
|
|
|
|
const cleanup = eos(
|
|
|
|
stream,
|
|
|
|
{
|
|
|
|
readable: reading,
|
|
|
|
writable: writing,
|
|
|
|
},
|
|
|
|
(err) => {
|
|
|
|
finished = !err;
|
|
|
|
},
|
|
|
|
);
|
|
|
|
return {
|
|
|
|
destroy: (err) => {
|
|
|
|
if (finished) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
finished = true;
|
|
|
|
destroyImpl.destroyer(
|
|
|
|
stream,
|
|
|
|
err || new ERR_STREAM_DESTROYED("pipe"),
|
|
|
|
);
|
|
|
|
},
|
|
|
|
cleanup,
|
|
|
|
};
|
|
|
|
}
|
|
|
|
function popCallback(streams) {
|
|
|
|
validateFunction(
|
|
|
|
streams[streams.length - 1],
|
|
|
|
"streams[stream.length - 1]",
|
|
|
|
);
|
|
|
|
return streams.pop();
|
|
|
|
}
|
|
|
|
function makeAsyncIterable(val) {
|
|
|
|
if (isIterable(val)) {
|
|
|
|
return val;
|
|
|
|
} else if (isReadableNodeStream(val)) {
|
|
|
|
return fromReadable(val);
|
|
|
|
}
|
|
|
|
throw new ERR_INVALID_ARG_TYPE("val", [
|
|
|
|
"Readable",
|
|
|
|
"Iterable",
|
|
|
|
"AsyncIterable",
|
|
|
|
], val);
|
|
|
|
}
|
|
|
|
async function* fromReadable(val) {
|
|
|
|
if (!Readable) {
|
|
|
|
Readable = require_readable();
|
|
|
|
}
|
|
|
|
yield* Readable.prototype[SymbolAsyncIterator].call(val);
|
|
|
|
}
|
|
|
|
async function pump(iterable, writable, finish, { end }) {
|
|
|
|
let error;
|
|
|
|
let onresolve = null;
|
|
|
|
const resume = (err) => {
|
|
|
|
if (err) {
|
|
|
|
error = err;
|
|
|
|
}
|
|
|
|
if (onresolve) {
|
|
|
|
const callback = onresolve;
|
|
|
|
onresolve = null;
|
|
|
|
callback();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
const wait = () =>
|
|
|
|
new Promise2((resolve, reject) => {
|
|
|
|
if (error) {
|
|
|
|
reject(error);
|
|
|
|
} else {
|
|
|
|
onresolve = () => {
|
|
|
|
if (error) {
|
|
|
|
reject(error);
|
|
|
|
} else {
|
|
|
|
resolve();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
});
|
|
|
|
writable.on("drain", resume);
|
|
|
|
const cleanup = eos(
|
|
|
|
writable,
|
|
|
|
{
|
|
|
|
readable: false,
|
|
|
|
},
|
|
|
|
resume,
|
|
|
|
);
|
|
|
|
try {
|
|
|
|
if (writable.writableNeedDrain) {
|
|
|
|
await wait();
|
|
|
|
}
|
|
|
|
for await (const chunk of iterable) {
|
|
|
|
if (!writable.write(chunk)) {
|
|
|
|
await wait();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (end) {
|
|
|
|
writable.end();
|
|
|
|
}
|
|
|
|
await wait();
|
|
|
|
finish();
|
|
|
|
} catch (err) {
|
|
|
|
finish(error !== err ? aggregateTwoErrors(error, err) : err);
|
|
|
|
} finally {
|
|
|
|
cleanup();
|
|
|
|
writable.off("drain", resume);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function pipeline(...streams) {
|
|
|
|
return pipelineImpl(streams, once(popCallback(streams)));
|
|
|
|
}
|
|
|
|
function pipelineImpl(streams, callback, opts) {
|
|
|
|
if (streams.length === 1 && ArrayIsArray(streams[0])) {
|
|
|
|
streams = streams[0];
|
|
|
|
}
|
|
|
|
if (streams.length < 2) {
|
|
|
|
throw new ERR_MISSING_ARGS("streams");
|
|
|
|
}
|
|
|
|
const ac = new AbortController();
|
|
|
|
const signal = ac.signal;
|
|
|
|
const outerSignal = opts === null || opts === void 0
|
|
|
|
? void 0
|
|
|
|
: opts.signal;
|
|
|
|
const lastStreamCleanup = [];
|
|
|
|
validateAbortSignal(outerSignal, "options.signal");
|
|
|
|
function abort() {
|
|
|
|
finishImpl(new AbortError());
|
|
|
|
}
|
|
|
|
outerSignal === null || outerSignal === void 0
|
|
|
|
? void 0
|
|
|
|
: outerSignal.addEventListener("abort", abort);
|
|
|
|
let error;
|
|
|
|
let value;
|
|
|
|
const destroys = [];
|
|
|
|
let finishCount = 0;
|
|
|
|
function finish(err) {
|
|
|
|
finishImpl(err, --finishCount === 0);
|
|
|
|
}
|
|
|
|
function finishImpl(err, final) {
|
|
|
|
if (err && (!error || error.code === "ERR_STREAM_PREMATURE_CLOSE")) {
|
|
|
|
error = err;
|
|
|
|
}
|
|
|
|
if (!error && !final) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
while (destroys.length) {
|
|
|
|
destroys.shift()(error);
|
|
|
|
}
|
|
|
|
outerSignal === null || outerSignal === void 0
|
|
|
|
? void 0
|
|
|
|
: outerSignal.removeEventListener("abort", abort);
|
|
|
|
ac.abort();
|
|
|
|
if (final) {
|
|
|
|
if (!error) {
|
|
|
|
lastStreamCleanup.forEach((fn) => fn());
|
|
|
|
}
|
|
|
|
process.nextTick(callback, error, value);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
let ret;
|
|
|
|
for (let i = 0; i < streams.length; i++) {
|
|
|
|
const stream = streams[i];
|
|
|
|
const reading = i < streams.length - 1;
|
|
|
|
const writing = i > 0;
|
|
|
|
const end = reading ||
|
|
|
|
(opts === null || opts === void 0 ? void 0 : opts.end) !== false;
|
|
|
|
const isLastStream = i === streams.length - 1;
|
|
|
|
if (isNodeStream(stream)) {
|
|
|
|
let onError2 = function (err) {
|
|
|
|
if (
|
|
|
|
err && err.name !== "AbortError" &&
|
|
|
|
err.code !== "ERR_STREAM_PREMATURE_CLOSE"
|
|
|
|
) {
|
|
|
|
finish(err);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
var onError = onError2;
|
|
|
|
if (end) {
|
|
|
|
const { destroy, cleanup } = destroyer(stream, reading, writing);
|
|
|
|
destroys.push(destroy);
|
|
|
|
if (isReadable(stream) && isLastStream) {
|
|
|
|
lastStreamCleanup.push(cleanup);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
stream.on("error", onError2);
|
|
|
|
if (isReadable(stream) && isLastStream) {
|
|
|
|
lastStreamCleanup.push(() => {
|
|
|
|
stream.removeListener("error", onError2);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (i === 0) {
|
|
|
|
if (typeof stream === "function") {
|
|
|
|
ret = stream({
|
|
|
|
signal,
|
|
|
|
});
|
|
|
|
if (!isIterable(ret)) {
|
|
|
|
throw new ERR_INVALID_RETURN_VALUE(
|
|
|
|
"Iterable, AsyncIterable or Stream",
|
|
|
|
"source",
|
|
|
|
ret,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
} else if (isIterable(stream) || isReadableNodeStream(stream)) {
|
|
|
|
ret = stream;
|
|
|
|
} else {
|
|
|
|
ret = Duplex.from(stream);
|
|
|
|
}
|
|
|
|
} else if (typeof stream === "function") {
|
|
|
|
ret = makeAsyncIterable(ret);
|
|
|
|
ret = stream(ret, {
|
|
|
|
signal,
|
|
|
|
});
|
|
|
|
if (reading) {
|
|
|
|
if (!isIterable(ret, true)) {
|
|
|
|
throw new ERR_INVALID_RETURN_VALUE(
|
|
|
|
"AsyncIterable",
|
|
|
|
`transform[${i - 1}]`,
|
|
|
|
ret,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
var _ret;
|
|
|
|
if (!PassThrough) {
|
|
|
|
PassThrough = require_passthrough();
|
|
|
|
}
|
|
|
|
const pt = new PassThrough({
|
|
|
|
objectMode: true,
|
|
|
|
});
|
|
|
|
const then = (_ret = ret) === null || _ret === void 0
|
|
|
|
? void 0
|
|
|
|
: _ret.then;
|
|
|
|
if (typeof then === "function") {
|
|
|
|
finishCount++;
|
|
|
|
then.call(
|
|
|
|
ret,
|
|
|
|
(val) => {
|
|
|
|
value = val;
|
|
|
|
if (val != null) {
|
|
|
|
pt.write(val);
|
|
|
|
}
|
|
|
|
if (end) {
|
|
|
|
pt.end();
|
|
|
|
}
|
|
|
|
process.nextTick(finish);
|
|
|
|
},
|
|
|
|
(err) => {
|
|
|
|
pt.destroy(err);
|
|
|
|
process.nextTick(finish, err);
|
|
|
|
},
|
|
|
|
);
|
|
|
|
} else if (isIterable(ret, true)) {
|
|
|
|
finishCount++;
|
|
|
|
pump(ret, pt, finish, {
|
|
|
|
end,
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
throw new ERR_INVALID_RETURN_VALUE(
|
|
|
|
"AsyncIterable or Promise",
|
|
|
|
"destination",
|
|
|
|
ret,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
ret = pt;
|
|
|
|
const { destroy, cleanup } = destroyer(ret, false, true);
|
|
|
|
destroys.push(destroy);
|
|
|
|
if (isLastStream) {
|
|
|
|
lastStreamCleanup.push(cleanup);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else if (isNodeStream(stream)) {
|
|
|
|
if (isReadableNodeStream(ret)) {
|
|
|
|
finishCount += 2;
|
|
|
|
const cleanup = pipe(ret, stream, finish, {
|
|
|
|
end,
|
|
|
|
});
|
|
|
|
if (isReadable(stream) && isLastStream) {
|
|
|
|
lastStreamCleanup.push(cleanup);
|
|
|
|
}
|
|
|
|
} else if (isIterable(ret)) {
|
|
|
|
finishCount++;
|
|
|
|
pump(ret, stream, finish, {
|
|
|
|
end,
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
throw new ERR_INVALID_ARG_TYPE("val", [
|
|
|
|
"Readable",
|
|
|
|
"Iterable",
|
|
|
|
"AsyncIterable",
|
|
|
|
], ret);
|
|
|
|
}
|
|
|
|
ret = stream;
|
|
|
|
} else {
|
|
|
|
ret = Duplex.from(stream);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (
|
|
|
|
signal !== null && signal !== void 0 && signal.aborted ||
|
|
|
|
outerSignal !== null && outerSignal !== void 0 && outerSignal.aborted
|
|
|
|
) {
|
|
|
|
process.nextTick(abort);
|
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
function pipe(src, dst, finish, { end }) {
|
|
|
|
let ended = false;
|
|
|
|
dst.on("close", () => {
|
|
|
|
if (!ended) {
|
|
|
|
finish(new ERR_STREAM_PREMATURE_CLOSE());
|
|
|
|
}
|
|
|
|
});
|
|
|
|
src.pipe(dst, {
|
|
|
|
end,
|
|
|
|
});
|
|
|
|
if (end) {
|
|
|
|
src.once("end", () => {
|
|
|
|
ended = true;
|
|
|
|
dst.end();
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
finish();
|
|
|
|
}
|
|
|
|
eos(
|
|
|
|
src,
|
|
|
|
{
|
|
|
|
readable: true,
|
|
|
|
writable: false,
|
|
|
|
},
|
|
|
|
(err) => {
|
|
|
|
const rState = src._readableState;
|
|
|
|
if (
|
|
|
|
err && err.code === "ERR_STREAM_PREMATURE_CLOSE" && rState &&
|
|
|
|
rState.ended && !rState.errored && !rState.errorEmitted
|
|
|
|
) {
|
|
|
|
src.once("end", finish).once("error", finish);
|
|
|
|
} else {
|
|
|
|
finish(err);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
);
|
|
|
|
return eos(
|
|
|
|
dst,
|
|
|
|
{
|
|
|
|
readable: false,
|
|
|
|
writable: true,
|
|
|
|
},
|
|
|
|
finish,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
module.exports = {
|
|
|
|
pipelineImpl,
|
|
|
|
pipeline,
|
|
|
|
};
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
// lib/internal/streams/compose.js
|
|
|
|
var require_compose = __commonJS({
|
|
|
|
"lib/internal/streams/compose.js"(exports, module) {
|
|
|
|
"use strict";
|
|
|
|
var { pipeline } = require_pipeline();
|
|
|
|
var Duplex = require_duplex();
|
|
|
|
var { destroyer } = require_destroy();
|
|
|
|
var { isNodeStream, isReadable, isWritable } = require_utils();
|
|
|
|
module.exports = function compose(...streams) {
|
|
|
|
if (streams.length === 0) {
|
|
|
|
throw new ERR_MISSING_ARGS("streams");
|
|
|
|
}
|
|
|
|
if (streams.length === 1) {
|
|
|
|
return Duplex.from(streams[0]);
|
|
|
|
}
|
|
|
|
const orgStreams = [...streams];
|
|
|
|
if (typeof streams[0] === "function") {
|
|
|
|
streams[0] = Duplex.from(streams[0]);
|
|
|
|
}
|
|
|
|
if (typeof streams[streams.length - 1] === "function") {
|
|
|
|
const idx = streams.length - 1;
|
|
|
|
streams[idx] = Duplex.from(streams[idx]);
|
|
|
|
}
|
|
|
|
for (let n = 0; n < streams.length; ++n) {
|
|
|
|
if (!isNodeStream(streams[n])) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
if (n < streams.length - 1 && !isReadable(streams[n])) {
|
|
|
|
throw new ERR_INVALID_ARG_VALUE(
|
|
|
|
`streams[${n}]`,
|
|
|
|
orgStreams[n],
|
|
|
|
"must be readable",
|
|
|
|
);
|
|
|
|
}
|
|
|
|
if (n > 0 && !isWritable(streams[n])) {
|
|
|
|
throw new ERR_INVALID_ARG_VALUE(
|
|
|
|
`streams[${n}]`,
|
|
|
|
orgStreams[n],
|
|
|
|
"must be writable",
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
let ondrain;
|
|
|
|
let onfinish;
|
|
|
|
let onreadable;
|
|
|
|
let onclose;
|
|
|
|
let d;
|
|
|
|
function onfinished(err) {
|
|
|
|
const cb = onclose;
|
|
|
|
onclose = null;
|
|
|
|
if (cb) {
|
|
|
|
cb(err);
|
|
|
|
} else if (err) {
|
|
|
|
d.destroy(err);
|
|
|
|
} else if (!readable && !writable) {
|
|
|
|
d.destroy();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
const head = streams[0];
|
|
|
|
const tail = pipeline(streams, onfinished);
|
|
|
|
const writable = !!isWritable(head);
|
|
|
|
const readable = !!isReadable(tail);
|
|
|
|
d = new Duplex({
|
|
|
|
// TODO (ronag): highWaterMark?
|
|
|
|
writableObjectMode:
|
|
|
|
!!(head !== null && head !== void 0 && head.writableObjectMode),
|
|
|
|
readableObjectMode:
|
|
|
|
!!(tail !== null && tail !== void 0 && tail.writableObjectMode),
|
|
|
|
writable,
|
|
|
|
readable,
|
|
|
|
});
|
|
|
|
if (writable) {
|
|
|
|
d._write = function (chunk, encoding, callback) {
|
|
|
|
if (head.write(chunk, encoding)) {
|
|
|
|
callback();
|
|
|
|
} else {
|
|
|
|
ondrain = callback;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
d._final = function (callback) {
|
|
|
|
head.end();
|
|
|
|
onfinish = callback;
|
|
|
|
};
|
|
|
|
head.on("drain", function () {
|
|
|
|
if (ondrain) {
|
|
|
|
const cb = ondrain;
|
|
|
|
ondrain = null;
|
|
|
|
cb();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
tail.on("finish", function () {
|
|
|
|
if (onfinish) {
|
|
|
|
const cb = onfinish;
|
|
|
|
onfinish = null;
|
|
|
|
cb();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
if (readable) {
|
|
|
|
tail.on("readable", function () {
|
|
|
|
if (onreadable) {
|
|
|
|
const cb = onreadable;
|
|
|
|
onreadable = null;
|
|
|
|
cb();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
tail.on("end", function () {
|
|
|
|
d.push(null);
|
|
|
|
});
|
|
|
|
d._read = function () {
|
|
|
|
while (true) {
|
|
|
|
const buf = tail.read();
|
|
|
|
if (buf === null) {
|
|
|
|
onreadable = d._read;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (!d.push(buf)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
d._destroy = function (err, callback) {
|
|
|
|
if (!err && onclose !== null) {
|
|
|
|
err = new AbortError();
|
|
|
|
}
|
|
|
|
onreadable = null;
|
|
|
|
ondrain = null;
|
|
|
|
onfinish = null;
|
|
|
|
if (onclose === null) {
|
|
|
|
callback(err);
|
|
|
|
} else {
|
|
|
|
onclose = callback;
|
|
|
|
destroyer(tail, err);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
return d;
|
|
|
|
};
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
// lib/stream/promises.js
|
|
|
|
var require_promises = __commonJS({
|
|
|
|
"lib/stream/promises.js"(exports, module) {
|
|
|
|
"use strict";
|
|
|
|
var { ArrayPrototypePop, Promise: Promise2 } = require_primordials();
|
|
|
|
var { isIterable, isNodeStream } = require_utils();
|
|
|
|
var { pipelineImpl: pl } = require_pipeline();
|
|
|
|
var { finished } = require_end_of_stream();
|
|
|
|
function pipeline(...streams) {
|
|
|
|
return new Promise2((resolve, reject) => {
|
|
|
|
let signal;
|
|
|
|
let end;
|
|
|
|
const lastArg = streams[streams.length - 1];
|
|
|
|
if (
|
|
|
|
lastArg && typeof lastArg === "object" && !isNodeStream(lastArg) &&
|
|
|
|
!isIterable(lastArg)
|
|
|
|
) {
|
|
|
|
const options = ArrayPrototypePop(streams);
|
|
|
|
signal = options.signal;
|
|
|
|
end = options.end;
|
|
|
|
}
|
|
|
|
pl(
|
|
|
|
streams,
|
|
|
|
(err, value) => {
|
|
|
|
if (err) {
|
|
|
|
reject(err);
|
|
|
|
} else {
|
|
|
|
resolve(value);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
signal,
|
|
|
|
end,
|
|
|
|
},
|
|
|
|
);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
module.exports = {
|
|
|
|
finished,
|
|
|
|
pipeline,
|
|
|
|
};
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
// lib/stream.js
|
|
|
|
var require_stream = __commonJS({
|
|
|
|
"lib/stream.js"(exports, module) {
|
|
|
|
var { Buffer: Buffer2 } = require_buffer();
|
|
|
|
var { ObjectDefineProperty, ObjectKeys, ReflectApply } =
|
|
|
|
require_primordials();
|
|
|
|
var { streamReturningOperators, promiseReturningOperators } =
|
|
|
|
require_operators();
|
|
|
|
var compose = require_compose();
|
|
|
|
var { pipeline } = require_pipeline();
|
|
|
|
var { destroyer } = require_destroy();
|
|
|
|
var eos = require_end_of_stream();
|
|
|
|
var promises = require_promises();
|
|
|
|
var utils = require_utils();
|
|
|
|
var Stream = module.exports = require_legacy().Stream;
|
|
|
|
Stream.isDisturbed = utils.isDisturbed;
|
|
|
|
Stream.isErrored = utils.isErrored;
|
|
|
|
Stream.isReadable = utils.isReadable;
|
|
|
|
Stream.Readable = require_readable();
|
|
|
|
for (const key of ObjectKeys(streamReturningOperators)) {
|
|
|
|
let fn2 = function (...args) {
|
|
|
|
if (new.target) {
|
|
|
|
throw ERR_ILLEGAL_CONSTRUCTOR();
|
|
|
|
}
|
|
|
|
return Stream.Readable.from(ReflectApply(op, this, args));
|
|
|
|
};
|
|
|
|
fn = fn2;
|
|
|
|
const op = streamReturningOperators[key];
|
|
|
|
ObjectDefineProperty(fn2, "name", {
|
|
|
|
__proto__: null,
|
|
|
|
value: op.name,
|
|
|
|
});
|
|
|
|
ObjectDefineProperty(fn2, "length", {
|
|
|
|
__proto__: null,
|
|
|
|
value: op.length,
|
|
|
|
});
|
|
|
|
ObjectDefineProperty(Stream.Readable.prototype, key, {
|
|
|
|
__proto__: null,
|
|
|
|
value: fn2,
|
|
|
|
enumerable: false,
|
|
|
|
configurable: true,
|
|
|
|
writable: true,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
var fn;
|
|
|
|
for (const key of ObjectKeys(promiseReturningOperators)) {
|
|
|
|
let fn2 = function (...args) {
|
|
|
|
if (new.target) {
|
|
|
|
throw ERR_ILLEGAL_CONSTRUCTOR();
|
|
|
|
}
|
|
|
|
return ReflectApply(op, this, args);
|
|
|
|
};
|
|
|
|
fn = fn2;
|
|
|
|
const op = promiseReturningOperators[key];
|
|
|
|
ObjectDefineProperty(fn2, "name", {
|
|
|
|
__proto__: null,
|
|
|
|
value: op.name,
|
|
|
|
});
|
|
|
|
ObjectDefineProperty(fn2, "length", {
|
|
|
|
__proto__: null,
|
|
|
|
value: op.length,
|
|
|
|
});
|
|
|
|
ObjectDefineProperty(Stream.Readable.prototype, key, {
|
|
|
|
__proto__: null,
|
|
|
|
value: fn2,
|
|
|
|
enumerable: false,
|
|
|
|
configurable: true,
|
|
|
|
writable: true,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
var fn;
|
|
|
|
Stream.Writable = require_writable();
|
|
|
|
Stream.Duplex = require_duplex();
|
|
|
|
Stream.Transform = require_transform();
|
|
|
|
Stream.PassThrough = require_passthrough();
|
|
|
|
Stream.pipeline = pipeline;
|
|
|
|
var { addAbortSignal } = require_add_abort_signal();
|
|
|
|
Stream.addAbortSignal = addAbortSignal;
|
|
|
|
Stream.finished = eos;
|
|
|
|
Stream.destroy = destroyer;
|
|
|
|
Stream.compose = compose;
|
|
|
|
ObjectDefineProperty(Stream, "promises", {
|
|
|
|
__proto__: null,
|
|
|
|
configurable: true,
|
|
|
|
enumerable: true,
|
|
|
|
get() {
|
|
|
|
return promises;
|
|
|
|
},
|
|
|
|
});
|
|
|
|
ObjectDefineProperty(pipeline, promisify, {
|
|
|
|
__proto__: null,
|
|
|
|
enumerable: true,
|
|
|
|
get() {
|
|
|
|
return promises.pipeline;
|
|
|
|
},
|
|
|
|
});
|
|
|
|
ObjectDefineProperty(eos, promisify, {
|
|
|
|
__proto__: null,
|
|
|
|
enumerable: true,
|
|
|
|
get() {
|
|
|
|
return promises.finished;
|
|
|
|
},
|
|
|
|
});
|
|
|
|
Stream.Stream = Stream;
|
|
|
|
Stream._isUint8Array = function isUint8Array(value) {
|
|
|
|
return value instanceof Uint8Array;
|
|
|
|
};
|
|
|
|
Stream._uint8ArrayToBuffer = function _uint8ArrayToBuffer(chunk) {
|
|
|
|
return Buffer2.from(chunk.buffer, chunk.byteOffset, chunk.byteLength);
|
|
|
|
};
|
|
|
|
},
|
|
|
|
});
|
2023-02-14 11:38:45 -05:00
|
|
|
/* End esm.sh bundle */
|
|
|
|
|
|
|
|
// The following code implements Readable.fromWeb(), Writable.fromWeb(), and
|
|
|
|
// Duplex.fromWeb(). These functions are not properly implemented in the
|
|
|
|
// readable-stream module yet. This can be removed once the following upstream
|
|
|
|
// issue is resolved: https://github.com/nodejs/readable-stream/issues/482
|
|
|
|
|
2023-03-08 06:44:54 -05:00
|
|
|
import { destroy } from "ext:deno_node/internal/streams/destroy.mjs";
|
|
|
|
import finished from "ext:deno_node/internal/streams/end-of-stream.mjs";
|
2023-02-14 11:38:45 -05:00
|
|
|
import {
|
|
|
|
isDestroyed,
|
|
|
|
isReadable,
|
|
|
|
isReadableEnded,
|
|
|
|
isWritable,
|
|
|
|
isWritableEnded,
|
2023-03-08 06:44:54 -05:00
|
|
|
} from "ext:deno_node/internal/streams/utils.mjs";
|
2023-07-02 14:19:30 -04:00
|
|
|
import { ReadableStream, WritableStream } from "node:stream/web";
|
2023-05-10 06:30:02 -04:00
|
|
|
import {
|
|
|
|
validateBoolean,
|
|
|
|
validateObject,
|
|
|
|
} from "ext:deno_node/internal/validators.mjs";
|
2023-02-14 11:38:45 -05:00
|
|
|
|
2023-05-10 06:30:02 -04:00
|
|
|
const CustomStream = require_stream();
|
2023-02-14 11:38:45 -05:00
|
|
|
const process = __process$;
|
|
|
|
const { Buffer } = __buffer$;
|
|
|
|
|
2023-05-10 06:30:02 -04:00
|
|
|
export const Readable = CustomStream.Readable;
|
|
|
|
export const Writable = CustomStream.Writable;
|
|
|
|
export const Duplex = CustomStream.Duplex;
|
|
|
|
export const PassThrough = CustomStream.PassThrough;
|
|
|
|
export const Stream = CustomStream.Stream;
|
|
|
|
export const Transform = CustomStream.Transform;
|
|
|
|
export const _isUint8Array = CustomStream._isUint8Array;
|
|
|
|
export const _uint8ArrayToBuffer = CustomStream._uint8ArrayToBuffer;
|
|
|
|
export const addAbortSignal = CustomStream.addAbortSignal;
|
|
|
|
export const pipeline = CustomStream.pipeline;
|
|
|
|
export { finished };
|
2023-02-14 11:38:45 -05:00
|
|
|
|
|
|
|
function isWritableStream(object) {
|
|
|
|
return object instanceof WritableStream;
|
|
|
|
}
|
|
|
|
|
2023-05-10 06:30:02 -04:00
|
|
|
function isReadableStream(object) {
|
|
|
|
return object instanceof ReadableStream;
|
|
|
|
}
|
|
|
|
|
2023-02-14 11:38:45 -05:00
|
|
|
Readable.fromWeb = function (
|
|
|
|
readableStream,
|
|
|
|
options = kEmptyObject,
|
|
|
|
) {
|
|
|
|
if (!isReadableStream(readableStream)) {
|
|
|
|
throw new ERR_INVALID_ARG_TYPE(
|
|
|
|
"readableStream",
|
|
|
|
"ReadableStream",
|
|
|
|
readableStream,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
validateObject(options, "options");
|
|
|
|
const {
|
|
|
|
highWaterMark,
|
|
|
|
encoding,
|
|
|
|
objectMode = false,
|
|
|
|
signal,
|
|
|
|
} = options;
|
|
|
|
|
|
|
|
if (encoding !== undefined && !Buffer.isEncoding(encoding)) {
|
|
|
|
throw new ERR_INVALID_ARG_VALUE(encoding, "options.encoding");
|
|
|
|
}
|
|
|
|
validateBoolean(objectMode, "options.objectMode");
|
|
|
|
|
|
|
|
const reader = readableStream.getReader();
|
|
|
|
let closed = false;
|
|
|
|
|
|
|
|
const readable = new Readable({
|
|
|
|
objectMode,
|
|
|
|
highWaterMark,
|
|
|
|
encoding,
|
|
|
|
signal,
|
|
|
|
|
|
|
|
read() {
|
|
|
|
reader.read().then(
|
|
|
|
(chunk) => {
|
|
|
|
if (chunk.done) {
|
|
|
|
readable.push(null);
|
|
|
|
} else {
|
|
|
|
readable.push(chunk.value);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
(error) => destroy.call(readable, error),
|
|
|
|
);
|
|
|
|
},
|
|
|
|
|
|
|
|
destroy(error, callback) {
|
|
|
|
function done() {
|
|
|
|
try {
|
|
|
|
callback(error);
|
|
|
|
} catch (error) {
|
|
|
|
// In a next tick because this is happening within
|
|
|
|
// a promise context, and if there are any errors
|
|
|
|
// thrown we don't want those to cause an unhandled
|
|
|
|
// rejection. Let's just escape the promise and
|
|
|
|
// handle it separately.
|
|
|
|
process.nextTick(() => {
|
|
|
|
throw error;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!closed) {
|
|
|
|
reader.cancel(error).then(done, done);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
done();
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
reader.closed.then(
|
|
|
|
() => {
|
|
|
|
closed = true;
|
|
|
|
if (!isReadableEnded(readable)) {
|
|
|
|
readable.push(null);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
(error) => {
|
|
|
|
closed = true;
|
|
|
|
destroy.call(readable, error);
|
|
|
|
},
|
|
|
|
);
|
|
|
|
|
|
|
|
return readable;
|
|
|
|
};
|
|
|
|
|
|
|
|
Writable.fromWeb = function (
|
|
|
|
writableStream,
|
|
|
|
options = kEmptyObject,
|
|
|
|
) {
|
|
|
|
if (!isWritableStream(writableStream)) {
|
|
|
|
throw new ERR_INVALID_ARG_TYPE(
|
|
|
|
"writableStream",
|
|
|
|
"WritableStream",
|
|
|
|
writableStream,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
validateObject(options, "options");
|
|
|
|
const {
|
|
|
|
highWaterMark,
|
|
|
|
decodeStrings = true,
|
|
|
|
objectMode = false,
|
|
|
|
signal,
|
|
|
|
} = options;
|
|
|
|
|
|
|
|
validateBoolean(objectMode, "options.objectMode");
|
|
|
|
validateBoolean(decodeStrings, "options.decodeStrings");
|
|
|
|
|
|
|
|
const writer = writableStream.getWriter();
|
|
|
|
let closed = false;
|
|
|
|
|
|
|
|
const writable = new Writable({
|
|
|
|
highWaterMark,
|
|
|
|
objectMode,
|
|
|
|
decodeStrings,
|
|
|
|
signal,
|
|
|
|
|
|
|
|
writev(chunks, callback) {
|
|
|
|
function done(error) {
|
|
|
|
error = error.filter((e) => e);
|
|
|
|
try {
|
|
|
|
callback(error.length === 0 ? undefined : error);
|
|
|
|
} catch (error) {
|
|
|
|
// In a next tick because this is happening within
|
|
|
|
// a promise context, and if there are any errors
|
|
|
|
// thrown we don't want those to cause an unhandled
|
|
|
|
// rejection. Let's just escape the promise and
|
|
|
|
// handle it separately.
|
|
|
|
process.nextTick(() => destroy.call(writable, error));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
writer.ready.then(
|
|
|
|
() =>
|
|
|
|
Promise.all(
|
|
|
|
chunks.map((data) => writer.write(data.chunk)),
|
|
|
|
).then(done, done),
|
|
|
|
done,
|
|
|
|
);
|
|
|
|
},
|
|
|
|
|
|
|
|
write(chunk, encoding, callback) {
|
|
|
|
if (typeof chunk === "string" && decodeStrings && !objectMode) {
|
|
|
|
chunk = Buffer.from(chunk, encoding);
|
|
|
|
chunk = new Uint8Array(
|
|
|
|
chunk.buffer,
|
|
|
|
chunk.byteOffset,
|
|
|
|
chunk.byteLength,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
function done(error) {
|
|
|
|
try {
|
|
|
|
callback(error);
|
|
|
|
} catch (error) {
|
|
|
|
destroy(this, duplex, error);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
writer.ready.then(
|
|
|
|
() => writer.write(chunk).then(done, done),
|
|
|
|
done,
|
|
|
|
);
|
|
|
|
},
|
|
|
|
|
|
|
|
destroy(error, callback) {
|
|
|
|
function done() {
|
|
|
|
try {
|
|
|
|
callback(error);
|
|
|
|
} catch (error) {
|
|
|
|
// In a next tick because this is happening within
|
|
|
|
// a promise context, and if there are any errors
|
|
|
|
// thrown we don't want those to cause an unhandled
|
|
|
|
// rejection. Let's just escape the promise and
|
|
|
|
// handle it separately.
|
|
|
|
process.nextTick(() => {
|
|
|
|
throw error;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!closed) {
|
|
|
|
if (error != null) {
|
|
|
|
writer.abort(error).then(done, done);
|
|
|
|
} else {
|
|
|
|
writer.close().then(done, done);
|
|
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
done();
|
|
|
|
},
|
|
|
|
|
|
|
|
final(callback) {
|
|
|
|
function done(error) {
|
|
|
|
try {
|
|
|
|
callback(error);
|
|
|
|
} catch (error) {
|
|
|
|
// In a next tick because this is happening within
|
|
|
|
// a promise context, and if there are any errors
|
|
|
|
// thrown we don't want those to cause an unhandled
|
|
|
|
// rejection. Let's just escape the promise and
|
|
|
|
// handle it separately.
|
|
|
|
process.nextTick(() => destroy.call(writable, error));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!closed) {
|
|
|
|
writer.close().then(done, done);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
writer.closed.then(
|
|
|
|
() => {
|
|
|
|
closed = true;
|
|
|
|
if (!isWritableEnded(writable)) {
|
|
|
|
destroy.call(writable, new ERR_STREAM_PREMATURE_CLOSE());
|
|
|
|
}
|
|
|
|
},
|
|
|
|
(error) => {
|
|
|
|
closed = true;
|
|
|
|
destroy.call(writable, error);
|
|
|
|
},
|
|
|
|
);
|
|
|
|
|
|
|
|
return writable;
|
|
|
|
};
|
|
|
|
|
|
|
|
Duplex.fromWeb = function (pair, options = kEmptyObject) {
|
|
|
|
validateObject(pair, "pair");
|
|
|
|
const {
|
|
|
|
readable: readableStream,
|
|
|
|
writable: writableStream,
|
|
|
|
} = pair;
|
|
|
|
|
|
|
|
if (!isReadableStream(readableStream)) {
|
|
|
|
throw new ERR_INVALID_ARG_TYPE(
|
|
|
|
"pair.readable",
|
|
|
|
"ReadableStream",
|
|
|
|
readableStream,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
if (!isWritableStream(writableStream)) {
|
|
|
|
throw new ERR_INVALID_ARG_TYPE(
|
|
|
|
"pair.writable",
|
|
|
|
"WritableStream",
|
|
|
|
writableStream,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
validateObject(options, "options");
|
|
|
|
const {
|
|
|
|
allowHalfOpen = false,
|
|
|
|
objectMode = false,
|
|
|
|
encoding,
|
|
|
|
decodeStrings = true,
|
|
|
|
highWaterMark,
|
|
|
|
signal,
|
|
|
|
} = options;
|
|
|
|
|
|
|
|
validateBoolean(objectMode, "options.objectMode");
|
|
|
|
if (encoding !== undefined && !Buffer.isEncoding(encoding)) {
|
|
|
|
throw new ERR_INVALID_ARG_VALUE(encoding, "options.encoding");
|
|
|
|
}
|
|
|
|
|
|
|
|
const writer = writableStream.getWriter();
|
|
|
|
const reader = readableStream.getReader();
|
|
|
|
let writableClosed = false;
|
|
|
|
let readableClosed = false;
|
|
|
|
|
|
|
|
const duplex = new Duplex({
|
|
|
|
allowHalfOpen,
|
|
|
|
highWaterMark,
|
|
|
|
objectMode,
|
|
|
|
encoding,
|
|
|
|
decodeStrings,
|
|
|
|
signal,
|
|
|
|
|
|
|
|
writev(chunks, callback) {
|
|
|
|
function done(error) {
|
|
|
|
error = error.filter((e) => e);
|
|
|
|
try {
|
|
|
|
callback(error.length === 0 ? undefined : error);
|
|
|
|
} catch (error) {
|
|
|
|
// In a next tick because this is happening within
|
|
|
|
// a promise context, and if there are any errors
|
|
|
|
// thrown we don't want those to cause an unhandled
|
|
|
|
// rejection. Let's just escape the promise and
|
|
|
|
// handle it separately.
|
|
|
|
process.nextTick(() => destroy(duplex, error));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
writer.ready.then(
|
|
|
|
() =>
|
|
|
|
Promise.all(
|
|
|
|
chunks.map((data) => writer.write(data.chunk)),
|
|
|
|
).then(done, done),
|
|
|
|
done,
|
|
|
|
);
|
|
|
|
},
|
|
|
|
|
|
|
|
write(chunk, encoding, callback) {
|
|
|
|
if (typeof chunk === "string" && decodeStrings && !objectMode) {
|
|
|
|
chunk = Buffer.from(chunk, encoding);
|
|
|
|
chunk = new Uint8Array(
|
|
|
|
chunk.buffer,
|
|
|
|
chunk.byteOffset,
|
|
|
|
chunk.byteLength,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
function done(error) {
|
|
|
|
try {
|
|
|
|
callback(error);
|
|
|
|
} catch (error) {
|
|
|
|
destroy(duplex, error);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
writer.ready.then(
|
|
|
|
() => writer.write(chunk).then(done, done),
|
|
|
|
done,
|
|
|
|
);
|
|
|
|
},
|
|
|
|
|
|
|
|
final(callback) {
|
|
|
|
function done(error) {
|
|
|
|
try {
|
|
|
|
callback(error);
|
|
|
|
} catch (error) {
|
|
|
|
// In a next tick because this is happening within
|
|
|
|
// a promise context, and if there are any errors
|
|
|
|
// thrown we don't want those to cause an unhandled
|
|
|
|
// rejection. Let's just escape the promise and
|
|
|
|
// handle it separately.
|
|
|
|
process.nextTick(() => destroy(duplex, error));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!writableClosed) {
|
|
|
|
writer.close().then(done, done);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
read() {
|
|
|
|
reader.read().then(
|
|
|
|
(chunk) => {
|
|
|
|
if (chunk.done) {
|
|
|
|
duplex.push(null);
|
|
|
|
} else {
|
|
|
|
duplex.push(chunk.value);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
(error) => destroy(duplex, error),
|
|
|
|
);
|
|
|
|
},
|
|
|
|
|
|
|
|
destroy(error, callback) {
|
|
|
|
function done() {
|
|
|
|
try {
|
|
|
|
callback(error);
|
|
|
|
} catch (error) {
|
|
|
|
// In a next tick because this is happening within
|
|
|
|
// a promise context, and if there are any errors
|
|
|
|
// thrown we don't want those to cause an unhandled
|
|
|
|
// rejection. Let's just escape the promise and
|
|
|
|
// handle it separately.
|
|
|
|
process.nextTick(() => {
|
|
|
|
throw error;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
async function closeWriter() {
|
|
|
|
if (!writableClosed) {
|
|
|
|
await writer.abort(error);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
async function closeReader() {
|
|
|
|
if (!readableClosed) {
|
|
|
|
await reader.cancel(error);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!writableClosed || !readableClosed) {
|
|
|
|
Promise.all([
|
|
|
|
closeWriter(),
|
|
|
|
closeReader(),
|
|
|
|
]).then(done, done);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
done();
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
writer.closed.then(
|
|
|
|
() => {
|
|
|
|
writableClosed = true;
|
|
|
|
if (!isWritableEnded(duplex)) {
|
|
|
|
destroy(duplex, new ERR_STREAM_PREMATURE_CLOSE());
|
|
|
|
}
|
|
|
|
},
|
|
|
|
(error) => {
|
|
|
|
writableClosed = true;
|
|
|
|
readableClosed = true;
|
|
|
|
destroy(duplex, error);
|
|
|
|
},
|
|
|
|
);
|
|
|
|
|
|
|
|
reader.closed.then(
|
|
|
|
() => {
|
|
|
|
readableClosed = true;
|
|
|
|
if (!isReadableEnded(duplex)) {
|
|
|
|
duplex.push(null);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
(error) => {
|
|
|
|
writableClosed = true;
|
|
|
|
readableClosed = true;
|
|
|
|
destroy(duplex, error);
|
|
|
|
},
|
|
|
|
);
|
|
|
|
|
|
|
|
return duplex;
|
|
|
|
};
|
|
|
|
|
|
|
|
// readable-stream attaches these to Readable, but Node.js core does not.
|
|
|
|
// Delete them here to better match Node.js core. These can be removed once
|
|
|
|
// https://github.com/nodejs/readable-stream/issues/485 is resolved.
|
|
|
|
delete Readable.Duplex;
|
|
|
|
delete Readable.PassThrough;
|
|
|
|
delete Readable.Readable;
|
|
|
|
delete Readable.Stream;
|
|
|
|
delete Readable.Transform;
|
|
|
|
delete Readable.Writable;
|
|
|
|
delete Readable._isUint8Array;
|
|
|
|
delete Readable._uint8ArrayToBuffer;
|
|
|
|
delete Readable.addAbortSignal;
|
|
|
|
delete Readable.compose;
|
|
|
|
delete Readable.destroy;
|
|
|
|
delete Readable.finished;
|
|
|
|
delete Readable.isDisturbed;
|
|
|
|
delete Readable.isErrored;
|
|
|
|
delete Readable.isReadable;
|
|
|
|
delete Readable.pipeline;
|
|
|
|
|
|
|
|
// The following code implements Readable.toWeb(), Writable.toWeb(), and
|
|
|
|
// Duplex.toWeb(). These functions are not properly implemented in the
|
|
|
|
// readable-stream module yet. This can be removed once the following upstream
|
|
|
|
// issue is resolved: https://github.com/nodejs/readable-stream/issues/482
|
|
|
|
function newReadableStreamFromStreamReadable(
|
|
|
|
streamReadable,
|
|
|
|
options = kEmptyObject,
|
|
|
|
) {
|
|
|
|
// Not using the internal/streams/utils isReadableNodeStream utility
|
|
|
|
// here because it will return false if streamReadable is a Duplex
|
|
|
|
// whose readable option is false. For a Duplex that is not readable,
|
|
|
|
// we want it to pass this check but return a closed ReadableStream.
|
|
|
|
if (typeof streamReadable?._readableState !== "object") {
|
|
|
|
throw new ERR_INVALID_ARG_TYPE(
|
|
|
|
"streamReadable",
|
|
|
|
"stream.Readable",
|
|
|
|
streamReadable,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (isDestroyed(streamReadable) || !isReadable(streamReadable)) {
|
|
|
|
const readable = new ReadableStream();
|
|
|
|
readable.cancel();
|
|
|
|
return readable;
|
|
|
|
}
|
|
|
|
|
|
|
|
const objectMode = streamReadable.readableObjectMode;
|
|
|
|
const highWaterMark = streamReadable.readableHighWaterMark;
|
|
|
|
|
|
|
|
const evaluateStrategyOrFallback = (strategy) => {
|
|
|
|
// If there is a strategy available, use it
|
|
|
|
if (strategy) {
|
|
|
|
return strategy;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (objectMode) {
|
|
|
|
// When running in objectMode explicitly but no strategy, we just fall
|
|
|
|
// back to CountQueuingStrategy
|
|
|
|
return new CountQueuingStrategy({ highWaterMark });
|
|
|
|
}
|
|
|
|
|
|
|
|
// When not running in objectMode explicitly, we just fall
|
|
|
|
// back to a minimal strategy that just specifies the highWaterMark
|
|
|
|
// and no size algorithm. Using a ByteLengthQueuingStrategy here
|
|
|
|
// is unnecessary.
|
|
|
|
return { highWaterMark };
|
|
|
|
};
|
|
|
|
|
|
|
|
const strategy = evaluateStrategyOrFallback(options?.strategy);
|
|
|
|
|
|
|
|
let controller;
|
|
|
|
|
|
|
|
function onData(chunk) {
|
|
|
|
// Copy the Buffer to detach it from the pool.
|
|
|
|
if (Buffer.isBuffer(chunk) && !objectMode) {
|
|
|
|
chunk = new Uint8Array(chunk);
|
|
|
|
}
|
|
|
|
controller.enqueue(chunk);
|
|
|
|
if (controller.desiredSize <= 0) {
|
|
|
|
streamReadable.pause();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
streamReadable.pause();
|
|
|
|
|
|
|
|
const cleanup = finished(streamReadable, (error) => {
|
|
|
|
if (error?.code === "ERR_STREAM_PREMATURE_CLOSE") {
|
|
|
|
const err = new AbortError(undefined, { cause: error });
|
|
|
|
error = err;
|
|
|
|
}
|
|
|
|
|
|
|
|
cleanup();
|
|
|
|
// This is a protection against non-standard, legacy streams
|
|
|
|
// that happen to emit an error event again after finished is called.
|
|
|
|
streamReadable.on("error", () => {});
|
|
|
|
if (error) {
|
|
|
|
return controller.error(error);
|
|
|
|
}
|
|
|
|
controller.close();
|
|
|
|
});
|
|
|
|
|
|
|
|
streamReadable.on("data", onData);
|
|
|
|
|
|
|
|
return new ReadableStream({
|
|
|
|
start(c) {
|
|
|
|
controller = c;
|
|
|
|
},
|
|
|
|
|
|
|
|
pull() {
|
|
|
|
streamReadable.resume();
|
|
|
|
},
|
|
|
|
|
|
|
|
cancel(reason) {
|
|
|
|
destroy(streamReadable, reason);
|
|
|
|
},
|
|
|
|
}, strategy);
|
|
|
|
}
|
|
|
|
|
|
|
|
function newWritableStreamFromStreamWritable(streamWritable) {
|
|
|
|
// Not using the internal/streams/utils isWritableNodeStream utility
|
|
|
|
// here because it will return false if streamWritable is a Duplex
|
|
|
|
// whose writable option is false. For a Duplex that is not writable,
|
|
|
|
// we want it to pass this check but return a closed WritableStream.
|
|
|
|
if (typeof streamWritable?._writableState !== "object") {
|
|
|
|
throw new ERR_INVALID_ARG_TYPE(
|
|
|
|
"streamWritable",
|
|
|
|
"stream.Writable",
|
|
|
|
streamWritable,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (isDestroyed(streamWritable) || !isWritable(streamWritable)) {
|
|
|
|
const writable = new WritableStream();
|
|
|
|
writable.close();
|
|
|
|
return writable;
|
|
|
|
}
|
|
|
|
|
|
|
|
const highWaterMark = streamWritable.writableHighWaterMark;
|
|
|
|
const strategy = streamWritable.writableObjectMode
|
|
|
|
? new CountQueuingStrategy({ highWaterMark })
|
|
|
|
: { highWaterMark };
|
|
|
|
|
|
|
|
let controller;
|
|
|
|
let backpressurePromise;
|
|
|
|
let closed;
|
|
|
|
|
|
|
|
function onDrain() {
|
|
|
|
if (backpressurePromise !== undefined) {
|
|
|
|
backpressurePromise.resolve();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
const cleanup = finished(streamWritable, (error) => {
|
|
|
|
if (error?.code === "ERR_STREAM_PREMATURE_CLOSE") {
|
|
|
|
const err = new AbortError(undefined, { cause: error });
|
|
|
|
error = err;
|
|
|
|
}
|
|
|
|
|
|
|
|
cleanup();
|
|
|
|
// This is a protection against non-standard, legacy streams
|
|
|
|
// that happen to emit an error event again after finished is called.
|
|
|
|
streamWritable.on("error", () => {});
|
|
|
|
if (error != null) {
|
|
|
|
if (backpressurePromise !== undefined) {
|
|
|
|
backpressurePromise.reject(error);
|
|
|
|
}
|
|
|
|
// If closed is not undefined, the error is happening
|
|
|
|
// after the WritableStream close has already started.
|
|
|
|
// We need to reject it here.
|
|
|
|
if (closed !== undefined) {
|
|
|
|
closed.reject(error);
|
|
|
|
closed = undefined;
|
|
|
|
}
|
|
|
|
controller.error(error);
|
|
|
|
controller = undefined;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (closed !== undefined) {
|
|
|
|
closed.resolve();
|
|
|
|
closed = undefined;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
controller.error(new AbortError());
|
|
|
|
controller = undefined;
|
|
|
|
});
|
|
|
|
|
|
|
|
streamWritable.on("drain", onDrain);
|
|
|
|
|
|
|
|
return new WritableStream({
|
|
|
|
start(c) {
|
|
|
|
controller = c;
|
|
|
|
},
|
|
|
|
|
|
|
|
async write(chunk) {
|
|
|
|
if (streamWritable.writableNeedDrain || !streamWritable.write(chunk)) {
|
|
|
|
backpressurePromise = createDeferredPromise();
|
|
|
|
return backpressurePromise.promise.finally(() => {
|
|
|
|
backpressurePromise = undefined;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
abort(reason) {
|
|
|
|
destroy(streamWritable, reason);
|
|
|
|
},
|
|
|
|
|
|
|
|
close() {
|
|
|
|
if (closed === undefined && !isWritableEnded(streamWritable)) {
|
|
|
|
closed = createDeferredPromise();
|
|
|
|
streamWritable.end();
|
|
|
|
return closed.promise;
|
|
|
|
}
|
|
|
|
|
|
|
|
controller = undefined;
|
|
|
|
return Promise.resolve();
|
|
|
|
},
|
|
|
|
}, strategy);
|
|
|
|
}
|
|
|
|
|
|
|
|
function newReadableWritablePairFromDuplex(duplex) {
|
|
|
|
// Not using the internal/streams/utils isWritableNodeStream and
|
|
|
|
// isReadableNodestream utilities here because they will return false
|
|
|
|
// if the duplex was created with writable or readable options set to
|
|
|
|
// false. Instead, we'll check the readable and writable state after
|
|
|
|
// and return closed WritableStream or closed ReadableStream as
|
|
|
|
// necessary.
|
|
|
|
if (
|
|
|
|
typeof duplex?._writableState !== "object" ||
|
|
|
|
typeof duplex?._readableState !== "object"
|
|
|
|
) {
|
|
|
|
throw new ERR_INVALID_ARG_TYPE("duplex", "stream.Duplex", duplex);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (isDestroyed(duplex)) {
|
|
|
|
const writable = new WritableStream();
|
|
|
|
const readable = new ReadableStream();
|
|
|
|
writable.close();
|
|
|
|
readable.cancel();
|
|
|
|
return { readable, writable };
|
|
|
|
}
|
|
|
|
|
|
|
|
const writable = isWritable(duplex)
|
|
|
|
? newWritableStreamFromStreamWritable(duplex)
|
|
|
|
: new WritableStream();
|
|
|
|
|
|
|
|
if (!isWritable(duplex)) {
|
|
|
|
writable.close();
|
|
|
|
}
|
|
|
|
|
|
|
|
const readable = isReadable(duplex)
|
|
|
|
? newReadableStreamFromStreamReadable(duplex)
|
|
|
|
: new ReadableStream();
|
|
|
|
|
|
|
|
if (!isReadable(duplex)) {
|
|
|
|
readable.cancel();
|
|
|
|
}
|
|
|
|
|
|
|
|
return { writable, readable };
|
|
|
|
}
|
|
|
|
|
|
|
|
Readable.toWeb = newReadableStreamFromStreamReadable;
|
|
|
|
Writable.toWeb = newWritableStreamFromStreamWritable;
|
|
|
|
Duplex.toWeb = newReadableWritablePairFromDuplex;
|