The Guild LogoThe Guild Monogram

Search docs

Search icon

Products by The Guild

Products

Hive logoHive blurred logo

Hive

Schema Registry for your GraphQL Workflows

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:
- targetTypeName: Subscription
targetFieldName: todoAdded
pubsubTopic: todoAdded
# result: data.someProp.someOtherProp # You can get nested fields
# filterBy: root.userId === args.userId # You can filter the payload by `userId` for example

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
# payload: data # you can get `data` prop of the received data

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