# Seedcord

`class` in `http` · v0.11.0

<https://seedcord.org/docs/packages/http/0.11.0/classes/seedcord-workerd>

The HTTP-interactions bot on Cloudflare Workers. Default-export it from `bot.ts`. Cloudflare
calls `fetch` for every request.

The constructor stores the config. The first POST in each isolate reads `DISCORD_BOT_TOKEN`
and the public key, command ids, and emoji ids that `seedcord build` wrote into the worker. It
loads the handler and subscriber folders, then runs the startup tasks and every plugin's `init()`
and `ready()`. Requests that arrive meanwhile wait for it.

Under `seedcord dev` the bot starts when the CLI starts it. It reads the public key and emoji
ids from Discord and deploys your commands, the way a node bot does.

```ts
class Seedcord extends PluginHost<"http", "edge">
```

## Constructors

### constructor

```ts
Seedcord(config: HttpEdgeConfig)
```

Constructs a new instance of the `Seedcord` class

## Properties

### applicationId

```ts
public get applicationId(): string
```

The bot's Discord application id. Throws if you read it before the bot starts.

### bus

```ts
public readonly bus: Bus
```

### config

```ts
public readonly config: HttpEdgeConfig
```

### rateLimiter

```ts
public readonly rateLimiter: IRateLimiter
```

### rest

```ts
public readonly rest: REST
```

Discord REST client built from `bot.restOptions`, with both sweepers off.

### shutdown

```ts
public readonly shutdown: Pick<import("@seedcord/core/node").CoordinatedShutdown, "addTask">
```

### startup

```ts
public readonly startup: Pick<CoordinatedStartup, 'addTask'>
```

Add a task that runs during startup, on the first POST.

## Methods

### attach

```ts
attach<Key, Ctor>(
    this: this,
    key: AttachKeyAssert<Key, this>,
    Plugin: AttachableCtor<Ctor, BotT, BotRt>,
    args: PluginArgs<Ctor>
): this & Attached<Key, InstanceType<Ctor>>
```

Attaches a plugin under `key`. Read the instance back as `core[key]`. `seedcord codegen`
writes the `Core` augmentation that types it there.

Put one dot in the key to nest the plugin under a group. `'services.users'` reads back as
`core.services.users`. Each name holds one plugin or one group.

Startup runs each plugin's `init()` in attach order within its phase. A node bot starts in
`start()`. An edge bot starts on its first request.

Attaching a plugin whose `transport` or `runtime` differs from this host fails to compile.
Your constructor takes `CoreBase` as its first parameter (you don't need to pass it though).
A narrower one fails to compile here.

### fetch

```ts
public async fetch(
    request: Request,
    _env?: unknown,
    ctx?: EngineContext
): Promise<Response>
```

Answers one request to the interactions endpoint. Cloudflare passes `env` and `ctx`, but this
method reads only `ctx`. Import your bindings as `env` from `cloudflare:workers`.
`cf workers types` writes their types. Work that continues after the 202 response runs under `ctx.waitUntil`. Any request
besides a POST gets a 405 before the bot starts.
