Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 60 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -96,8 +96,9 @@ source.onmessage = (event) => {
8. [webhooks.onError()](#webhooksonerror)
9. [webhooks.removeListener()](#webhooksremovelistener)
10. [createNodeMiddleware()](#createnodemiddleware)
11. [Webhook events](#webhook-events)
12. [emitterEventNames](#emittereventnames)
11. [createWebMiddleware()](#createwebmiddleware)
12. [Webhook events](#webhook-events)
13. [emitterEventNames](#emittereventnames)

### Constructor

Expand Down Expand Up @@ -570,6 +571,63 @@ Used for internal logging. Defaults to [`console`](https://developer.mozilla.org
<tbody>
</table>

### createWebMiddleware()

```js
import { Webhooks, createWebMiddleware } from "@octokit/webhooks";

const webhooks = new Webhooks({
secret: "mysecret",
});

const middleware = createWebMiddleware(webhooks, { path: "/webhooks" });

// Example usage in Deno
Deno.serve({ port: 3000 }, middleware);
```

The middleware returned from `createWebMiddleware` can also be used in serverless environments like AWS Lambda, Cloudflare Workers, and Vercel.

<table width="100%">
<tbody valign="top">
<tr>
<td>
<code>webhooks</code>
<em>
Webhooks instance
</em>
</td>
<td>
<strong>Required.</strong>
</td>
</tr>
<tr>
<td>
<code>path</code>
<em>
string
</em>
</td>
<td>
Custom path to match requests against. Defaults to <code>/api/github/webhooks</code>.
</td>
</tr>
<tr>
<td>
<code>log</code>
<em>
object
</em>
</td>
<td>

Used for internal logging. Defaults to [`console`](https://developer.mozilla.org/en-US/docs/Web/API/console) with `debug` and `info` doing nothing.

</td>
</tr>
<tbody>
</table>

### Webhook events

See the full list of [event types with example payloads](https://docs.github.com/developers/webhooks-and-events/webhook-events-and-payloads/).
Expand Down
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@
"scripts": {
"build": "node scripts/build.mjs && tsc -p tsconfig.json",
"generate-types": "node --loader=ts-node/esm scripts/generate-types.ts",
"lint": "prettier --check 'src/**/*.{ts,json}' 'scripts/**/*' 'test/**/*.ts' README.md package.json",
"lint:fix": "prettier --write 'src/**/*.{ts,json}' 'scripts/**/*' 'test/**/*.ts' README.md package.json",
"lint": "prettier --check 'src/**/*.{ts,json}' 'scripts/**/*' 'test/**/*.ts' README.md package.json 'src/event-handler/README.md'",
"lint:fix": "prettier --write 'src/**/*.{ts,json}' 'scripts/**/*' 'test/**/*.ts' README.md package.json 'src/event-handler/README.md'",
"pretest": "npm run -s lint",
"test": "vitest",
"validate:ts": "tsc --noEmit --noImplicitAny --target es2023 --esModuleInterop --moduleResolution node16 --module node16 --allowImportingTsExtensions test/typescript-validate.ts"
Expand Down
32 changes: 17 additions & 15 deletions src/event-handler/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,33 +5,35 @@ If you implement the route to receive webhook events from GitHub yourself then y
## Example

```js
const { createEventHandler } = require('@octokit/webhooks')
import { createEventHandler } from "@octokit/webhooks";
const eventHandler = createEventHandler({
async transform (event) {
async transform(event) {
// optionally transform passed event before handlers are called
return event
}
})
eventHandler.on('installation', asyncInstallationHook)
return event;
},
});
eventHandler.on("installation", asyncInstallationHook);

// put this inside your webhooks route handler
eventHandler.receive({
id: request.headers['x-github-delivery'],
name: request.headers['x-github-event'],
payload: request.body
}).catch(handleErrorsFromHooks)
eventHandler
.receive({
id: request.headers["x-github-delivery"],
name: request.headers["x-github-event"],
payload: request.body,
})
.catch(handleErrorsFromHooks);
```

## 🚨 Verify events

If you receive events through a publicly accessible URL, make sure to verify that the event request is coming from GitHub:

```js
import { verify } from '@octokit/webhooks';
const secret = 'mysecret'
import { verify } from "@octokit/webhooks";
const secret = "mysecret";

if (!verify(secret, request.payload, request.headers['x-hub-signature'])) {
throw new Error('Signature does not match event payload & secret')
if (!verify(secret, request.payload, request.headers["x-hub-signature-256"])) {
throw new Error("Signature does not match event payload & secret");
}
```

Expand Down