Transport Requirements
ION requires a stream that is:
- Reliable
- Ordered
- Full duplex
Transport message boundaries are ignored.
Frame Format
Every message is a frame:
+---------+------+-------------------+| u8 ver | u8 t | u32 len (LE) |+---------+------+-------------------+| payload (len bytes) |+-----------------------------------+ver: protocol version (0x01)t: frame typelen: payload size in bytes (little-endian)
Unknown protocol versions must be rejected.
Frame Types
0x01: JSON control event (UTF-8, object withtype)0x02: raw PCM audio payload
Core Events
describe (client -> server):
{ "type": "describe" }ready (server -> client):
{ "type": "ready", "protocol": "ion", "sample_rate": 16000, "channels": 1, "format": "s16le"}start:
{ "type": "start" }stop:
{ "type": "stop" }error:
{ "type": "error", "message": "reason" }Audio Rules
- Audio frames are valid only after
start - Audio stops after
stop - Chunk size is implementation-defined
- No timestamps or sequence IDs in core protocol
State Model
CONNECT -> describe <- ready -> start <- audio* -> stopExtensibility
- Unknown events should be ignored
- New events and frame types may be added