@@ -4,7 +4,6 @@ import {
|
4 | 4 | MIN_CLIENT_PROTOCOL_VERSION, |
5 | 5 | PROTOCOL_VERSION, |
6 | 6 | } from "../../packages/gateway-protocol/src/version.js"; |
7 | | -import { createArgReader, createGatewayWsClient, resolveGatewayUrl } from "./gateway-ws-client.ts"; |
8 | 7 | |
9 | 8 | function writeStdoutLine(message = ""): void { |
10 | 9 | process.stdout.write(`${message}\n`); |
@@ -18,6 +17,13 @@ function writeStderrLine(message: string): void {
|
18 | 17 | process.stderr.write(`${message}\n`); |
19 | 18 | } |
20 | 19 | |
| 20 | +const argv = process.argv.slice(2); |
| 21 | +const getArg = (flag: string) => { |
| 22 | +const index = argv.indexOf(flag); |
| 23 | +return index === -1 ? undefined : argv[index + 1]; |
| 24 | +}; |
| 25 | +const hasFlag = (flag: string) => argv.includes(flag); |
| 26 | + |
21 | 27 | type NodeListPayload = { |
22 | 28 | ts?: number; |
23 | 29 | nodes?: Array<{ |
@@ -33,8 +39,6 @@ type NodeListPayload = {
|
33 | 39 | |
34 | 40 | type NodeListNode = NonNullable<NodeListPayload["nodes"]>[number]; |
35 | 41 | |
36 | | -const { get: getArg, has: hasFlag } = createArgReader(); |
37 | | - |
38 | 42 | const urlRaw = getArg("--url") ?? process.env.OPENCLAW_GATEWAY_URL; |
39 | 43 | const token = getArg("--token") ?? process.env.OPENCLAW_GATEWAY_TOKEN; |
40 | 44 | const nodeHint = getArg("--node"); |
@@ -49,6 +53,8 @@ if (!urlRaw || !token) {
|
49 | 53 | process.exit(1); |
50 | 54 | } |
51 | 55 | |
| 56 | +const waitSeconds = parseWaitSeconds(getArg("--wait-seconds")); |
| 57 | +const { createGatewayWsClient, resolveGatewayUrl } = await import("./gateway-ws-client.ts"); |
52 | 58 | const url = resolveGatewayUrl(urlRaw); |
53 | 59 | |
54 | 60 | const isoNow = () => new Date().toISOString(); |
@@ -79,6 +85,21 @@ function formatErr(err: unknown): string {
|
79 | 85 | } |
80 | 86 | } |
81 | 87 | |
| 88 | +function parseWaitSeconds(raw: string | undefined): number { |
| 89 | +const value = raw ?? "25"; |
| 90 | +const text = value.trim(); |
| 91 | +if (!/^[1-9]\d*$/u.test(text)) { |
| 92 | +writeStderrLine(`--wait-seconds must be a positive integer; got: ${value}`); |
| 93 | +process.exit(1); |
| 94 | +} |
| 95 | +const parsed = Number(text); |
| 96 | +if (!Number.isSafeInteger(parsed)) { |
| 97 | +writeStderrLine(`--wait-seconds must be a safe positive integer; got: ${value}`); |
| 98 | +process.exit(1); |
| 99 | +} |
| 100 | +return parsed; |
| 101 | +} |
| 102 | + |
82 | 103 | function isRecord(value: unknown): value is Record<string, unknown> { |
83 | 104 | return Boolean(value && typeof value === "object" && !Array.isArray(value)); |
84 | 105 | } |
@@ -190,7 +211,6 @@ async function main() {
|
190 | 211 | const listPayload = (nodesRes.payload ?? {}) as NodeListPayload; |
191 | 212 | let node = pickIosNode(listPayload, nodeHint); |
192 | 213 | if (!node) { |
193 | | -const waitSeconds = Number.parseInt(getArg("--wait-seconds") ?? "25", 10); |
194 | 214 | const deadline = Date.now() + Math.max(1, waitSeconds) * 1000; |
195 | 215 | while (!node && Date.now() < deadline) { |
196 | 216 | await new Promise((r) => { |
|