mirror of
https://github.com/openclaw/openclaw.git
synced 2026-04-14 02:31:24 +00:00
72 lines
2.3 KiB
TypeScript
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");
|
|
}
|