Skip to content

Shard

Shard is responsible for managing a single WebSocket connection to Discord’s Gateway API. Its key responsibilities include:

  1. Establishing and maintaining a WebSocket connection
  2. Handling incoming messages:
    • Decompressing ZLIB-compressed messages
    • Decoding JSON payloads
    • Invoking callbacks for processed messages
  3. Sending outgoing messages, including heartbeats
  4. Managing the heartbeat mechanism:
    • Sending periodic heartbeats to keep the connection alive
    • Tracking heartbeat acknowledgements
    • Initiating reconnection if heartbeats are not acknowledged
  5. Handling reconnection logic when the connection becomes unstable or “zombified”
  6. Providing an interface for other parts of the application to interact with the WebSocket connection

The Shard module is crucial for maintaining real-time communication with Discord’s Gateway, ensuring the bot stays connected and can send and receive updates efficiently.

Summary

Shard.token  :: Secret
Shard.intents  :: number
Shard.shardId  :: number
Shard.shardCount  :: number
Shard.shouldReconnect  :: boolean
Shard.largeThreshold  :: number?
Shard.zlibBuffer  :: Accumulator
Shard.onSocketConnected  :: Emitter<()>
Shard.onSocketReconnected  :: Emitter<number?>
Shard.onSocketDisconnected  :: Emitter<number?, boolean?>
Shard.onSocketHeartbeat  :: Emitter<number?>
Shard.onSocketDispatch  :: Payload<unknown>
Shard.onSocketRawMessage  :: Payload<unknown>
Shard.onSocketReady  :: Emitter<()>
Shard.heartbeatAcknowledged  :: boolean?
Shard.heartbeatClockTime  :: number?
Shard.heartbeatInterval  :: number?
Shard.heartbeatThread  :: thread?
Shard.heartbeatPing  :: number?
Shard.lastSequence  :: number?
Shard.logger  :: Logger
Shard.socketActive  :: boolean
Shard.socketReconnecting  :: boolean
Shard.socketDisconnecting  :: boolean
Shard.socketIdentified  :: boolean
Shard.sessionId  :: string?
Shard.sessionGateway  :: string?
Shard.socketVersion  :: number?
Shard.socketUrl  :: string?
Shard.socketInstance  :: any?
Shard.socketThread  :: thread?
Shard.gatewaySendTimestamps  :: { number }

Rolling log of os.clock() timestamps for every non-heartbeat send, used to enforce Discord’s 120-events-per-60s gateway send rate limit.

Shard : _handleMessage ( message )  -> ()

Function responsible for handling incoming messages from the WebSocket connection.

It performs the following steps:

  1. Decompresses the incoming message if it’s ZLIB-compressed i. It’s worth noting that payloads may not be complete, meaning we should add data to the buffer until we have a complete message
  2. Decodes the JSON payload
  3. Invokes the appropriate callback based on the received event type

Roughly based on the following documentation: https://discord.com/developers/docs/topics/gateway#zlibstream

Parameters

message: string
Shard : heartbeatAsync ( requested )  -> ()

Sends a heartbeat to the Discord Gateway API.

Parameters

requested: boolean?
Shard : identifyAsync ( )  -> ()

Identifies the current shard with the Discord Gateway.

Shard : forceClose ( code )  -> ()

Synchronously closes the shard’s socket and kills all associated threads. Safe to call from a signal handler or any context where yielding is not permitted.

Parameters

code: number?
Shard : disconnectAsync ( code )  -> ()

Disconnects the Shard from the Discord Gateway.

Optionally, a WebSocket close code can be provided, websocket close code spec can be found here: https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent/code

Parameters

code: number?
Shard : connectAsync ( socketUrl socketVersion )  -> ()

Connects the shard to a Discord Gateway.

Expects both a Socket URL, and Socket Version to be provided. It will prepend the socket version to the socket URL, and then connect to the socket.

Also responsible for spawning the thread that will be responsible for receiving messages from the socket.

Parameters

socketUrl: string
socketVersion: number
Shard : resumeAsync ( )  -> ()

Resumes a shard session if for some reason the session has either become zombified, or the session has been invalidated by Discord.

Shard : reconnectAsync ( )  -> ()

Closes the websocket connection and reconnects the shard. This is not a re-instantiation of the shard, but a re-connection of the shard.

Shard : sendAsync ( data ignoreRateLimit )  -> ()

Sends a message through the WebSocket to Discords Gateway.

NOTE: Messages are expected to be JSON encoded strings.

Pass ignoreRateLimit = true to bypass the 120-events-per-60s send rate limit tracking. This should only be used for op 1 (Heartbeat) sends, which Discord explicitly exempts.

Parameters

data: string
ignoreRateLimit: boolean?
Shard : reinstantiateAsync ( noFail )  -> ()

Disconnects the Shard, and re-instantiats it.

Re-instantiation is the reconnection of the shard to the original socket passed, and not the session URL/ID that was passed.

Any events between the initial disconnection and reconnection will not be recovered. If this is what you intend to do, use Shard:reconnectAsync instead.

Parameters

noFail: boolean?
Shard : heartbeatIn ( milliseconds )  -> ()

Sends a heartbeat after milliseconds milliseconds, looping and continuing to heartbeat until the shard is disconnected.

Parameters

milliseconds: number
Shard . new ( settings )  -> Shard

Will instantiate a new Shard class.

Parameters

settings: Secret<string>

Returns

Shard