import { afterEach, describe, expect, test } from "bun:test" import type { UpgradeWebSocket } from "hono/ws" import { Flag } from "@opencode-ai/core/flag/flag" import { Instance } from "../../src/project/instance" import { InstanceRoutes } from "../../src/server/routes/instance" import { EventPaths } from "../../src/server/routes/instance/httpapi/event" import { Log } from "../../src/util" import { resetDatabase } from "../fixture/db" import { tmpdir } from "../fixture/fixture" void Log.init({ print: false }) const original = Flag.OPENCODE_EXPERIMENTAL_HTTPAPI const websocket = (() => () => new Response(null, { status: 501 })) as unknown as UpgradeWebSocket function app() { Flag.OPENCODE_EXPERIMENTAL_HTTPAPI = true return InstanceRoutes(websocket) } async function readFirstChunk(response: Response) { if (!response.body) throw new Error("missing response body") const reader = response.body.getReader() const result = await Promise.race([ reader.read(), new Promise((_, reject) => setTimeout(() => reject(new Error("timed out waiting for event")), 5_000)), ]) await reader.cancel() return new TextDecoder().decode(result.value) } afterEach(async () => { Flag.OPENCODE_EXPERIMENTAL_HTTPAPI = original await Instance.disposeAll() await resetDatabase() }) describe("event HttpApi bridge", () => { test("serves event stream through experimental Effect route", async () => { await using tmp = await tmpdir({ git: true, config: { formatter: false, lsp: false } }) const response = await app().request(EventPaths.event, { headers: { "x-opencode-directory": tmp.path } }) expect(response.status).toBe(200) expect(response.headers.get("content-type")).toContain("text/event-stream") expect(response.headers.get("cache-control")).toBe("no-cache, no-transform") expect(response.headers.get("x-accel-buffering")).toBe("no") expect(response.headers.get("x-content-type-options")).toBe("nosniff") expect(await readFirstChunk(response)).toContain('data: {"type":"server.connected","properties":{}}\n\n') }) })