@graphql-mesh/apollo-link
Version: 
44 lines (43 loc) • 1.87 kB
JavaScript
import { getOperationAST } from 'graphql';
import * as apolloClient from '@apollo/client';
import { fakePromise, isAsyncIterable } from '@graphql-tools/utils';
import { handleMaybePromise } from '@whatwg-node/promise-helpers';
const ROOT_VALUE = {};
function createMeshApolloRequestHandler(options) {
    return function meshApolloRequestHandler(operation) {
        const operationAst = getOperationAST(operation.query, operation.operationName);
        if (!operationAst) {
            throw new Error('GraphQL operation not found');
        }
        const operationFn = operationAst.operation === 'subscription' ? options.subscribe : options.execute;
        return new apolloClient.Observable(observer => {
            // eslint-disable-next-line @typescript-eslint/no-floating-promises
            handleMaybePromise(() => operationFn(operation.query, operation.variables, operation.getContext(), ROOT_VALUE, operation.operationName), results => {
                if (isAsyncIterable(results)) {
                    return fakePromise().then(async () => {
                        for await (const result of results) {
                            if (observer.closed) {
                                return;
                            }
                            observer.next(result);
                        }
                        observer.complete();
                    });
                }
                if (!observer.closed) {
                    observer.next(results);
                    observer.complete();
                }
            }, error => {
                if (!observer.closed) {
                    observer.error(error);
                }
            });
        });
    };
}
export class MeshApolloLink extends apolloClient.ApolloLink {
    constructor(options) {
        super(createMeshApolloRequestHandler(options));
    }
}