From ba08f220298fde3a7838f64c7f214727d5e67146 Mon Sep 17 00:00:00 2001 From: Hatter Jiang Date: Sat, 18 Apr 2026 20:17:15 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=86=95=20Add=20new=20script=20`wait-port-?= =?UTF-8?q?ready.ts`=20and=20update=20metadata=20file=20with=20its=20detai?= =?UTF-8?q?ls?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script-meta-v2.json | 9 ++++ single-scripts/wait-port-ready.ts | 82 +++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100755 single-scripts/wait-port-ready.ts diff --git a/script-meta-v2.json b/script-meta-v2.json index 23ebfba..03b15a4 100644 --- a/script-meta-v2.json +++ b/script-meta-v2.json @@ -392,6 +392,15 @@ "publish_time": 1775409332538, "update_time": 1775409332538 }, + "wait-port-ready.ts": { + "script_name": "wait-port-ready.ts", + "script_length": 2237, + "script_sha256": "d9e523a45667982700e7cad6010d4f8109ccd4e7d03881417f83bc2ce4dd717d", + "script_full_url": "https://git.hatter.ink/hatter/ts-scripts/raw/branch/main/single-scripts/wait-port-ready.ts", + "single_script_file": true, + "publish_time": 1776514630023, + "update_time": 1776514630023 + }, "wget.ts": { "script_name": "wget.ts", "script_length": 5289, diff --git a/single-scripts/wait-port-ready.ts b/single-scripts/wait-port-ready.ts new file mode 100755 index 0000000..399d85b --- /dev/null +++ b/single-scripts/wait-port-ready.ts @@ -0,0 +1,82 @@ +#!/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=