59 lines
1.3 KiB
TypeScript
59 lines
1.3 KiB
TypeScript
import type { udp } from "bun"
|
|
|
|
const udpServer = await Bun.udpSocket({
|
|
port: 33000,
|
|
socket: {
|
|
data(_socket, _buf, _port, _addr) {
|
|
// todo : Handle Recieved Data
|
|
}
|
|
}
|
|
})
|
|
|
|
export const udpSocketPool = await createUDPSocketPool(5)
|
|
|
|
type bunUDPSocket = udp.Socket<"buffer">
|
|
|
|
export function getUDPServerPort() {
|
|
return udpServer.port
|
|
}
|
|
|
|
export class UDPSocketPool {
|
|
freeSockets: Set<bunUDPSocket> = new Set()
|
|
busySockets: Set<bunUDPSocket> = new Set()
|
|
|
|
getFreeSocket(): bunUDPSocket {
|
|
const socket = this.freeSockets.values().next().value
|
|
if (socket !== undefined) {
|
|
this.busySockets.add(socket)
|
|
this.freeSockets.delete(socket)
|
|
} else {
|
|
throw Error("Failure: Create udp socket failed")
|
|
}
|
|
return socket
|
|
}
|
|
|
|
releaseSocket(socket: any) {
|
|
this.freeSockets.add(socket)
|
|
this.busySockets.delete(socket)
|
|
}
|
|
|
|
send(data: udp.Data, port: number, hostname: string) {
|
|
const socket = this.getFreeSocket()
|
|
socket.send(data, port, hostname)
|
|
this.releaseSocket(socket)
|
|
}
|
|
|
|
}
|
|
|
|
export async function createUDPSocketPool(depth: number): Promise<UDPSocketPool> {
|
|
const pool = new UDPSocketPool()
|
|
for (var i = 0; i < depth; i++) {
|
|
const socket = await Bun.udpSocket({})
|
|
pool.freeSockets.add(socket)
|
|
}
|
|
|
|
return pool
|
|
}
|
|
|
|
|