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 = new Set() busySockets: Set = 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 { const pool = new UDPSocketPool() for (var i = 0; i < depth; i++) { const socket = await Bun.udpSocket({}) pool.freeSockets.add(socket) } return pool }