#!/usr/bin/env runts -- --allow-all import {parseArgs} from "jsr:@std/cli/parse-args"; import {exit, log} from "../libraries/deno-commons-mod.ts"; import net from "node:net"; function parseFlags(): any { const flags = parseArgs(Deno.args, { boolean: ["help"], string: ["port", "timeout"], }); const helpMessage = `wait-port-ready.ts - wait assigned port ready wait-port-ready.ts --port PORT [--timeout TIMEOUT] wait for PORT with TIMEOUT(default 120 seconds) `; if (flags.help) { console.log(helpMessage); exit(0); } return flags; } async function tryConnection(port, host = "127.0.0.1") { return new Promise((resolve, reject) => { const socket = new net.Socket(); socket.setTimeout(1000); socket.connect(port, host, () => { socket.destroy(); resolve(true); }); socket.on("error", (err) => { socket.destroy(); reject(err); }); socket.on("timeout", () => { socket.destroy(); reject(new Error("Connect timeout")); }); }); } async function main(): Promise { const flags = parseFlags(); if (!flags["port"]) { log.error("--port is required"); exit(1); } const port = parseInt(flags.port, 10); if (isNaN(port) || port < 1 || port > 65535) { log.error("invalid port"); exit(1); } const timeout = parseInt(flags.timeout ?? "120", 10); if (isNaN(timeout) || timeout < 0) { log.error("invalid timeout"); exit(1); } const timeoutMs = timeout * 1000; const now = Date.now(); do { try { await tryConnection(port); log.success("wait port ready successfully"); exit(0); } catch (e) { log.debug("try connection failed", e); } } while (Date.now() - now < timeoutMs); log.error("wait port ready timeout"); exit(1); } main().catch((err) => { log.error(err); exit(1); }).then(() => exit(0)); // @SCRIPT-SIGNATURE-V1: yk-r1.ES256.20260418T201602+08:00.MEUCIQDpTub0iUDo7BL+2OOu // h9QWno5DgrxAQHPORcan1tiWGQIgbvQTCm/IoLMt6GE1p2X/jt/tph02Uz2cem0Q9MRmvZo=