Files
ts-scripts/single-scripts/wait-port-ready.ts

83 lines
2.2 KiB
TypeScript
Executable File

#!/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<void> {
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=