Vtex — a streaming VT/ANSI escape-sequence library for Elixir.

Vtex handles terminal I/O in both directions: it turns a raw byte stream (from an SSH/Telnet/TCP transport) into typed tokens and semantic input events, and it builds the control sequences you write back to draw the screen. It is intended for SSH/Telnet game servers, BBS engines and MUD frameworks.

The library is transport-agnostic and does no IO of its own: input functions take bytes you've read, output functions return bytes for you to write.

Input pipeline

raw bytes
  -> Vtex.Input.Stream    # stateful: buffers partial sequences, caps memory
  -> Vtex.Input.Tokenizer # pure: bytes -> tokens
  -> Vtex.Input     # pure: tokens -> semantic events
  -> your game / app logic

stream = Vtex.Input.Stream.new()

{tokens, _stream} = Vtex.Input.Stream.feed(stream, <<0x1B, ?[, ?A, ?h, ?i>>)
#=> {[{:csi, "", "", ?A}, {:text, "hi"}], %Vtex.Input.Stream{}}

Vtex.Input.interpret(tokens)
#=> [:arrow_up, {:char, ?h}, {:char, ?i}]

Output

Vtex.Output.ANSI is a drop-in superset of IO.ANSI (verified byte-for-byte) with 24-bit truecolor on top. Output functions return iodata to write:

transport_write([
  Vtex.Output.Screen.clear(),
  Vtex.Output.ANSI.cursor(1, 1),
  Vtex.Output.ANSI.format([:bright, Vtex.Output.ANSI.true_color(255, 128, 0), "Hello"])
])

Modules

Input: Vtex.Input.Stream, Vtex.Input.Tokenizer, Vtex.Input. Output: Vtex.Output.ANSI (IO.ANSI-compatible colour/style/cursor + truecolor), Vtex.Output.Cursor, Vtex.Output.Screen, Vtex.Output.OSC (title, hyperlinks), Vtex.SGR (encode/1). Both: Vtex.SGR (parse + encode), and the mode toggles Vtex.Mouse, Vtex.Paste, Vtex.Focus (whose events also feed Vtex.Input).