import { ApolloLink, Observable } from 'apollo-link'; import { print } from 'graphql'; import cable from '~/actioncable_consumer'; import { uuids } from '~/lib/utils/uuids'; export default class ActionCableLink extends ApolloLink { // eslint-disable-next-line class-methods-use-this request(operation) { return new Observable((observer) => { const subscription = cable.subscriptions.create( { channel: 'GraphqlChannel', query: operation.query ? print(operation.query) : null, variables: operation.variables, operationName: operation.operationName, nonce: uuids()[0], }, { received(data) { if (data.errors) { observer.error(data.errors); } else if (data.result) { observer.next(data.result); } if (!data.more) { observer.complete(); } }, }, ); return { unsubscribe() { subscription.unsubscribe(); }, }; }); } }