Receiving Webhooks with Bridge
Svix Bridge is useful in cases where you want to consume webhooks and write the payloads to a message queue.
Using the Built-in HTTP Server
Since Bridge can act as an HTTP server, you can configure it as an Endpoint in Svix.
Bridge can even verify webhooks when configured with an endpoint_secret
.
For example, receiving webhooks from Svix, lightly reshaping the payload, then publishing to RabbitMQ might be configured like this:
receivers:
- name: 'events-from-acme'
input:
type: 'svix-webhook'
path_id: 'acme'
endpoint_secret: '${ENDPOINT_SECRET}'
transformation: |
function handler(input) {
let event_type = input.eventType;
delete input.eventType;
// The `payload` field is what will be published to the queue.
return { payload: { event_type, ...input } };
}
output:
type: 'rabbitmq'
uri: '${RABBITMQ_URI}'
exchange: ''
routing_key: 'acme'
The path_id
defined here represents the trailing path segment for the route this receiver will match.
The route for this example would be /webhook/acme
and sending a POST
request here with a valid JSON body will result
in a new message published to the acme
queue.
This is to say, if you're running Bridge at https://my-bridge.example.com
, the full URL you'd register as a Svix
Endpoint would be https://my-bridge.example.com/webhook/acme
.
See Adding Endpoints for more on how to do this in the App Portal.
Using A Polling Endpoint
Bridge can consume messages sent to Ingest or any Svix Application with a Polling Endpoint configured as a destination.
This is a great option if you don't want to run a public-internet-facing HTTP server to receive webhooks. Since Bridge initiates requests from within your environment, you don't need to open any ports in your firewall!
receivers:
- name: "msg-poller-to-rabbitmq-example"
input:
type: "svix-message-poller"
# The consumer id should be unique per the app & sink.
# This is used to track Bridge's position in the stream so it can resume where it left off
# after restarting, etc.
consumer_id: "my-consumer"
# The app id, and sink id can be found in the URL for the corresponding Polling Endpoint.
# Eg:
# https://api.svix.com/api/v1/app/app_2mG6DgUaGlwCNdM5oRCUJec2kQC/poller/poll_59q
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^
app_id: "app_XXXX"
sink_id: "poll_XXXX"
# The token can be seen in the UI for the corresponding Polling Endpoint.
token: "${POLLING_ENDPOINT_TOKEN}"
transformation: |
function handler(input) {
let event_type = input.eventType;
delete input.eventType;
// The `payload` field is what will be published to the queue.
return { payload: { event_type, ...input } };
}
output:
type: "rabbitmq"
uri: "${QUEUE_URI}"
exchange: ""
routing_key: "my_queue"
Check out the the project on GitHub for more on how to get started with Bridge.