From 1390ef247c84001ed430e3eabbe9c08c0e52ae8c Mon Sep 17 00:00:00 2001 From: Myzel394 <50424412+Myzel394@users.noreply.github.com> Date: Tue, 5 Nov 2024 21:57:37 +0100 Subject: [PATCH] feat: Add first poc --- bun.lockb | Bin 3027 -> 4066 bytes package.json | 7 ++++-- src/index.ts | 14 +++++++++-- src/routes/port.ts | 33 ++++++++++++++++++++++++ src/utils/connect-to-address.ts | 43 ++++++++++++++++++++++++++++++++ 5 files changed, 93 insertions(+), 4 deletions(-) create mode 100644 src/routes/port.ts create mode 100644 src/utils/connect-to-address.ts diff --git a/bun.lockb b/bun.lockb index 39a60e99bbb1fcf1a39f87817b7fd4cc623e775f..a4739f5e91a5ea1af86e6d4f284ce23c71a7da35 100755 GIT binary patch delta 1234 zcmcaC{z!g;o+k4KAFuTIITJO)UrcnJKi5wG(7ohCRl={8+7nFc_6Mv8;%5K@u8HCD z^+{Y14g*7CZf1T#Y92#XehOG96GAa$j_Eyl>ezyqX#T##JD zOdua5e-}!3#uvZdw8qv?*X;3YcbEEu+E<>h$?CslTb`@BUvsTjNS2!SI$dQWp3sT< zQN3zgZ7n(TZH~PPoVEKDo913`gT^n_Z_>|p2)$OC_#!}17-)$;&~RoTEe^yS6F;g? zHelr7Z~}64fD#iw8i4qWd6O*}?FHunMU8=?K&LQ(Ff&v+zB>M z-9P6(%zSrj1^=~Ycb8mPlig#YoW}{O=;m?be z_YYjSzV<&G&kFs%EwKyEH>9rmW4zndfQ^^cN$; zKmLC}nt5^~bNJ*A7G9s%JyHv1sKkWan4`uVm?6YyR9{-im{ppR@h|qF+LJf`ro26J z*+?ezr10b-cPo|U1zbDSnaq6VdzxS0cgtDYSpdmU*2$eL;gc;`c_+VR@n&S7e3Lnx zkz=wUOE@FvW=mFX#>op4kxmG|E?;ftnrR?_74FCQ^04NlJNs-|NRGx=> z@;P=hDNwkAA_Npsph&a;CSwpt0ZA*Ffuvc07?j39@d%1TkaCbxkQR`Mu=tz-)w+#m zavX7bXTbo= zWU#!!#Ha-^kwI)SH>V`iOvcIkI3%QDd2R9O8I|+1E@d(?)>-J8>KPg^T%7!oLsA8| zF$}y=^LQtFa5{(^K)GJ9vcaa*!cM_(ash{=utP~@L29vnQfVHPm02*^kV{$sSWxKe z>H|q#h@&UJlU! delta 625 zcmaDPe_4Ejp5}g*vW9<81#g<&zd!Nnl(37>)_xB*zaC>88(gWRmbp*NnVSI&*e8a| z*JrasI1CJlxtaL|sd)?;`FZ&;F)jv%h5{gm6G-m`(m56*z16;?pxK=Vx8Y z1RBG@FjcZ#RgEuRL{sv&xB#`^O@4JOay4Vt`_FL5#>-V diff --git a/package.json b/package.json index 546fd60..313092e 100644 --- a/package.json +++ b/package.json @@ -4,9 +4,12 @@ "dev": "bun run --hot src/index.ts" }, "dependencies": { - "hono": "^4.6.9" + "hono": "^4.6.9", + "id": "^0.0.0", + "zod": "^3.23.8" }, "devDependencies": { - "@types/bun": "latest" + "@types/bun": "latest", + "@types/ip": "^1.1.3" } } \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 3191383..090c9ca 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,9 +1,19 @@ import { Hono } from 'hono' +import {getConnInfo} from "hono/bun" +import connectToAddress from './utils/connect-to-address' const app = new Hono() -app.get('/', (c) => { - return c.text('Hello Hono!') +app.get('/:port', async context => { + const port = Number(context.req.param("port")) + const info = getConnInfo(context) + const ipAddress = info.remote.address! + + const result = await connectToAddress(ipAddress, port) + + return context.json({ + isOpen: result.isOpen + }) }) export default app diff --git a/src/routes/port.ts b/src/routes/port.ts new file mode 100644 index 0000000..21f5536 --- /dev/null +++ b/src/routes/port.ts @@ -0,0 +1,33 @@ +import { Hono } from "hono"; +import { getConnInfo } from "hono/bun"; +import connectToAddress from "../utils/connect-to-address"; +import { z } from "zod"; +import * as IP from "ip" + +export const portRoute = new Hono(); + +const schema = z.object({ + ip: z.string().refine(ip => !IP.isPublic(ip), "This IP address is not valid"), + port: z.coerce.number().min(1).max(2**16 - 1), +}); + +portRoute.get("/:port", async context => { + const info = getConnInfo(context) + const rawData = { + ip: info.remote.address || "", + port: context.req.param("port"), + }; + const parsedData = schema.safeParse(rawData); + + if (!parsedData.success) { + return context.json({ error: parsedData.error }, 401); + } + + const { ip, port } = parsedData.data; + + const result = await connectToAddress(ip, port) + + return context.json({ + isOpen: result.isOpen + }) +}); diff --git a/src/utils/connect-to-address.ts b/src/utils/connect-to-address.ts new file mode 100644 index 0000000..078df85 --- /dev/null +++ b/src/utils/connect-to-address.ts @@ -0,0 +1,43 @@ +export interface ConnectionResult { + isOpen: boolean +} + +const TIMEOUT = 5 + +export default function connectToAddress(address: string, port: number): Promise { + return new Promise(async (resolve) => { + const socket = await Bun.connect({ + hostname: address, + port: port, + + socket: { + open(socket) { + socket.end() + resolve({ + isOpen: true + }) + }, + data() { + }, + connectError() { + resolve({ + isOpen: false + }) + }, + error(socket) { + socket.end() + resolve({ + isOpen: false + }) + }, + timeout() { + resolve({ + isOpen: false + }) + }, + } + }) + + socket.timeout(TIMEOUT) + }) +}