mirror of
https://github.com/anomalyco/opencode.git
synced 2026-11-09 22:25:02 +03:00
66 lines
2.9 KiB
TypeScript
66 lines
2.9 KiB
TypeScript
import { expect, test } from "bun:test"
|
|
import { mkdir } from "node:fs/promises"
|
|
import { join } from "node:path"
|
|
import { tmpdir } from "../../core/test/fixture/tmpdir"
|
|
import { OpenCode, Session } from "../src"
|
|
|
|
test("Promise host uses the embedded router", async () => {
|
|
await using directory = await tmpdir("opencode-promise-sdk-")
|
|
const config = join(directory.path, "config")
|
|
await mkdir(config)
|
|
const opencode = await OpenCode.create({
|
|
events: { persist: true },
|
|
config: { directory: config, project: false, content: "{}" },
|
|
})
|
|
|
|
try {
|
|
const location = { directory: directory.path }
|
|
const session = await opencode.sessions.create({ location })
|
|
const selected = await opencode.sessions.get({ sessionID: session.id })
|
|
const page = await opencode.sessions.list({ directory: directory.path })
|
|
const events = Array.fromAsync(opencode.experimental.session.log({ sessionID: session.id }))
|
|
|
|
expect(selected.id).toBe(session.id)
|
|
expect(page.data.some((item) => item.id === session.id)).toBe(true)
|
|
expect((await events).some((event) => event.type === "session.created")).toBe(true)
|
|
|
|
const missingSessionID = Session.ID.create()
|
|
const missing = await opencode.sessions.get({ sessionID: missingSessionID }).catch((error: unknown) => error)
|
|
expect(missing).toMatchObject({ _tag: "SessionNotFoundError", sessionID: missingSessionID })
|
|
} finally {
|
|
await opencode.close()
|
|
await opencode.close()
|
|
}
|
|
})
|
|
|
|
test("Promise event streams support cancellation", async () => {
|
|
await using directory = await tmpdir("opencode-promise-stream-")
|
|
const config = join(directory.path, "config")
|
|
await mkdir(config)
|
|
{
|
|
await using opencode = await OpenCode.create({ config: { directory: config, project: false, content: "{}" } })
|
|
const controller = new AbortController()
|
|
const events = opencode.events.subscribe({ signal: controller.signal })[Symbol.asyncIterator]()
|
|
expect(await events.next()).toMatchObject({ value: { type: "server.connected" }, done: false })
|
|
const pending = events.next()
|
|
controller.abort()
|
|
// A caller abort ends only this subscriber; client tests pin closing the shared transport after the last one.
|
|
expect(await pending).toEqual({ done: true, value: undefined })
|
|
await events.return?.()
|
|
}
|
|
})
|
|
|
|
test("closing cancels active Promise event streams", async () => {
|
|
await using directory = await tmpdir("opencode-promise-stream-close-")
|
|
const config = join(directory.path, "config")
|
|
await mkdir(config)
|
|
const opencode = await OpenCode.create({ config: { directory: config, project: false, content: "{}" } })
|
|
const events = opencode.events.subscribe()[Symbol.asyncIterator]()
|
|
expect(await events.next()).toMatchObject({ value: { type: "server.connected" }, done: false })
|
|
const pending = events.next()
|
|
|
|
await opencode.close()
|
|
const error = await pending.catch((error: unknown) => error)
|
|
expect(error).toMatchObject({ name: "ClientError", reason: "Transport" })
|
|
})
|