tadpole/gateway/frame

Gateway frame parsing and payload building. The envelope is {op, d, s, t}. d stays raw: per-event decoders consume it later, so new event payloads can never break the envelope parser. Optional fields use sentinel defaults (s = -1, t = “”).

Internals: tadpole/gateway/transport calls parse on everything the gateway sends; tadpole/gateway/shard builds IDENTIFY/RESUME/HEARTBEAT payloads and reads HELLO and InvalidSession through the helpers here. FrameError covers the only two ways an envelope can fail — not JSON, or no op; everything after op is someone else’s decoder problem. See also tadpole/gateway/opcode for the op values.

Types

pub type Frame {
  Frame(
    opcode: opcode.Opcode,
    sequence: option.Option(Int),
    event_name: option.Option(String),
    raw: String,
  )
}

Constructors

pub type FrameError {
  FrameNotJson
  FrameMissingOpcode
}

Constructors

  • FrameNotJson
  • FrameMissingOpcode

The fields of GET /gateway/bot that a shard fleet needs.

pub type GatewayBotInfo {
  GatewayBotInfo(url: String, shards: Int)
}

Constructors

  • GatewayBotInfo(url: String, shards: Int)

Values

pub fn heartbeat_payload(sequence: option.Option(Int)) -> String
pub fn hello_heartbeat_interval(
  payload: String,
) -> Result(Int, FrameError)

The first thing every shard reads after connecting.

pub fn identify_payload(
  token: String,
  intents_value: Int,
  shard: #(Int, Int),
) -> String

shard is #(shard_id, shard_count), Discord’s documented order.

pub fn invalid_session_resumable(
  payload: String,
) -> Result(Bool, FrameError)

True when Discord kept the session and RESUME may be attempted.

pub fn parse(payload: String) -> Result(Frame, FrameError)
pub fn parse_gateway_bot(
  payload: String,
) -> Result(GatewayBotInfo, FrameError)
pub fn resume_payload(
  token: String,
  session_id: String,
  sequence: Int,
) -> String
Search Document