apollographql/graphql-subscriptions is a API project on GitHub, written primarily in TypeScript. It has 1.6k stars. :newspaper: A small module that implements GraphQL subscriptions for Node.js
Snapshot summary built from the project's own GitHub metadata — there's no written TopGit review yet. The page will update automatically when a full review is published.
WHY NO REVIEW YET
TopGit writes full reviews for the most-starred, most-requested repositories. This page is a snapshot until then — see the READ ME tab for the original README in full.
Now, let's create a simple PubSub instance - it is a simple pubsub implementation, based on EventEmitter. Alternative EventEmitter implementations can be passed by an options object
to the PubSub constructor.
import { PubSub } from "graphql-subscriptions";
export const pubsub = new PubSub();
If you're using TypeScript you can use the optional generic parameter for added type-safety:
Subscriptions resolvers are not a function, but an object with subscribe method, that returns AsyncIterable.
The GraphQL engine now knows that somethingChanged is a subscription, and every time we use pubsub.publish it will publish content using our chosen transport layer:
Note that the default PubSub implementation is intended for demo purposes. It only works if you have a single instance of your server and doesn't scale beyond a couple of connections.
For production usage you'll want to use one of the PubSub implementations backed by an external store. (e.g. Redis)
Filters
When publishing data to subscribers, we need to make sure that each subscriber gets only the data it needs.
To do so, we can use withFilter helper from this package, which wraps AsyncIterator with a filter function, and lets you control each publication for each user.
withFilter API:
asyncIteratorFn: (rootValue, args, context, info) => AsyncIterator<any> : A function that returns AsyncIterator you got from your pubsub.asyncIterableIterator.
filterFn: (payload, variables, context, info) => boolean | Promise<boolean> - A filter function, executed with the payload (the published value), variables, context and operation info, must return boolean or Promise<boolean> indicating if the payload should pass to the subscriber.
For example, if somethingChanged would also accept a variable with the ID that is relevant, we can use the following code to filter according to it:
Note that when using withFilter, you don't need to wrap your return value with a function.
Channels Mapping
You can map multiple channels into the same subscription, for example when there are multiple events that trigger the same subscription in the GraphQL engine.
You can also manipulate the published payload, by adding resolve methods to your subscription:
const SOMETHING_UPDATED = "something_updated";
export const resolvers = {
Subscription: {
somethingChanged: {
resolve: (payload, args, context, info) => {
// Manipulate and return the new value
return payload.somethingChanged;
},
subscribe: () => pubsub.asyncIterableIterator(SOMETHING_UPDATED),
},
},
};
Note that resolve methods execute aftersubscribe, so if the code in subscribe depends on a manipulated payload field, you will need to factor out the manipulation and call it from both subscribe and resolve.
Usage with callback listeners
Your database might have callback-based listeners for changes, for example something like this:
The callback function would be called every time a new message is saved in the database. Unfortunately, that doesn't play very well with async iterators out of the box because callbacks are push-based, where async iterators are pull-based.
We recommend using the callback-to-async-iterator module to convert your callback-based listener into an async iterator:
The value you should return from your subscribe resolver must be an AsyncIterable.
You can wrap an AsyncIterator with custom logic for your subscriptions. For compatibility with APIs that require AsyncIterator or AsyncIterable, your wrapper can return an AsyncIterableIterator to comply with both.
For example, the following implementation manipulates the payload by adding some static fields:
You can also take a look at withFilter for inspiration.
PubSub Implementations
It can be easily replaced with some other implementations of PubSubEngine abstract class. Here are a few of them:
Use Redis with https://github.com/davidyaha/graphql-redis-subscriptions
Use Google PubSub with https://github.com/axelspringer/graphql-google-pubsub
Use MQTT enabled broker with https://github.com/aerogear/graphql-mqtt-subscriptions
Use RabbitMQ with https://github.com/cdmbase/graphql-rabbitmq-subscriptions
Use AMQP (RabbitMQ) with https://github.com/Surnet/graphql-amqp-subscriptions
Use Kafka with https://github.com/ancashoria/graphql-kafka-subscriptions
Use Kafka (using Kafkajs) with https://github.com/tomasAlabes/graphql-kafkajs-subscriptions
Use Postgres with https://github.com/GraphQLCollege/graphql-postgres-subscriptions
Use NATS with https://github.com/moonwalker/graphql-nats-subscriptions
Use Mongoose (MongoDB) with https://github.com/Nickolasmv/graphql-mongoose-subscriptions
Use multiple backends with https://github.com/jcoreio/graphql-multiplex-subscriptions
Use Ably for multi-protocol support with https://github.com/ably-labs/graphql-ably-pubsub
Use Google Firestore with https://github.com/m19c/graphql-firestore-subscriptions
Use Amazon's Simple Notification Service (SNS) and Simple Queue Service (SQS) with https://github.com/sagahead-io/graphql-snssqs-subscriptions
Add your implementation...
You can also implement a PubSub of your own, by using the exported abstract class PubSubEngine from this package. By using extends PubSubEngine you use the default asyncIterator method implementation; by using implements PubSubEngine you must implement your own AsyncIterator.
SubscriptionManager @deprecated
SubscriptionManager is the previous alternative for using graphql-js subscriptions directly, and it's now deprecated.
If you are looking for its API docs, refer to a previous commit of the repository
Does apollographql/graphql-subscriptions have a project website?
No homepage URL was recorded for apollographql/graphql-subscriptions in TopGit's last sync. The README tab above frequently contains screenshots and demo links, or check the repository description on GitHub.
How active is development on apollographql/graphql-subscriptions?
The most recent commit recorded on apollographql/graphql-subscriptions was 2.0 years ago, based on the GitHub push timestamp. The repository has 129 forks — one of the better signals of community interest.
How many stars does apollographql/graphql-subscriptions have?
apollographql/graphql-subscriptions has 1.6k GitHub stars — refresh the page for the live number, or check github.com/apollographql/graphql-subscriptions. TopGit mirrors GitHub's count but does not claim minute-by-minute accuracy.
What language is apollographql/graphql-subscriptions written in?
apollographql/graphql-subscriptions is written primarily in TypeScript. GitHub's language field is based on the largest share of bytes in the default branch.
What license does apollographql/graphql-subscriptions use?
apollographql/graphql-subscriptions is released under the MIT license. Always verify the LICENSE file directly on GitHub for the authoritative terms — license strings can be edited out of sync with a project's actual stance.
What topics is apollographql/graphql-subscriptions associated with?
GitHub's repository topics for apollographql/graphql-subscriptions: "graphql", "graphql-subscriptions", "real-time". TopGit's editorial category is API.
Where do I read more about apollographql/graphql-subscriptions?
This TopGit page is a snapshot — the READ ME tab shows the project's own README content (links stripped, images preserved). The GitHub repository at github.com/apollographql/graphql-subscriptions is the definitive source.
Read full README in the tab above.
Is graphql-subscriptions worth your time?
ChatGPT, Claude and Perplexity can all read this page. Ask one of them what it makes of graphql-subscriptions.