From 8b59b8d17d15dea947b7bfad43f153b97095df4a Mon Sep 17 00:00:00 2001 From: Alistair Smith Date: Thu, 8 Jan 2026 09:38:31 +0000 Subject: [PATCH] types: Missing methods on udp socket --- docs/runtime/networking/udp.mdx | 51 +++++++++++++++++++ packages/bun-types/bun.d.ts | 61 +++++++++++++++++++++++ test/integration/bun-types/fixture/udp.ts | 58 +++++++++++++++++++++ 3 files changed, 170 insertions(+) create mode 100644 test/integration/bun-types/fixture/udp.ts diff --git a/docs/runtime/networking/udp.mdx b/docs/runtime/networking/udp.mdx index 4cc158aeca..201d1c0230 100644 --- a/docs/runtime/networking/udp.mdx +++ b/docs/runtime/networking/udp.mdx @@ -127,3 +127,54 @@ const socket = await Bun.udpSocket({ }, }); ``` + +### Socket options + +UDP sockets support setting various socket options: + +```ts +const socket = await Bun.udpSocket({}); + +// Enable broadcasting to send packets to a broadcast address +socket.setBroadcast(true); + +// Set the IP TTL (time to live) for outgoing packets +socket.setTTL(64); +``` + +### Multicast + +Bun supports multicast operations for UDP sockets. Use `addMembership` and `dropMembership` to join and leave multicast groups: + +```ts +const socket = await Bun.udpSocket({}); + +// Join a multicast group +socket.addMembership("224.0.0.1"); + +// Join with a specific interface +socket.addMembership("224.0.0.1", "192.168.1.100"); + +// Leave a multicast group +socket.dropMembership("224.0.0.1"); +``` + +Additional multicast options: + +```ts +// Set TTL for multicast packets (number of network hops) +socket.setMulticastTTL(2); + +// Control whether multicast packets loop back to the local socket +socket.setMulticastLoopback(true); + +// Specify which interface to use for outgoing multicast packets +socket.setMulticastInterface("192.168.1.100"); +``` + +For source-specific multicast (SSM), use `addSourceSpecificMembership` and `dropSourceSpecificMembership`: + +```ts +socket.addSourceSpecificMembership("10.0.0.1", "232.0.0.1"); +socket.dropSourceSpecificMembership("10.0.0.1", "232.0.0.1"); +``` diff --git a/packages/bun-types/bun.d.ts b/packages/bun-types/bun.d.ts index e2418dae30..afa5f9d555 100644 --- a/packages/bun-types/bun.d.ts +++ b/packages/bun-types/bun.d.ts @@ -5470,6 +5470,67 @@ declare module "bun" { ref(): void; unref(): void; close(): void; + /** + * Enable or disable SO_BROADCAST socket option. + * @param enabled Whether to enable broadcast + * @returns The enabled value + */ + setBroadcast(enabled: boolean): boolean; + /** + * Set the IP_TTL socket option. + * @param ttl Time to live value + * @returns The TTL value + */ + setTTL(ttl: number): number; + /** + * Set the IP_MULTICAST_TTL socket option. + * @param ttl Time to live value for multicast packets + * @returns The TTL value + */ + setMulticastTTL(ttl: number): number; + /** + * Enable or disable IP_MULTICAST_LOOP socket option. + * @param enabled Whether to enable multicast loopback + * @returns The enabled value + */ + setMulticastLoopback(enabled: boolean): boolean; + /** + * Set the IP_MULTICAST_IF socket option to specify the outgoing interface + * for multicast packets. + * @param interfaceAddress The address of the interface to use + * @returns true on success + */ + setMulticastInterface(interfaceAddress: string): boolean; + /** + * Join a multicast group. + * @param multicastAddress The multicast group address + * @param interfaceAddress Optional interface address to use + * @returns true on success + */ + addMembership(multicastAddress: string, interfaceAddress?: string): boolean; + /** + * Leave a multicast group. + * @param multicastAddress The multicast group address + * @param interfaceAddress Optional interface address to use + * @returns true on success + */ + dropMembership(multicastAddress: string, interfaceAddress?: string): boolean; + /** + * Join a source-specific multicast group. + * @param sourceAddress The source address + * @param groupAddress The multicast group address + * @param interfaceAddress Optional interface address to use + * @returns true on success + */ + addSourceSpecificMembership(sourceAddress: string, groupAddress: string, interfaceAddress?: string): boolean; + /** + * Leave a source-specific multicast group. + * @param sourceAddress The source address + * @param groupAddress The multicast group address + * @param interfaceAddress Optional interface address to use + * @returns true on success + */ + dropSourceSpecificMembership(sourceAddress: string, groupAddress: string, interfaceAddress?: string): boolean; } export interface ConnectedSocket extends BaseUDPSocket { diff --git a/test/integration/bun-types/fixture/udp.ts b/test/integration/bun-types/fixture/udp.ts new file mode 100644 index 0000000000..619733f372 --- /dev/null +++ b/test/integration/bun-types/fixture/udp.ts @@ -0,0 +1,58 @@ +import * as Bun from "bun"; +import { expectType } from "./utilities"; + +const socket = await Bun.udpSocket({ + port: 0, +}); + +expectType(socket.hostname).is(); +expectType(socket.port).is(); +expectType(socket.address).is(); +expectType(socket.binaryType).is(); +expectType(socket.closed).is(); + +expectType(socket.send("Hello", 41234, "127.0.0.1")).is(); +expectType(socket.send(new Uint8Array([1, 2, 3]), 41234, "127.0.0.1")).is(); +expectType(socket.sendMany(["Hello", 41234, "127.0.0.1", "World", 41235, "127.0.0.2"])).is(); + +expectType(socket.setBroadcast(true)).is(); +expectType(socket.setTTL(64)).is(); +expectType(socket.setMulticastTTL(2)).is(); +expectType(socket.setMulticastLoopback(true)).is(); +expectType(socket.setMulticastInterface("192.168.1.100")).is(); + +expectType(socket.addMembership("224.0.0.1")).is(); +expectType(socket.addMembership("224.0.0.1", "192.168.1.100")).is(); +expectType(socket.dropMembership("224.0.0.1")).is(); +expectType(socket.dropMembership("224.0.0.1", "192.168.1.100")).is(); + +expectType(socket.addSourceSpecificMembership("10.0.0.1", "232.0.0.1")).is(); +expectType(socket.addSourceSpecificMembership("10.0.0.1", "232.0.0.1", "192.168.1.100")).is(); +expectType(socket.dropSourceSpecificMembership("10.0.0.1", "232.0.0.1")).is(); +expectType(socket.dropSourceSpecificMembership("10.0.0.1", "232.0.0.1", "192.168.1.100")).is(); + +expectType(socket.ref()).is(); +expectType(socket.unref()).is(); + +expectType(socket.close()).is(); + +const connectedSocket = await Bun.udpSocket({ + port: 0, + connect: { + hostname: "127.0.0.1", + port: 41234, + }, +}); + +expectType(connectedSocket.remoteAddress).is(); + +expectType(connectedSocket.send("Hello")).is(); +expectType(connectedSocket.send(new Uint8Array([1, 2, 3]))).is(); +expectType(connectedSocket.sendMany(["Hello", "World"])).is(); + +expectType(connectedSocket.setBroadcast(false)).is(); +expectType(connectedSocket.setTTL(128)).is(); +expectType(connectedSocket.setMulticastTTL(1)).is(); +expectType(connectedSocket.setMulticastLoopback(false)).is(); + +connectedSocket.close();