udpPacket(): Coder<UdpPacket>
Creates a coder for UDP datagrams (RFC 768).
The returned coder encodes/decodes the 8-byte UDP header followed by a
payload whose length is derived from the header's length field
(payload.length === length - 8).
Neither length nor checksum are computed for you on encode — the value
you provide is written verbatim. This keeps the package layer-agnostic:
the UDP checksum is defined over an IPv4 or IPv6 pseudo-header that this
coder cannot see, and recomputing length would hide truncation bugs.
Round-trip a small datagram
Round-trip a small datagram
import { assertEquals } from "@std/assert"; import { udpPacket, UDP_HEADER_SIZE } from "@binstruct/udp"; const coder = udpPacket(); const payload = new Uint8Array([0x01, 0x02, 0x03]); const datagram = { srcPort: 1234, dstPort: 53, length: UDP_HEADER_SIZE + payload.length, checksum: 0xabcd, payload, }; const buffer = new Uint8Array(32); const written = coder.encode(datagram, buffer); const [decoded, read] = coder.decode(buffer.subarray(0, written)); assertEquals(written, UDP_HEADER_SIZE + payload.length); assertEquals(read, written); assertEquals(decoded.payload, payload);
Empty payload (8-byte datagram)
Empty payload (8-byte datagram)
import { assertEquals } from "@std/assert"; import { udpPacket, UDP_HEADER_SIZE } from "@binstruct/udp"; const coder = udpPacket(); const buffer = new Uint8Array(UDP_HEADER_SIZE); const written = coder.encode({ srcPort: 0, dstPort: 0, length: UDP_HEADER_SIZE, checksum: 0, payload: new Uint8Array(0), }, buffer); const [decoded] = coder.decode(buffer); assertEquals(written, UDP_HEADER_SIZE); assertEquals(decoded.payload.length, 0);