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
-
Frame( opcode: opcode.Opcode, sequence: option.Option(Int), event_name: option.Option(String), raw: String, )
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