fix: Improvements

This commit is contained in:
Myzel394 2024-11-06 15:03:56 +01:00
parent cb34b81209
commit 2067fe27b3
No known key found for this signature in database
GPG Key ID: ED20A1D1D423AF3F
4 changed files with 30 additions and 24 deletions

View File

@ -2,6 +2,7 @@
"name": "amiopen", "name": "amiopen",
"scripts": { "scripts": {
"dev": "bun run --hot src/index.ts", "dev": "bun run --hot src/index.ts",
"start": "bun run src/index.ts",
"prettier": "prettier --write ." "prettier": "prettier --write ."
}, },
"dependencies": { "dependencies": {

View File

@ -1,8 +1,10 @@
import { Hono } from "hono"; import { Hono } from "hono";
import { portRoute } from "./routes/port"; import { portRoute } from "./routes/port";
import { timeout } from "hono/timeout";
const app = new Hono(); const app = new Hono();
app.use(timeout(90_000));
app.route("/", portRoute); app.route("/", portRoute);
export default app; export default app;

View File

@ -23,7 +23,7 @@ const schema = z.object({
.string() .string()
.optional() .optional()
.transform(val => (val === undefined ? 5_000 : Number(val))) .transform(val => (val === undefined ? 5_000 : Number(val)))
.pipe(z.number().min(1_000).max(60_000)), .pipe(z.number().min(100).max(60_000)),
}); });
portRoute.get("/:port", async context => { portRoute.get("/:port", async context => {
@ -31,7 +31,7 @@ portRoute.get("/:port", async context => {
const rawData = { const rawData = {
ip: info.remote.address || "", ip: info.remote.address || "",
port: context.req.param("port"), port: context.req.param("port"),
timeout: context.req.query("timeout") || "", timeout: context.req.query("timeout") || context.req.query("t") || "",
}; };
const parsedData = schema.safeParse(rawData); const parsedData = schema.safeParse(rawData);
@ -44,9 +44,9 @@ portRoute.get("/:port", async context => {
); );
} }
const { ip, port } = parsedData.data; const { ip, port, timeout } = parsedData.data;
const result = await connectToAddress(ip, port); const result = await connectToAddress(ip, port, { timeout });
return context.json({ return context.json({
isOpen: result.isOpen, isOpen: result.isOpen,
@ -57,6 +57,7 @@ portRoute.get("/:ip/:port", async context => {
const rawData = { const rawData = {
ip: context.req.param("ip"), ip: context.req.param("ip"),
port: context.req.param("port"), port: context.req.param("port"),
timeout: context.req.query("timeout") || context.req.query("t") || "",
}; };
const parsedData = schema.safeParse(rawData); const parsedData = schema.safeParse(rawData);
@ -69,9 +70,9 @@ portRoute.get("/:ip/:port", async context => {
); );
} }
const { ip, port } = parsedData.data; const { ip, port, timeout } = parsedData.data;
const result = await connectToAddress(ip, port); const result = await connectToAddress(ip, port, { timeout });
return context.json({ return context.json({
isOpen: result.isOpen, isOpen: result.isOpen,

View File

@ -1,51 +1,53 @@
import * as net from "net"; import * as net from "net";
export interface ConnectionParams {
timeout: number;
}
export interface ConnectionResult { export interface ConnectionResult {
isOpen: boolean; isOpen: boolean;
} }
const TIMEOUT = 5_000;
export default function connectToAddress( export default function connectToAddress(
address: string, address: string,
port: number, port: number,
{ timeout }: ConnectionParams = { timeout: 5_000 },
): Promise<ConnectionResult> { ): Promise<ConnectionResult> {
return new Promise<ConnectionResult>(async resolve => { return new Promise<ConnectionResult>(async resolve => {
const onIsOpen = () => { let $timeout: Timer;
const socket = new net.Socket();
const close = () => {
if ($timeout) {
clearTimeout($timeout);
}
if (!socket.destroyed) { if (!socket.destroyed) {
socket.end(); socket.end();
socket.destroy(); socket.destroy();
} }
};
const onIsOpen = () => {
close();
resolve({ resolve({
isOpen: true, isOpen: true,
}); });
}; };
const onIsClosed = () => { const onIsClosed = () => {
if (!socket.destroyed) { close();
socket.end();
socket.destroy();
}
resolve({ resolve({
isOpen: false, isOpen: false,
}); });
}; };
const socket = new net.Socket();
// The `setTimeout` function from a socket does not work when connecting, // The `setTimeout` function from a socket does not work when connecting,
// so we need to use a custom timeout function ourselves. // so we need to use a custom timeout function ourselves.
setTimeout(() => { $timeout = setTimeout(() => {
if (!socket.destroyed) { close();
socket.end();
socket.destroy();
}
resolve({ resolve({
isOpen: false, isOpen: false,
}); });
}, TIMEOUT); }, timeout);
socket.on("ready", onIsOpen); socket.on("ready", onIsOpen);
socket.on("close", onIsClosed); socket.on("close", onIsClosed);