Skip to content

@fkn/lib/wire

type TcpSocketOption =
| {
type: typeof TCP_OPTION_NODELAY;
value: boolean;
}
| {
type: typeof TCP_OPTION_TTL;
value: number;
}
| {
enabled: boolean;
initialDelaySeconds: number;
type: typeof TCP_OPTION_KEEPALIVE;
}
| {
type: typeof TCP_OPTION_SEND_BUFFER_SIZE;
value: number;
}
| {
type: typeof TCP_OPTION_RECV_BUFFER_SIZE;
value: number;
};

type UdpSocketOption =
| {
type: typeof UDP_OPTION_BROADCAST;
value: boolean;
}
| {
type: typeof UDP_OPTION_TTL;
value: number;
}
| {
type: typeof UDP_OPTION_MULTICAST_TTL_V4;
value: number;
}
| {
type: typeof UDP_OPTION_MULTICAST_LOOP_V4;
value: boolean;
}
| {
type: typeof UDP_OPTION_MULTICAST_LOOP_V6;
value: boolean;
}
| {
group: Uint8Array;
interface: Uint8Array;
type: typeof UDP_OPTION_ADD_MEMBERSHIP_V4;
}
| {
group: Uint8Array;
interface: Uint8Array;
type: typeof UDP_OPTION_DROP_MEMBERSHIP_V4;
}
| {
group: Uint8Array;
ifIndex: number;
type: typeof UDP_OPTION_ADD_MEMBERSHIP_V6;
}
| {
group: Uint8Array;
ifIndex: number;
type: typeof UDP_OPTION_DROP_MEMBERSHIP_V6;
}
| {
type: typeof UDP_OPTION_SEND_BUFFER_SIZE;
value: number;
}
| {
type: typeof UDP_OPTION_RECV_BUFFER_SIZE;
value: number;
};
const TCP_OPTION_KEEPALIVE: 2;

const TCP_OPTION_NODELAY: 0;

Socket option codes as they appear on the WebVPN wire, and the option shapes built from them.

These live in the library rather than beside the packet codecs because BOTH sides need them and only one side may own them. @fkn/lib already imported these constants at value level (see webvpn/net.ts and webvpn/dgram.ts), so the previous arrangement had the published package reaching into src/api/webvpn/packets/* for its own vocabulary, which dragged those modules and their imports into the library’s type program.

Owning them here inverts that: the codecs in src/api/webvpn/packets/ import from this file, and the library needs nothing from the app to describe a socket option.

The VALUES are protocol. They are the u8 discriminant of a tagged union nested inside a TcpSetOption or UdpSetOption client packet (metadata-stream tag 8), and a relay built against these numbers is deployed independently of any browser holding this file. Renumbering one is a wire break, not a refactor. Booleans go on the wire as u8, 0 for false and anything else true.


const TCP_OPTION_RECV_BUFFER_SIZE: 4;

const TCP_OPTION_SEND_BUFFER_SIZE: 3;

const TCP_OPTION_TTL: 1;

const UDP_OPTION_ADD_MEMBERSHIP_V4: 5;

const UDP_OPTION_ADD_MEMBERSHIP_V6: 7;

const UDP_OPTION_BROADCAST: 0;

const UDP_OPTION_DROP_MEMBERSHIP_V4: 6;

const UDP_OPTION_DROP_MEMBERSHIP_V6: 8;

const UDP_OPTION_MULTICAST_LOOP_V4: 3;

const UDP_OPTION_MULTICAST_LOOP_V6: 4;

const UDP_OPTION_MULTICAST_TTL_V4: 2;

const UDP_OPTION_RECV_BUFFER_SIZE: 10;

const UDP_OPTION_SEND_BUFFER_SIZE: 9;

const UDP_OPTION_TTL: 1;