cloudaxe-opencode/packages/opencode/test/util/rpc.test.ts
2026-06-04 05:59:15 +00:00

45 lines
1.3 KiB
TypeScript

import { describe, expect, test } from "bun:test"
import { Rpc } from "../../src/util/rpc"
type Endpoint = {
postMessage(data: string): void
onmessage: ((this: Worker, ev: MessageEvent<string>) => unknown) | null
}
function message(data: string) {
return new MessageEvent("message", { data })
}
describe("util.rpc", () => {
test("rejects calls when the handler throws", async () => {
const main: Endpoint = {
onmessage: null,
postMessage(data) {
queueMicrotask(() => worker.onmessage?.call({} as Worker, message(data)))
},
}
const worker: Endpoint = {
onmessage: null,
postMessage(data) {
queueMicrotask(() => main.onmessage?.call({} as Worker, message(data)))
},
}
const previousOnMessage = globalThis.onmessage
const previousPostMessage = globalThis.postMessage
try {
globalThis.postMessage = worker.postMessage
Rpc.listen({
boom() {
throw new Error("boom")
},
})
worker.onmessage = globalThis.onmessage as Endpoint["onmessage"]
await expect(Rpc.client(main).call("boom", undefined)).rejects.toThrow("boom")
} finally {
globalThis.onmessage = previousOnMessage
globalThis.postMessage = previousPostMessage
}
})
})