Jan 27, 2019 · ⏱ 1 minute

Introducing aqueduct πŸ—Ί

After doing some cleanup on my projects list, I found a nearly-forgotten tool that I wrote a few months ago, and with some polishing and overhaul done, I'm happy to present to the world: aqueduct. To put it simply, it's a proxy service for GraphQL applications, utilizing a technology named schema-stitching at its core, to connect multiple GraphQL-powered data sources. Offering a ton of customization options, aqueduct can become to perfect companion if you need to bundle some services behind a single endpoint.

Let's see an example setup to gain some impressions! For our example configuration file named aqueduct.yaml, we'll add the following:

endpoints:
- swapi:
endpoint: https://api.graphcms.com/simple/v1/swapi
- transit:
endpoint: https://bahnql.herokuapp.com/graphql
- pokemon:
endpoint: https://graphql-pokemon.now.sh/
enablePlayground: true

To deploy an aqueduct instance, you can simply use a compose file as shown below

version: '3.7'
services:
gateway:
image: brunoscheufler/aqueduct:latest
volumes:
- './aqueduct.yaml:/config/aqueduct.yaml:ro'
ports:
- '4000:4000'
environment:
NODE_ENV: production

If you launch your Docker Compose setup, you can access the aqueduct endpoint at http://localhost:4000 and execute some queries!

{
# Get some transit info from DB
search(searchTerm: "Berlin Hauptbahnhof") {
stations {
name
federalState
hasWiFi
}
}
# Load Swapi info
Person(name: "Luke Skywalker") {
birthYear
}
# And some Pokemon details
pokemon(name: "Pikachu") {
number
maxHP
}
}

I know the example query and setup above is a bit unrealistic, but you get the gist of it! To use aqueduct as a gateway with auth, you can add a JWT secret and it will automatically validate every request against that. By configuring aqueduct to pass headers you can authenticate with used services, and so on. The possibilities are pretty much endless!