Files
openclaw/extensions/codex/src/app-server/transport-websocket.test.ts
2026-04-10 23:07:25 +01:00

72 lines
2.3 KiB
TypeScript

import { afterEach, describe, expect, it } from "vitest";
import { WebSocketServer, type RawData } from "ws";
import { CodexAppServerClient } from "./client.js";
describe("Codex app-server websocket transport", () => {
const clients: CodexAppServerClient[] = [];
const servers: WebSocketServer[] = [];
afterEach(async () => {
for (const client of clients) {
client.close();
}
clients.length = 0;
await Promise.all(
servers
.splice(0)
.map(
(server) =>
new Promise<void>((resolve, reject) =>
server.close((error) => (error ? reject(error) : resolve())),
),
),
);
});
it("can speak JSON-RPC over websocket transport", async () => {
const server = new WebSocketServer({ host: "127.0.0.1", port: 0 });
servers.push(server);
const authHeaders: Array<string | undefined> = [];
server.on("connection", (socket, request) => {
authHeaders.push(request.headers.authorization);
socket.on("message", (data) => {
const message = JSON.parse(rawDataToText(data)) as { id?: number; method?: string };
if (message.method === "initialize") {
socket.send(
JSON.stringify({ id: message.id, result: { userAgent: "openclaw/0.118.0" } }),
);
return;
}
if (message.method === "model/list") {
socket.send(JSON.stringify({ id: message.id, result: { data: [] } }));
}
});
});
await new Promise<void>((resolve) => server.once("listening", resolve));
const address = server.address();
if (!address || typeof address === "string") {
throw new Error("expected websocket test server port");
}
const client = CodexAppServerClient.start({
transport: "websocket",
url: `ws://127.0.0.1:${address.port}`,
authToken: "secret",
});
clients.push(client);
await expect(client.initialize()).resolves.toBeUndefined();
await expect(client.request("model/list", {})).resolves.toEqual({ data: [] });
expect(authHeaders).toEqual(["Bearer secret"]);
});
});
function rawDataToText(data: RawData): string {
if (Buffer.isBuffer(data)) {
return data.toString("utf8");
}
if (Array.isArray(data)) {
return Buffer.concat(data).toString("utf8");
}
return Buffer.from(data).toString("utf8");
}