From d4cabc3a36080238069c7974ce890339588c74cc Mon Sep 17 00:00:00 2001 From: Sawyer Hood Date: Thu, 10 Sep 2026 21:42:56 -0700 Subject: [PATCH] Fix SDK installer response reader dispatch --- packages/sdk/src/areas/hosts.ts | 5 +- .../sdk/test/host-installer-response.test.ts | 58 +++++++++++++++++++ 2 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 packages/sdk/test/host-installer-response.test.ts diff --git a/packages/sdk/src/areas/hosts.ts b/packages/sdk/src/areas/hosts.ts index 051642b2d39..38f39764d27 100644 --- a/packages/sdk/src/areas/hosts.ts +++ b/packages/sdk/src/areas/hosts.ts @@ -16,6 +16,7 @@ import type { HostRetryUpdateResponse, UpdateHostRequest, } from "@bb/server-contract"; +import type { SdkResponseLike } from "../response.js"; import { signalRequestArgs, type CreateSdkAreaArgs } from "./common.js"; export interface HostGetArgs { @@ -144,7 +145,7 @@ export function createHostsArea(args: CreateSdkAreaArgs): HostsArea { ); }, async installProviderCli(input) { - const response = await transport.resolve( + const response: SdkResponseLike = await transport.resolve( transport.api.v1.hosts[":id"]["provider-clis"].install.$post({ param: { id: input.hostId }, json: { @@ -153,7 +154,7 @@ export function createHostsArea(args: CreateSdkAreaArgs): HostsArea { }, }), ); - const text = await Response.prototype.text.call(response); + const text = await response.text(); return text .split(/\r?\n/u) .filter((line) => line.trim().length > 0) diff --git a/packages/sdk/test/host-installer-response.test.ts b/packages/sdk/test/host-installer-response.test.ts new file mode 100644 index 00000000000..a147f862a2c --- /dev/null +++ b/packages/sdk/test/host-installer-response.test.ts @@ -0,0 +1,58 @@ +import { afterEach, describe, expect, it, vi } from "vitest"; +import { createBbSdk } from "../src/core.js"; +import { createHttpTransport } from "../src/transport-http.js"; + +const NativeResponse = globalThis.Response; + +class AlternateResponse extends NativeResponse { + #readText = () => super.text(); + + override text(): Promise { + return this.#readText(); + } +} + +afterEach(() => { + vi.unstubAllGlobals(); +}); + +describe("host installer response readers", () => { + it("reads native installer events when the global Response is replaced", async () => { + const events = [ + { type: "started", provider: "test-provider", command: "test-installer" }, + { + type: "output", + provider: "test-provider", + stream: "stdout", + text: "ready", + }, + { + type: "completed", + provider: "test-provider", + exitCode: 0, + signal: null, + success: true, + }, + ]; + const response = new NativeResponse( + events.map((event) => JSON.stringify(event)).join("\r\n\n") + "\n", + ); + const sdk = createBbSdk({ + transport: createHttpTransport({ + baseUrl: "http://bb.test", + runtime: "node", + fetch: async () => response, + }), + }); + vi.stubGlobal("Response", AlternateResponse); + + await expect( + sdk.hosts.installProviderCli({ + hostId: "test-host", + provider: "test-provider", + actionKind: "update", + }), + ).resolves.toEqual(events); + expect(response.bodyUsed).toBe(true); + }); +});