83 lines
2.2 KiB
TypeScript
Executable File
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=
|