---
sidebar_position: 2
---
import BrowserOnly from '@docusaurus/BrowserOnly';

# Architecture
## Overview

import FlowChart from '@site/src/components/architecture/FlowChart'

<BrowserOnly>
  {() => <FlowChart />}
</BrowserOnly>

Discordeno have three main components/process, gateway, bot and rest. Websocket events from Discord, such as connecting, restarting, heartbeating, and transmitting websocket messages to Discord, are handled and maintained by the Gateway process. All Discord events are handled and converted by the Bot process, which also activates your code, such as the execute function upon message creation. All http requests to Discord, including proxying and ratelimiting, are handled by the Rest process.

## Gateway Process
import FlowChart2 from '@site/src/components/architecture/FlowChart2'

<BrowserOnly>
  {() => <FlowChart2 />}
</BrowserOnly>

The Gateway process have two part the gateway manager and the gateway [shard](https://discord.com/developers/docs/topics/gateway#sharding), the gateway manager oversees the gateway shard.

### Gateway Manager

The gateway manager spawns the right amount of shard acording to data from discord's [getGatewayBot](https://discord.com/developers/docs/topics/gateway#get-gateway-bot) endpoint, user can override the value of gatewayBot by directly passing the value. The manager control the order or sequence of shard identifying base on the session start limit listed in the getGatewayBot to prevent hitting the ratelimiting. By default the manager will check the getGatewayBot endpoint every 8 hours and reshard if the number of shard changed shard. Check [here](/tutorial/big-bot-guide/gateway#understanding-gateway-manager) for more information about the gateway manager.

### Gateway Shard

Any event is passed to the handleMessage method by the gateway shard, which also establishes a websocket connection to Discord. The handleMessage method will examine the event and only deliver genuine events to the bot by intercepting and processing websocket-related events like hello, resume, heartbeat, and ready. You can modify the handleMessage to suit your needs, but it is not advised unless you are certain of your actions because the connection depends on it. After the function has finished processing the event, it will either pass the event directly (in the same process), via the rest api, a message queue, or another mechanism depending on the user's customization.

## Bot Process
import FlowChart3 from '@site/src/components/architecture/FlowChart3'

<BrowserOnly>
  {() => <FlowChart3 handlerFilter={(handler) => handler.startsWith('handleChannel')}/>}
</BrowserOnly>

A simplified version of function used inside of the bot process, showing only the handlers, transformers and event related to channel event

### Bot

When an event arrives from the gateway, the bot process receives it and passes it all to the handleDiscordPayload method. The handleDiscordPayload method will invoke raw events for each event and route calls to handlers, transformers, and events at three different layers for processing. The handler will use transformers to alter the event's contents before calling the event. The data will be transformed into typescript after being stripped of pointless properties, given a new name, and having bitwise permission flags abstracted.

## Rest Process

TBC