Files
SnowLuma/.pnpm-store/v11/files/7f/0923926dd7224bf1371bd2d3c1392c55c5b2a01cc8adb5f63222c06998365b8bcff6b7c3a26e68fc1b9f0cc3ae6a6bcaa145fe370e2a700909f7b14ca57c58
TanTan 2a69b23b47
Dev Build / cleanup (push) Canceled after 0s
Dev Build / typecheck (push) Canceled after 0s
Dev Build / build (linux-arm64, ubuntu-24.04-arm, linux-arm64) (push) Canceled after 0s
Dev Build / build (linux-x64, ubuntu-latest, linux-x64) (push) Canceled after 0s
Dev Build / build (win-x64, windows-latest, win32-x64) (push) Canceled after 0s
Dev Build / dispatch-dev-docker (push) Canceled after 0s
docs: 仓库链接指向本镜像仓库
2026-11-13 09:27:07 +08:00

64 lines
1.6 KiB
Plaintext

import { Readable } from "node:stream";
import { versions } from "node:process";
//#region src/utils/stream.ts
const pr54206Applied = () => {
const [major, minor] = versions.node.split(".").map((component) => parseInt(component));
return major >= 23 || major === 22 && minor >= 7 || major === 20 && minor >= 18;
};
const useReadableToWeb = pr54206Applied();
const createStreamBody = (stream, useNativeReadableToWeb = useReadableToWeb) => {
if (useNativeReadableToWeb) return Readable.toWeb(stream);
let controller;
let settled = false;
const cleanup = () => {
stream.off("data", onData);
stream.off("error", onError);
stream.off("end", onTerminate);
stream.off("close", onTerminate);
};
const settle = (callback) => {
if (settled) return;
settled = true;
cleanup();
callback?.();
};
const onData = (chunk) => {
if (settled || !controller) return;
controller.enqueue(chunk);
if ((controller.desiredSize ?? 0) <= 0) stream.pause();
};
const onError = (error) => {
settle(() => {
controller?.error(error);
});
};
const onTerminate = () => {
settle(() => {
controller?.close();
});
};
return new ReadableStream({
start(streamController) {
controller = streamController;
stream.on("data", onData);
stream.on("error", onError);
stream.on("end", onTerminate);
stream.on("close", onTerminate);
stream.pause();
},
pull() {
if (!settled) stream.resume();
},
cancel() {
settle();
const ignoreError = () => {};
stream.on("error", ignoreError);
stream.once("close", () => stream.off("error", ignoreError));
stream.destroy();
}
});
};
//#endregion
export { createStreamBody };