UNPKG

@shopify/react-graphql

Version:

Tools for creating type-safe and asynchronous GraphQL components for React

49 lines (40 loc) 1.11 kB
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 };