41 lines
1.1 KiB
JavaScript
41 lines
1.1 KiB
JavaScript
|
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();
|
||
|
},
|
||
|
};
|
||
|
});
|
||
|
}
|
||
|
}
|