






















1+import { fileURLToPath } from "node:url";
12import {
23MIN_CLIENT_PROTOCOL_VERSION,
34PROTOCOL_VERSION,
@@ -12,69 +13,94 @@ function writeStderrLine(message: string): void {
1213process.stderr.write(`${message}\n`);
1314}
141515-const { get: getArg } = createArgReader();
16-const urlRaw = getArg("--url") ?? process.env.OPENCLAW_GATEWAY_URL;
17-const token = getArg("--token") ?? process.env.OPENCLAW_GATEWAY_TOKEN;
18-19-if (!urlRaw || !token) {
16+function writeUsage(): void {
2017writeStderrLine(
2118"Usage: bun scripts/dev/gateway-smoke.ts --url <wss://host[:port]> --token <gateway.auth.token>\n" +
2219"Or set env: OPENCLAW_GATEWAY_URL / OPENCLAW_GATEWAY_TOKEN",
2320);
24-process.exit(1);
2521}
262227-async function main() {
28-const url = resolveGatewayUrl(urlRaw);
29-const { request, waitOpen, close } = createGatewayWsClient({
23+type GatewaySmokeClient = ReturnType<typeof createGatewayWsClient>;
24+25+type GatewaySmokeDeps = {
26+createClient?: typeof createGatewayWsClient;
27+stderr?: (message: string) => void;
28+stdout?: (message: string) => void;
29+};
30+31+export async function runGatewaySmoke(
32+input: { token: string; urlRaw: string },
33+deps: GatewaySmokeDeps = {},
34+): Promise<number> {
35+const url = resolveGatewayUrl(input.urlRaw);
36+const createClient = deps.createClient ?? createGatewayWsClient;
37+const stderr = deps.stderr ?? writeStderrLine;
38+const stdout = deps.stdout ?? writeStdoutLine;
39+const client: GatewaySmokeClient = createClient({
3040url: url.toString(),
3141onEvent: (evt) => {
3242// Ignore noisy connect handshakes.
3343void evt;
3444},
3545});
46+const { request, waitOpen, close } = client;
364737-await waitOpen();
48+try {
49+await waitOpen();
385039-// Match iOS "operator" session defaults: token auth, no device identity.
40-const connectRes = await request("connect", {
41-minProtocol: MIN_CLIENT_PROTOCOL_VERSION,
42-maxProtocol: PROTOCOL_VERSION,
43-client: {
44-id: "openclaw-ios",
45-displayName: "openclaw gateway smoke test",
46-version: "dev",
47-platform: "dev",
48-mode: "ui",
49-instanceId: "openclaw-dev-smoke",
50-},
51-locale: "en-US",
52-userAgent: "gateway-smoke",
53-role: "operator",
54-scopes: ["operator.read", "operator.write", "operator.admin"],
55-caps: [],
56-auth: { token },
57-});
51+ // Match iOS "operator" session defaults: token auth, no device identity.
52+ const connectRes = await request("connect", {
53+ minProtocol: MIN_CLIENT_PROTOCOL_VERSION,
54+ maxProtocol: PROTOCOL_VERSION,
55+ client: {
56+ id: "openclaw-ios",
57+ displayName: "openclaw gateway smoke test",
58+ version: "dev",
59+ platform: "dev",
60+ mode: "ui",
61+ instanceId: "openclaw-dev-smoke",
62+ },
63+ locale: "en-US",
64+ userAgent: "gateway-smoke",
65+ role: "operator",
66+ scopes: ["operator.read", "operator.write", "operator.admin"],
67+ caps: [],
68+ auth: { token: input.token },
69+ });
587059-if (!connectRes.ok) {
60-writeStderrLine(`connect failed: ${String(connectRes.error)}`);
61-process.exit(2);
62-}
71+ if (!connectRes.ok) {
72+ stderr(`connect failed: ${String(connectRes.error)}`);
73+ return 2;
74+ }
637564-const healthRes = await request("health");
65-if (!healthRes.ok) {
66-writeStderrLine(`health failed: ${String(healthRes.error)}`);
67-process.exit(3);
68-}
76+ const healthRes = await request("health");
77+ if (!healthRes.ok) {
78+ stderr(`health failed: ${String(healthRes.error)}`);
79+ return 3;
80+ }
698170-const historyRes = await request("chat.history", { sessionKey: "main" }, 15000);
71-if (!historyRes.ok) {
72-writeStderrLine(`chat.history failed: ${String(historyRes.error)}`);
73-process.exit(4);
74-}
82+ const historyRes = await request("chat.history", { sessionKey: "main" }, 15000);
83+ if (!historyRes.ok) {
84+ stderr(`chat.history failed: ${String(historyRes.error)}`);
85+ return 4;
86+ }
758776-writeStdoutLine("ok: connected + health + chat.history");
77-close();
88+stdout("ok: connected + health + chat.history");
89+return 0;
90+} finally {
91+close();
92+}
7893}
799480-await main();
95+if (process.argv[1] && fileURLToPath(import.meta.url) === process.argv[1]) {
96+const { get: getArg } = createArgReader();
97+const urlRaw = getArg("--url") ?? process.env.OPENCLAW_GATEWAY_URL;
98+const token = getArg("--token") ?? process.env.OPENCLAW_GATEWAY_TOKEN;
99+100+if (!urlRaw || !token) {
101+writeUsage();
102+process.exitCode = 1;
103+} else {
104+process.exitCode = await runGatewaySmoke({ token, urlRaw });
105+}
106+}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。