packages/graphql/src/liveProvider/index.ts
import { LiveProvider } from "@refinedev/core";
import { Client } from "graphql-ws";
import {
generateUseListSubscription,
generateUseManySubscription,
generateUseOneSubscription,
} from "../utils";
const subscriptions = {
useList: generateUseListSubscription,
useOne: generateUseOneSubscription,
useMany: generateUseManySubscription,
};
export const liveProvider = (client: Client): LiveProvider => {
return {
subscribe: ({ callback, params }) => {
const {
resource,
meta,
pagination,
sorters,
filters,
subscriptionType,
id,
ids,
} = params ?? {};
if (!meta) {
throw new Error(
"[useSubscription]: `meta` is required in `params` for graphql subscriptions",
);
}
if (!subscriptionType) {
throw new Error(
"[useSubscription]: `subscriptionType` is required in `params` for graphql subscriptions",
);
}
if (!resource) {
throw new Error(
"[useSubscription]: `resource` is required in `params` for graphql subscriptions",
);
}
const genereteSubscription = subscriptions[subscriptionType];
const { query, variables, operation } = genereteSubscription({
ids,
id,
resource,
filters,
meta,
pagination,
sorters,
});
const onNext = (payload: any) => {
callback(payload.data[operation]);
};
const unsubscribe = client.subscribe(
{
query,
variables,
},
{
next: onNext,
error: () => null,
complete: () => null,
},
);
return unsubscribe;
},
unsubscribe: (unsubscribe) => {
unsubscribe();
},
};
};