types: Missing methods on udp socket

This commit is contained in:
Alistair Smith
2026-01-08 09:38:31 +00:00
committed by GitHub
parent a1f1252771
commit 8b59b8d17d
3 changed files with 170 additions and 0 deletions

View File

@@ -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");
```

View File

@@ -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<DataBinaryType extends BinaryType> extends BaseUDPSocket {

View File

@@ -0,0 +1,58 @@
import * as Bun from "bun";
import { expectType } from "./utilities";
const socket = await Bun.udpSocket({
port: 0,
});
expectType(socket.hostname).is<string>();
expectType(socket.port).is<number>();
expectType(socket.address).is<Bun.SocketAddress>();
expectType(socket.binaryType).is<Bun.BinaryType>();
expectType(socket.closed).is<boolean>();
expectType(socket.send("Hello", 41234, "127.0.0.1")).is<boolean>();
expectType(socket.send(new Uint8Array([1, 2, 3]), 41234, "127.0.0.1")).is<boolean>();
expectType(socket.sendMany(["Hello", 41234, "127.0.0.1", "World", 41235, "127.0.0.2"])).is<number>();
expectType(socket.setBroadcast(true)).is<boolean>();
expectType(socket.setTTL(64)).is<number>();
expectType(socket.setMulticastTTL(2)).is<number>();
expectType(socket.setMulticastLoopback(true)).is<boolean>();
expectType(socket.setMulticastInterface("192.168.1.100")).is<boolean>();
expectType(socket.addMembership("224.0.0.1")).is<boolean>();
expectType(socket.addMembership("224.0.0.1", "192.168.1.100")).is<boolean>();
expectType(socket.dropMembership("224.0.0.1")).is<boolean>();
expectType(socket.dropMembership("224.0.0.1", "192.168.1.100")).is<boolean>();
expectType(socket.addSourceSpecificMembership("10.0.0.1", "232.0.0.1")).is<boolean>();
expectType(socket.addSourceSpecificMembership("10.0.0.1", "232.0.0.1", "192.168.1.100")).is<boolean>();
expectType(socket.dropSourceSpecificMembership("10.0.0.1", "232.0.0.1")).is<boolean>();
expectType(socket.dropSourceSpecificMembership("10.0.0.1", "232.0.0.1", "192.168.1.100")).is<boolean>();
expectType(socket.ref()).is<void>();
expectType(socket.unref()).is<void>();
expectType(socket.close()).is<void>();
const connectedSocket = await Bun.udpSocket({
port: 0,
connect: {
hostname: "127.0.0.1",
port: 41234,
},
});
expectType(connectedSocket.remoteAddress).is<Bun.SocketAddress>();
expectType(connectedSocket.send("Hello")).is<boolean>();
expectType(connectedSocket.send(new Uint8Array([1, 2, 3]))).is<boolean>();
expectType(connectedSocket.sendMany(["Hello", "World"])).is<number>();
expectType(connectedSocket.setBroadcast(false)).is<boolean>();
expectType(connectedSocket.setTTL(128)).is<number>();
expectType(connectedSocket.setMulticastTTL(1)).is<number>();
expectType(connectedSocket.setMulticastLoopback(false)).is<boolean>();
connectedSocket.close();