@graphql-tools/executor-apollo-link
Version:
A set of utils for faster development of GraphQL tools
57 lines (56 loc) • 2.14 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.ExecutorLink = void 0;
const tslib_1 = require("tslib");
const apolloImport = tslib_1.__importStar(require("@apollo/client"));
const utils_1 = require("@graphql-tools/utils");
const apollo = apolloImport?.default ?? apolloImport;
function createApolloRequestHandler(executor) {
return function ApolloRequestHandler(operation) {
return new apollo.Observable(observer => {
const executionRequest = {
document: operation.query,
variables: operation.variables,
operationName: operation.operationName,
extensions: operation.extensions,
context: operation.getContext(),
};
let disposed = false;
let dispose = () => {
disposed = true;
};
(async function execution() {
const results = await executor(executionRequest);
// request couldve been disposed before getting results
if (disposed)
return;
if ((0, utils_1.isAsyncIterable)(results)) {
const asyncIterator = results[Symbol.asyncIterator]();
dispose = () => {
asyncIterator.return?.();
};
try {
for await (const result of { [Symbol.asyncIterator]: () => asyncIterator }) {
observer.next(result);
}
}
catch (e) {
observer.error(e);
}
}
else {
observer.next(results);
}
})()
.then(() => observer.complete())
.catch(e => observer.error(e));
return () => dispose();
});
};
}
class ExecutorLink extends apollo.ApolloLink {
constructor(executor) {
super(createApolloRequestHandler(executor));
}
}
exports.ExecutorLink = ExecutorLink;
;