| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- import { afterEach, describe, expect, test } from "bun:test"
- import { Log } from "../../src/util/log"
- import { WorkspaceServer } from "../../src/control-plane/workspace-server/server"
- import { parseSSE } from "../../src/control-plane/sse"
- import { GlobalBus } from "../../src/bus/global"
- import { resetDatabase } from "../fixture/db"
- import { tmpdir } from "../fixture/fixture"
- afterEach(async () => {
- await resetDatabase()
- })
- Log.init({ print: false })
- describe("control-plane/workspace-server SSE", () => {
- test("streams GlobalBus events and parseSSE reads them", async () => {
- await using tmp = await tmpdir({ git: true })
- const app = WorkspaceServer.App()
- const stop = new AbortController()
- const seen: unknown[] = []
- try {
- const response = await app.request("/event", {
- signal: stop.signal,
- headers: {
- "x-opencode-workspace": "wrk_test_workspace",
- "x-opencode-directory": tmp.path,
- },
- })
- expect(response.status).toBe(200)
- expect(response.body).toBeDefined()
- const done = new Promise<void>((resolve, reject) => {
- const timeout = setTimeout(() => {
- reject(new Error("timed out waiting for workspace.test event"))
- }, 3000)
- void parseSSE(response.body!, stop.signal, (event) => {
- seen.push(event)
- const next = event as { type?: string }
- if (next.type === "server.connected") {
- GlobalBus.emit("event", {
- payload: {
- type: "workspace.test",
- properties: { ok: true },
- },
- })
- return
- }
- if (next.type !== "workspace.test") return
- clearTimeout(timeout)
- resolve()
- }).catch((error) => {
- clearTimeout(timeout)
- reject(error)
- })
- })
- await done
- expect(seen.some((event) => (event as { type?: string }).type === "server.connected")).toBe(true)
- expect(seen).toContainEqual({
- type: "workspace.test",
- properties: { ok: true },
- })
- } finally {
- stop.abort()
- }
- })
- })
|