aboutsummaryrefslogtreecommitdiff
path: root/layer
diff options
context:
space:
mode:
authorGravatar Moon Flower <mforoud86@gmail.com> 2026-02-24 12:09:05 +0330
committerGravatar Moon Flower <mforoud86@gmail.com> 2026-02-24 12:09:05 +0330
commitde384de60db6ff966f27359421d6c27dee70f95e (patch)
treedd8e488046ff4293cb1075789aca883ed69e12f0 /layer
parentbroadlayer impl (diff)
broadlayer logging+dns
Diffstat (limited to 'layer')
-rw-r--r--layer/broadlayer.ts37
1 files changed, 27 insertions, 10 deletions
diff --git a/layer/broadlayer.ts b/layer/broadlayer.ts
index fa39dc2..03b434c 100644
--- a/layer/broadlayer.ts
+++ b/layer/broadlayer.ts
@@ -1,13 +1,13 @@
-import { randomUUIDv7 } from "bun"
+import { dns, randomUUIDv7 } from "bun"
if (process.argv.length < 4) {
console.log(`more args.\n${process.argv[0]} <ip> <port>`)
}
-const ip = process.argv[2] ?? '0.0.0.0'
-const port = Number(process.argv[3])
+const server_ip = process.argv[2] ?? '0.0.0.0'
+const server_port = Number(process.argv[3])
-if (!Number.isInteger(port) || port < 1 || port > 65535) {
+if (!Number.isInteger(server_port) || server_port < 1 || server_port > 65535) {
console.log("bad port")
process.exit(1)
}
@@ -130,8 +130,11 @@ async function establishTCP(ip: string, port: number, clientIp: string): Promise
return id
}
-async function establishUDP(ip: string, port: number, clientIp: string): Promise<string> {
+async function establishUDP(hostname: string, port: number, clientIp: string): Promise<string | false> {
const id = randomUUIDv7()
+ const ip = (await dns.lookup(hostname, { family: 'IPv4' }))[0]?.address
+ if (!ip) return false
+ console.log(ip)
const conn: connection = {
port,
@@ -153,8 +156,9 @@ async function establishUDP(ip: string, port: number, clientIp: string): Promise
const tm = Number(str.substring(1, bnI))
if (!isNaN(tm)) {
conn.heartbeat = setInterval(() => {
+ console.log('heartbeat')
udp.send('N\n', conn.port, conn.ip)
- }, tm * 1000)
+ }, Math.max(tm - 5, 1) * 1000)
}
const temp_len = bnI + 1
if (str.length > temp_len) {
@@ -186,16 +190,19 @@ setInterval(() => {
for (const key of Object.keys(sessions)) {
const sess = sessions[key]!
if (sess.lastSeen > Date.now() - eviction_timeout) continue
+ // skip if websocket
+ if (sess.ws) continue
// evict
if (sess.mode === 'tcp') sess.socket?.close()
else sess.die()
delete sessions[key]
}
+ console.log('clients:' + Object.keys(sessions).length)
}, eviction_timeout)
Bun.serve({
- port,
- hostname: ip,
+ port: server_port,
+ hostname: server_ip,
routes: {
'/': new Response('this is a broadlayer server.'),
'/tcp/connect/:ip/:port': async req => {
@@ -214,6 +221,7 @@ Bun.serve({
if (res === false) return new Response('err_timeout')
connectionsPerIp.set(clientIp, count + 1)
+ console.log('clients:' + Object.keys(sessions).length)
return new Response('ok_' + res)
},
'/udp/connect/:ip/:port': async req => {
@@ -227,9 +235,12 @@ Bun.serve({
if (count >= 4) {
return new Response('err_toomany', { status: 429 })
}
- connectionsPerIp.set(clientIp, count + 1)
- return new Response('ok_' + await establishUDP(req.params.ip, port, clientIp))
+ const res = await establishUDP(req.params.ip, port, clientIp)
+ if (!res) return new Response('err_badhost')
+ connectionsPerIp.set(clientIp, count + 1)
+ console.log('clients:' + Object.keys(sessions).length)
+ return new Response('ok_' + res)
},
'/poll/:id': async req => { // read and consume queue
const sess = sessions[req.params.id]
@@ -255,6 +266,7 @@ Bun.serve({
delete sessions[req.params.id]
}
+ console.log('clients:' + Object.keys(sessions).length)
return new Response('ok')
},
'/send/:id': {
@@ -267,6 +279,7 @@ Bun.serve({
if (sess.mode === 'tcp') sess.socket?.write(buf)
else udp.send(buf, sess.port, sess.ip)
+ console.log('sendto')
return new Response('ok')
}
},
@@ -295,6 +308,7 @@ Bun.serve({
}
})
+ console.log('clients:' + Object.keys(sessions).length)
return new Response('ok_' + res)
},
'/udp/ws/:ip/:port': async (req, server) => {
@@ -311,6 +325,7 @@ Bun.serve({
connectionsPerIp.set(clientIp, count + 1)
const res = await establishUDP(req.params.ip, port, clientIp)
+ if (!res) return new Response('err_badhost')
server.upgrade(req, {
data: { sessionId: res },
@@ -319,6 +334,7 @@ Bun.serve({
}
})
+ console.log('clients:' + Object.keys(sessions).length)
return new Response('ok_' + res)
}
},
@@ -367,6 +383,7 @@ Bun.serve({
const sess = sessions[sessionId]
sess.ws = undefined
sess.lastSeen = Date.now()
+ console.log('connclose')
}
}
}