# core/adapters/webhook.adapter.ts

> 28 lines of code and 9 definitions.

Tree: Bane's Lab Deploy
Language: typescript
Layer: infrastructure
Canonical: https://banes-lab.com/anatomy/deploy#file-deploy-core-adapters-webhook-adapter-ts
Source text: https://banes-lab.com/source/deploy/core/adapters/webhook.adapter.ts.txt

Listed in [core/adapters](https://banes-lab.com/api/source/deploy/core/adapters.md), after [core/adapters/site.adapter.ts](https://banes-lab.com/source/deploy/core/adapters/site.adapter.ts.md).

## Definitions

- `payloadOf` (lexical_declaration, line 12)
- `postWebhook` (lexical_declaration, line 27, exported)
- `jsonRequest` (lexical_declaration, line 16)
- `formRequest` (lexical_declaration, line 20)
- `CONTENT_TYPE` (lexical_declaration, line 9)
- `METHOD` (lexical_declaration, line 10)
- `form` (lexical_declaration, line 21)
- `request` (lexical_declaration, line 28, exported)
- `response` (lexical_declaration, line 29, exported)

## Contained in

- [core/adapters](https://banes-lab.com/anatomy/deploy/folder-deploy-core-adapters.md)

## Used by

- [core/reporters/notification.reporter.ts](https://banes-lab.com/source/deploy/core/reporters/notification.reporter.ts.md)

## Linked from

- [core/adapters](https://banes-lab.com/anatomy/deploy/folder-deploy-core-adapters.md)
- [core/reporters](https://banes-lab.com/anatomy/deploy/folder-deploy-core-reporters.md)

## Source

```typescript
import {
    ATTACHMENT_FIELD,
    ATTACHMENT_TYPE,
    JSON_TYPE,
    PAYLOAD_FIELD,
} from "#configuration/constants/discord.constants";
import type { Attachment, WebhookMessage, WebhookRequest } from "#types/discord.types";

const CONTENT_TYPE = "Content-Type";
const METHOD = "POST";

const payloadOf = function payloadOf(message: WebhookMessage): string {
    return JSON.stringify({ content: message.content, embeds: [message.embed] });
};

const jsonRequest = function jsonRequest(message: WebhookMessage): WebhookRequest {
    return { body: payloadOf(message), headers: { [CONTENT_TYPE]: JSON_TYPE }, method: METHOD };
};

const formRequest = function formRequest(message: WebhookMessage, attachment: Attachment): WebhookRequest {
    const form = new FormData();
    form.append(PAYLOAD_FIELD, payloadOf(message));
    form.append(ATTACHMENT_FIELD, new File([attachment.content], attachment.name, { type: ATTACHMENT_TYPE }));
    return { body: form, method: METHOD };
};

export const postWebhook = async function postWebhook(url: string, message: WebhookMessage): Promise<void> {
    const request = message.attachment === null ? jsonRequest(message) : formRequest(message, message.attachment);
    const response = await fetch(url, request);
    if (!response.ok) {
        throw new Error(`${String(response.status)} ${response.statusText}`);
    }
};
```
