|
| 1 | +# @relayfile/webhook-server |
| 2 | + |
| 3 | +Thin [Hono](https://hono.dev) server for receiving provider webhooks, verifying signatures, and persisting normalized events into relayfile via `RelayFileClient`. |
| 4 | + |
| 5 | +## Install |
| 6 | + |
| 7 | +```bash |
| 8 | +npm install @relayfile/webhook-server hono |
| 9 | +``` |
| 10 | + |
| 11 | +## Usage |
| 12 | + |
| 13 | +```ts |
| 14 | +import { GitHubAdapter } from "@relayfile/adapter-github"; |
| 15 | +import { RelayFileClient } from "@relayfile/sdk"; |
| 16 | +import { createWebhookServer } from "@relayfile/webhook-server"; |
| 17 | + |
| 18 | +const client = new RelayFileClient({ token: process.env.RELAYFILE_TOKEN! }); |
| 19 | +const provider = { name: "nango", proxy: async () => ({ status: 200, headers: {}, data: {} }), healthCheck: async () => true }; |
| 20 | +const github = new GitHubAdapter(provider); |
| 21 | +const server = createWebhookServer({ client, port: 3456, secrets: { github: process.env.GITHUB_WEBHOOK_SECRET } }); |
| 22 | +server.register("github", github); |
| 23 | +await server.start(); |
| 24 | +``` |
| 25 | + |
| 26 | +`POST /github/webhook` now verifies `x-hub-signature-256`, normalizes the event, computes a VFS path from the registered adapter, and calls `client.ingestWebhook(...)`. |
| 27 | + |
| 28 | +## Supported built-ins |
| 29 | + |
| 30 | +- `github`: HMAC-SHA256 verification via `x-hub-signature-256` |
| 31 | +- `slack`: signing secret verification via `x-slack-signature` and `x-slack-request-timestamp` |
| 32 | + |
| 33 | +Adapters can also provide their own `verifySignature` or `normalizeWebhook` hooks. |
| 34 | + |
| 35 | +## API |
| 36 | + |
| 37 | +### `createWebhookServer(options)` |
| 38 | + |
| 39 | +- `client`: `RelayFileClient` used to persist webhook events |
| 40 | +- `workspaceId`: relayfile workspace ID, defaults to `"default"` |
| 41 | +- `port`: default port for `server.start()`, defaults to `3456` |
| 42 | +- `hostname`: default hostname for `server.start()`, defaults to `"0.0.0.0"` |
| 43 | +- `adapters`: optional initial adapter map |
| 44 | +- `secrets`: provider-to-secret map for signature verification |
| 45 | + |
| 46 | +### `server.register(name, adapter)` |
| 47 | + |
| 48 | +Registers an adapter by provider name. The adapter may expose: |
| 49 | + |
| 50 | +- `computePath(objectType, objectId, payload?)` |
| 51 | +- `normalizeWebhook(payload, context)` |
| 52 | +- `verifySignature(context)` |
| 53 | +- `provider?: ConnectionProvider` |
| 54 | + |
| 55 | +### Route |
| 56 | + |
| 57 | +- `POST /:provider/webhook` |
| 58 | + |
| 59 | +The route returns `404` for unknown providers, `401` for signature failures, `400` for invalid payloads, and `200` with the queued relayfile operation IDs when the webhook is accepted. |
0 commit comments