A graphql subscriptions implementation using postgres and apollo's graphql-subscriptions.
npm install graphql-pg-subscriptions
bash
npm i graphql-pg-subscriptions
`
Usage
First of all, follow the instructions in graphql-subscriptions to add subscriptions to your app.
Afterwards replace PubSub with PostgresPubSub:
`js
// Before
import { PubSub } from "graphql-subscriptions";
export const pubsub = new PubSub();
`
`js
//After
import { PostgresPubSub } from "graphql-postgres-subscriptions";
import { Client } from "pg";
const client = new Client({
user: 'dbuser',
host: 'database.server.com',
database: 'mydb',
password: 'secretpassword',
port: 3211,
});
client.connect();
const pubsub = new PostgresPubSub({ client, maxListeners: 15 });
//You can increase max event listeners if you need, default is 15
`
$3
The second argument to new PostgresPubSub() is the commonMessageHandler. The common message handler gets called with the received message from PostgreSQL.
You can transform the message before it is passed to the individual filter/resolver methods of the subscribers.
This way it is for example possible to inject one instance of a DataLoader which can be used in all filter/resolver methods.
`javascript
const getDataLoader = () => new DataLoader(...)
const commonMessageHandler = ({attributes: {id}, data}) => ({id, dataLoader: getDataLoader()})
const pubsub = new PostgresPubSub({ client, commonMessageHandler });
`
`javascript
export const resolvers = {
Subscription: {
somethingChanged: {
resolve: ({ id, dataLoader }) => dataLoader.load(id)
}
}
};
`
Error handling
PostgresPubSub instances emit a special event called "error". This event's payload is an instance of Javascript's Error. You can get the error's text using error.message.
`js
const ps = new PostgresPubSub({ client });
ps.subscribe("error", err => {
console.log(err.message); // -> "payload string too long"
}).then(() => ps.publish("a", "a".repeat(9000)));
`
For example you can log all error messages (including stack traces and friends) using something like this:
`js
ps.subscribe("error", console.error);
``