workspace-server-sse.test.ts 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import { afterEach, describe, expect, test } from "bun:test"
  2. import { Log } from "../../src/util/log"
  3. import { WorkspaceServer } from "../../src/control-plane/workspace-server/server"
  4. import { parseSSE } from "../../src/control-plane/sse"
  5. import { GlobalBus } from "../../src/bus/global"
  6. import { resetDatabase } from "../fixture/db"
  7. import { tmpdir } from "../fixture/fixture"
  8. afterEach(async () => {
  9. await resetDatabase()
  10. })
  11. Log.init({ print: false })
  12. describe("control-plane/workspace-server SSE", () => {
  13. test("streams GlobalBus events and parseSSE reads them", async () => {
  14. await using tmp = await tmpdir({ git: true })
  15. const app = WorkspaceServer.App()
  16. const stop = new AbortController()
  17. const seen: unknown[] = []
  18. try {
  19. const response = await app.request("/event", {
  20. signal: stop.signal,
  21. headers: {
  22. "x-opencode-workspace": "wrk_test_workspace",
  23. "x-opencode-directory": tmp.path,
  24. },
  25. })
  26. expect(response.status).toBe(200)
  27. expect(response.body).toBeDefined()
  28. const done = new Promise<void>((resolve, reject) => {
  29. const timeout = setTimeout(() => {
  30. reject(new Error("timed out waiting for workspace.test event"))
  31. }, 3000)
  32. void parseSSE(response.body!, stop.signal, (event) => {
  33. seen.push(event)
  34. const next = event as { type?: string }
  35. if (next.type === "server.connected") {
  36. GlobalBus.emit("event", {
  37. payload: {
  38. type: "workspace.test",
  39. properties: { ok: true },
  40. },
  41. })
  42. return
  43. }
  44. if (next.type !== "workspace.test") return
  45. clearTimeout(timeout)
  46. resolve()
  47. }).catch((error) => {
  48. clearTimeout(timeout)
  49. reject(error)
  50. })
  51. })
  52. await done
  53. expect(seen.some((event) => (event as { type?: string }).type === "server.connected")).toBe(true)
  54. expect(seen).toContainEqual({
  55. type: "workspace.test",
  56. properties: { ok: true },
  57. })
  58. } finally {
  59. stop.abort()
  60. }
  61. })
  62. })