@shopify/react-graphql
Version:
Tools for creating type-safe and asynchronous GraphQL components for React
49 lines (40 loc) • 1.11 kB
JavaScript
import { ApolloLink, Observable } from 'apollo-link';
function createSsrExtractableLink() {
return new SsrExtractableLink();
}
class SsrExtractableLink extends ApolloLink {
constructor(...args) {
super(...args);
this.operations = new Set();
}
resolveAll(then) {
if (this.operations.size > 0) {
return Promise.all([...this.operations]).then(then);
}
return then();
}
request(operation, nextLink) {
if (nextLink == null) {
throw new Error('SsrExtractableLink must not be the last link in the chain.');
}
let operationDone;
const promise = new Promise(resolve => {
operationDone = () => {
this.operations.delete(promise);
resolve();
};
});
this.operations.add(promise);
return new Observable(observer => {
return nextLink(operation).subscribe({
complete() {
observer.complete();
operationDone();
},
next: observer.next.bind(observer),
error: observer.next.bind(observer)
});
});
}
}
export { SsrExtractableLink, createSsrExtractableLink };