@graphile/pg-pubsub

Subscriptions plugin for PostGraphile using PostgreSQL's LISTEN/NOTIFY

Usage no npm install needed!

<script type="module">
  import graphilePgPubsub from 'https://cdn.skypack.dev/@graphile/pg-pubsub';
</script>

README

@graphile/pg-pubsub

This PostGraphile server plugin provides a pubsub instance to schema plugins that uses PostgreSQL LISTEN/NOTIFY to provide realtime features.

Also adds support for @pgSubscriptions directive to easily define your own subscriptions using LISTEN/NOTIFY with makeExtendSchemaPlugin; and adds the --simple-subscriptions feature which, when enabled, adds a simple listen subscription field to your GraphQL API.

It's intended that you use this plugin as a provider of realtime data to other plugins which can use it to add subscription fields to your API.

For full documentation, see: https://www.graphile.org/postgraphile/subscriptions/

Crowd-funded open-source software

To help us develop this software sustainably under the MIT license, we ask all individuals and businesses that use it to help support its ongoing maintenance and development via sponsorship.

Click here to find out more about sponsors and sponsorship.

And please give some love to our featured sponsors 🤩:

Chad Furman
Chad Furman
*
Storyscript
Storyscript
*
Postlight
Postlight
*
Surge.io
Surge.io
*

* Sponsors the entire Graphile suite

Usage

CLI:

yarn add @graphile/pg-pubsub

postgraphile \
  --plugins @graphile/pg-pubsub \
  --subscriptions \
  --simple-subscriptions \
  -c postgres:///mydb

Library:

const express = require("express");
const { postgraphile, makePluginHook } = require("postgraphile");
const { default: PgPubsub } = require("@graphile/pg-pubsub");

const pluginHook = makePluginHook([PgPubsub]);

const postgraphileOptions = {
  pluginHook,
  subscriptions: true, // Enable PostGraphile websocket capabilities
  simpleSubscriptions: true, // Add the `listen` subscription field
  subscriptionEventEmitterMaxListeners: 20, // Set max listeners on eventEmitter, 0 unlimited, 10 default
  websocketMiddlewares: [
    // Add whatever middlewares you need here, note that they should only
    // manipulate properties on req/res, they must not sent response data. e.g.:
    //
    //   require('express-session')(),
    //   require('passport').initialize(),
    //   require('passport').session(),
  ],
};

const app = express();
app.use(postgraphile(databaseUrl, "app_public", postgraphileOptions));
app.listen(parseInt(process.env.PORT, 10) || 3000);