

















@@ -1,6 +1,7 @@
11import { execFileSync } from "node:child_process";
22import { resolve } from "node:path";
33import { validateExternalCodePluginPackageJson } from "../../packages/plugin-package-contract/src/index.ts";
4+import { readBoundedResponseText } from "./bounded-response.ts";
45import {
56collectExtensionPackageJsonCandidates,
67collectChangedPathsFromGitRange,
@@ -80,6 +81,7 @@ const CLAWHUB_SHARED_RELEASE_INPUT_PATHS = [
8081"package.json",
8182"pnpm-lock.yaml",
8283"packages/plugin-package-contract/src/index.ts",
84+"scripts/lib/bounded-response.ts",
8385"scripts/lib/npm-publish-plan.mjs",
8486"scripts/lib/plugin-npm-release.ts",
8587"scripts/lib/plugin-clawhub-release.ts",
@@ -99,60 +101,16 @@ function getRegistryBaseUrl(explicit?: string) {
99101);
100102}
101103102-async function readBoundedResponseText(
103-response: Response,
104-label: string,
105-maxBytes = CLAWHUB_RESPONSE_BODY_MAX_BYTES,
106-): Promise<string> {
107-const contentLength = Number.parseInt(response.headers.get("content-length") ?? "", 10);
108-if (Number.isFinite(contentLength) && contentLength > maxBytes) {
109-throw new Error(`${label} response body exceeded ${maxBytes} bytes.`);
110-}
111-112-if (!response.body) {
113-return "";
114-}
115-116-const reader = response.body.getReader();
117-const decoder = new TextDecoder();
118-const chunks: string[] = [];
119-let totalBytes = 0;
120-let canceled = false;
121-122-try {
123-for (;;) {
124-const { done, value } = await reader.read();
125-if (done) {
126-const tail = decoder.decode();
127-if (tail) {
128-chunks.push(tail);
129-}
130-break;
131-}
132-133-totalBytes += value.byteLength;
134-if (totalBytes > maxBytes) {
135-canceled = true;
136-await reader.cancel().catch(() => undefined);
137-throw new Error(`${label} response body exceeded ${maxBytes} bytes.`);
138-}
139-chunks.push(decoder.decode(value, { stream: true }));
140-}
141-} finally {
142-if (!canceled) {
143-reader.releaseLock();
144-}
145-}
146-147-return chunks.join("");
148-}
149-150104async function readClawHubPackageOwnerDetail(
151105response: Response,
152106packageName: string,
153107): Promise<ClawHubPackageOwnerDetail> {
154108return JSON.parse(
155-await readBoundedResponseText(response, `ClawHub package owner response for ${packageName}`),
109+await readBoundedResponseText(
110+response,
111+`ClawHub package owner response for ${packageName}`,
112+CLAWHUB_RESPONSE_BODY_MAX_BYTES,
113+),
156114) as ClawHubPackageOwnerDetail;
157115}
158116此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。