After setting up your server, you can integrate subscriptions into GraphiQL, the in-browser GraphQL IDE.
To get started, make a page for rendering GraphiQL, for example:
<!-- views/graphiqls/show.html -->
<div id="root" style="height: 100vh;"></div>
Then, install GraphiQL (eg, yarn add graphiql
) and add JavaScript code to import GraphiQL and render it on your page:
import { GraphiQL } from 'graphiql';
import React from 'react';
import { createRoot } from 'react-dom/client';
import 'graphiql/graphiql.css';
import { createGraphiQLFetcher } from '@graphiql/toolkit';
const fetcher = createGraphiQLFetcher({ url: '/graphql' });
const root = createRoot(document.getElementById('root'));
root.render(<GraphiQL fetcher={fetcher}/>);
After that, you should be able to load the page in your app and see the GraphiQL editor.
To integrate Ably subscriptions, use createAblyFetcher
, for example:
import Ably from "ably"
import createAblyFetcher from 'graphql-ruby-client/subscriptions/createAblyFetcher';
// Initialize a client
// the key must have "subscribe" and "presence" permissions
const ably = new Ably.Realtime({ key: "your.application.key" })
// Initialize a new fetcher and pass it to GraphiQL below
var fetcher = createAblyFetcher({ ably: ably, url: "/graphql" })
const root = createRoot(document.getElementById('root'));
root.render(<GraphiQL fetcher={fetcher} />);
Under the hood, it will use window.fetch
to send GraphQL operations to the server, then listen for X-Subscription-ID
headers in responses. To customize its HTTP requests, you can pass a fetchOptions:
object or a custom fetch:
function to createAblyFetcher({ ... })
.
To integrate Pusher subscriptions, use createPusherFetcher
, for example:
import Pusher from "pusher-js"
import createPusherFetcher from 'graphql-ruby-client/subscriptions/createPusherFetcher';
// Initialize a client
const pusher = new Pusher("your-app-key", { cluster: "your-cluster" })
// Initialize a new fetcher and pass it to GraphiQL below
var fetcher = createPusherFetcher({ pusher: pusher, url: "/graphql" })
const root = createRoot(document.getElementById('root'));
root.render(<GraphiQL fetcher={fetcher} />);
Under the hood, it will use window.fetch
to send GraphQL operations to the server, then listen for X-Subscription-ID
headers in responses. To customize its HTTP requests, you can pass a fetchOptions:
object or a custom fetch:
function to createPusherFetcher({ ... })
.
To integrate ActionCable subscriptions, use createActionCableFetcher
, for example:
import { createConsumer } from "@rails/actioncable"
import createActionCableFetcher from 'graphql-ruby-client/subscriptions/createActionCableFetcher';
// Initialize a client
const actionCable = createConsumer()
// Initialize a new fetcher and pass it to GraphiQL below
var fetcher = createActionCableFetcher({ consumer: actionCable, url: "/graphql" })
const root = createRoot(document.getElementById('root'));
root.render(<GraphiQL fetcher={fetcher} />);
Under the hood, it will split traffic: it will send subscription { ... }
operations via ActionCable and send queries and mutations via HTTP POST
using window.fetch
. To customize its HTTP requests, you can pass a fetchOptions:
object or a custom fetch:
function to createPusherFetcher({ ... })
.