diff --git a/README.md b/README.md index 52e1c6fb..285dc035 100644 --- a/README.md +++ b/README.md @@ -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 @@ -570,6 +571,63 @@ Used for internal logging. Defaults to [`console`](https://developer.mozilla.org +### 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. + + + + + + + + + + + + + + + + +
+ webhooks + + Webhooks instance + + + Required. +
+ path + + string + + + Custom path to match requests against. Defaults to /api/github/webhooks. +
+ log + + object + + + +Used for internal logging. Defaults to [`console`](https://developer.mozilla.org/en-US/docs/Web/API/console) with `debug` and `info` doing nothing. + +
+ ### Webhook events See the full list of [event types with example payloads](https://docs.github.com/developers/webhooks-and-events/webhook-events-and-payloads/). diff --git a/package.json b/package.json index c0c7f0aa..6f35a2f2 100644 --- a/package.json +++ b/package.json @@ -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" diff --git a/src/event-handler/README.md b/src/event-handler/README.md index 2cd3dfb7..afd2c764 100644 --- a/src/event-handler/README.md +++ b/src/event-handler/README.md @@ -5,21 +5,23 @@ 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 @@ -27,11 +29,11 @@ eventHandler.receive({ 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"); } ```