Skip to main content

Handle Webhooks with GraphQL Subscriptions


GraphQL Mesh can consume Webhooks as GraphQL Subscriptions in the unified schema by using built-in PubSub implementation

Add new Subscription field#

You can use additionalTypeDefs and additionalResolvers to add subscription root fields to your unified schema.

additionalTypeDefs: |
# If you don't have Subscription type defined anywhere
# You have to extend subscription definition
extend schema {
subscription: Subscription
}
type Subscription {
todoAdded: Todo
}
additionalResolvers:
- type: Subscription
field: todoAdded
pubsubTopic: todoAdded

We're able to use existing types from our unified schema, and this root field is subscribed to our specific topic in our PubSub service.

Use JSON Schema Handler instead#

You can also use JSON Schema handler if you don't want to write an extra GraphQL type definitions. You can generate GraphQL type definitions from sample JSON response;

Just add the following to your existing JSON schema handler configuration in .meshrc.yml file;

- type: Subscription
field: todoAdded
pubsubTopic: todoAdded
responseSample: ./todo.json

Handle Webhook HTTP Requests#

Add custom express handler to listen specific path for your HTTP Webhook on Mesh CLI Server. You can do it either in a programmatic or declarative way.

Using Declarative API#

Let's say you have running GraphQL Mesh server listening 4000 port, and you need to listen a specific route for upcoming HTTP requests as HTTP Webhook.

serve:
port: 4000
handlers:
- path: /webhooks/todo_added
pubsubTopic: todoAdded

path defines the path in our server that will receive HTTP requests as "Webhook" from our API then send it to pubsubTopic.

Custom Handler in Code#

handler can get any kind of Express request handler. So you can extend Mesh Server however you want.

serve:
port: 4000
handlers:
- path: /webhooks/todo_added
handler: ./todo_added.handler.js

and in todo_added_handler.js we have something like following;

module.exports = (req, res) => {
// Mesh PubSub instance is available under `req`
req.pubsub.publish('todoAdded', req.body);
res.end(); // Don't forget to finish the HTTP connection
};

You can check out our example