diff --git a/scripts/openclaw-cross-os-release-checks.ts b/scripts/openclaw-cross-os-release-checks.ts index 23902047d377..fc8065232ad7 100644 --- a/scripts/openclaw-cross-os-release-checks.ts +++ b/scripts/openclaw-cross-os-release-checks.ts @@ -2741,16 +2741,21 @@ async function postDiscordMessage(params) { } } -async function deleteDiscordMessage(params) { +export async function deleteDiscordMessage(params) { if (!params.messageId) { return; } - await fetch( - `https://discord.com/api/v10/channels/${params.channelId}/messages/${params.messageId}`, - buildDiscordFetchInit(params.token, { - method: "DELETE", - }), - ).catch(() => undefined); + try { + const response = await fetch( + `https://discord.com/api/v10/channels/${params.channelId}/messages/${params.messageId}`, + buildDiscordFetchInit(params.token, { + method: "DELETE", + }), + ); + await response.body?.cancel?.().catch(() => undefined); + } catch { + // Cleanup is best-effort; the smoke result should not fail after readback succeeds. + } } async function waitForInstalledDiscordReadback(params) { diff --git a/test/scripts/openclaw-cross-os-release-checks.test.ts b/test/scripts/openclaw-cross-os-release-checks.test.ts index f66486627de3..6815236fce43 100644 --- a/test/scripts/openclaw-cross-os-release-checks.test.ts +++ b/test/scripts/openclaw-cross-os-release-checks.test.ts @@ -50,6 +50,7 @@ import { CROSS_OS_DISCORD_FETCH_TIMEOUT_MS, CROSS_OS_AGENT_TURN_TIMEOUT_SECONDS, CROSS_OS_COMMAND_HEARTBEAT_SECONDS, + deleteDiscordMessage, isImmutableReleaseRef, isRecoverableWindowsPackagedUpgradeSwapCleanupFailure, isRecoverableWindowsPackagedUpgradeTimeoutError, @@ -1470,6 +1471,31 @@ describe("scripts/openclaw-cross-os-release-checks", () => { expect(init.signal).toBeInstanceOf(AbortSignal); }); + it("cancels Discord delete response bodies", async () => { + let canceled = false; + const originalFetch = globalThis.fetch; + globalThis.fetch = (async () => + new Response( + new ReadableStream({ + cancel() { + canceled = true; + }, + }), + { status: 200 }, + )) as typeof fetch; + try { + await deleteDiscordMessage({ + channelId: "channel-123", + messageId: "message-456", + token: "discord-token", + }); + } finally { + globalThis.fetch = originalFetch; + } + + expect(canceled).toBe(true); + }); + it("keeps the dev-update lane for main only", () => { expect(shouldRunMainChannelDevUpdate("main")).toBe(true); expect(shouldRunMainChannelDevUpdate("08753a1d793c040b101c8a26c43445dbbab14995")).toBe(false);