UNPKG

apollo-client

Version:
867 lines 45.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); var apollo_link_1 = require("apollo-link"); var apollo_utilities_1 = require("apollo-utilities"); var ts_invariant_1 = require("ts-invariant"); var ApolloError_1 = require("../errors/ApolloError"); var Observable_1 = require("../util/Observable"); var mutations_1 = require("../data/mutations"); var queries_1 = require("../data/queries"); var ObservableQuery_1 = require("./ObservableQuery"); var networkStatus_1 = require("./networkStatus"); var types_1 = require("./types"); var LocalState_1 = require("./LocalState"); var observables_1 = require("../util/observables"); var arrays_1 = require("../util/arrays"); var hasOwnProperty = Object.prototype.hasOwnProperty; var QueryManager = (function () { function QueryManager(_a) { var link = _a.link, _b = _a.queryDeduplication, queryDeduplication = _b === void 0 ? false : _b, store = _a.store, _c = _a.onBroadcast, onBroadcast = _c === void 0 ? function () { return undefined; } : _c, _d = _a.ssrMode, ssrMode = _d === void 0 ? false : _d, _e = _a.clientAwareness, clientAwareness = _e === void 0 ? {} : _e, localState = _a.localState, assumeImmutableResults = _a.assumeImmutableResults; this.mutationStore = new mutations_1.MutationStore(); this.queryStore = new queries_1.QueryStore(); this.clientAwareness = {}; this.idCounter = 1; this.queries = new Map(); this.fetchQueryRejectFns = new Map(); this.transformCache = new (apollo_utilities_1.canUseWeakMap ? WeakMap : Map)(); this.inFlightLinkObservables = new Map(); this.pollingInfoByQueryId = new Map(); this.link = link; this.queryDeduplication = queryDeduplication; this.dataStore = store; this.onBroadcast = onBroadcast; this.clientAwareness = clientAwareness; this.localState = localState || new LocalState_1.LocalState({ cache: store.getCache() }); this.ssrMode = ssrMode; this.assumeImmutableResults = !!assumeImmutableResults; } QueryManager.prototype.stop = function () { var _this = this; this.queries.forEach(function (_info, queryId) { _this.stopQueryNoBroadcast(queryId); }); this.fetchQueryRejectFns.forEach(function (reject) { reject(new ts_invariant_1.InvariantError('QueryManager stopped while query was in flight')); }); }; QueryManager.prototype.mutate = function (_a) { var mutation = _a.mutation, variables = _a.variables, optimisticResponse = _a.optimisticResponse, updateQueriesByName = _a.updateQueries, _b = _a.refetchQueries, refetchQueries = _b === void 0 ? [] : _b, _c = _a.awaitRefetchQueries, awaitRefetchQueries = _c === void 0 ? false : _c, updateWithProxyFn = _a.update, _d = _a.errorPolicy, errorPolicy = _d === void 0 ? 'none' : _d, fetchPolicy = _a.fetchPolicy, _e = _a.context, context = _e === void 0 ? {} : _e; return tslib_1.__awaiter(this, void 0, void 0, function () { var mutationId, generateUpdateQueriesInfo, self; var _this = this; return tslib_1.__generator(this, function (_f) { switch (_f.label) { case 0: ts_invariant_1.invariant(mutation, 'mutation option is required. You must specify your GraphQL document in the mutation option.'); ts_invariant_1.invariant(!fetchPolicy || fetchPolicy === 'no-cache', "Mutations only support a 'no-cache' fetchPolicy. If you don't want to disable the cache, remove your fetchPolicy setting to proceed with the default mutation behavior."); mutationId = this.generateQueryId(); mutation = this.transform(mutation).document; this.setQuery(mutationId, function () { return ({ document: mutation }); }); variables = this.getVariables(mutation, variables); if (!this.transform(mutation).hasClientExports) return [3, 2]; return [4, this.localState.addExportedVariables(mutation, variables, context)]; case 1: variables = _f.sent(); _f.label = 2; case 2: generateUpdateQueriesInfo = function () { var ret = {}; if (updateQueriesByName) { _this.queries.forEach(function (_a, queryId) { var observableQuery = _a.observableQuery; if (observableQuery) { var queryName = observableQuery.queryName; if (queryName && hasOwnProperty.call(updateQueriesByName, queryName)) { ret[queryId] = { updater: updateQueriesByName[queryName], query: _this.queryStore.get(queryId), }; } } }); } return ret; }; this.mutationStore.initMutation(mutationId, mutation, variables); this.dataStore.markMutationInit({ mutationId: mutationId, document: mutation, variables: variables, updateQueries: generateUpdateQueriesInfo(), update: updateWithProxyFn, optimisticResponse: optimisticResponse, }); this.broadcastQueries(); self = this; return [2, new Promise(function (resolve, reject) { var storeResult; var error; self.getObservableFromLink(mutation, tslib_1.__assign(tslib_1.__assign({}, context), { optimisticResponse: optimisticResponse }), variables, false).subscribe({ next: function (result) { if (apollo_utilities_1.graphQLResultHasError(result) && errorPolicy === 'none') { error = new ApolloError_1.ApolloError({ graphQLErrors: result.errors, }); return; } self.mutationStore.markMutationResult(mutationId); if (fetchPolicy !== 'no-cache') { self.dataStore.markMutationResult({ mutationId: mutationId, result: result, document: mutation, variables: variables, updateQueries: generateUpdateQueriesInfo(), update: updateWithProxyFn, }); } storeResult = result; }, error: function (err) { self.mutationStore.markMutationError(mutationId, err); self.dataStore.markMutationComplete({ mutationId: mutationId, optimisticResponse: optimisticResponse, }); self.broadcastQueries(); self.setQuery(mutationId, function () { return ({ document: null }); }); reject(new ApolloError_1.ApolloError({ networkError: err, })); }, complete: function () { if (error) { self.mutationStore.markMutationError(mutationId, error); } self.dataStore.markMutationComplete({ mutationId: mutationId, optimisticResponse: optimisticResponse, }); self.broadcastQueries(); if (error) { reject(error); return; } if (typeof refetchQueries === 'function') { refetchQueries = refetchQueries(storeResult); } var refetchQueryPromises = []; if (arrays_1.isNonEmptyArray(refetchQueries)) { refetchQueries.forEach(function (refetchQuery) { if (typeof refetchQuery === 'string') { self.queries.forEach(function (_a) { var observableQuery = _a.observableQuery; if (observableQuery && observableQuery.queryName === refetchQuery) { refetchQueryPromises.push(observableQuery.refetch()); } }); } else { var queryOptions = { query: refetchQuery.query, variables: refetchQuery.variables, fetchPolicy: 'network-only', }; if (refetchQuery.context) { queryOptions.context = refetchQuery.context; } refetchQueryPromises.push(self.query(queryOptions)); } }); } Promise.all(awaitRefetchQueries ? refetchQueryPromises : []).then(function () { self.setQuery(mutationId, function () { return ({ document: null }); }); if (errorPolicy === 'ignore' && storeResult && apollo_utilities_1.graphQLResultHasError(storeResult)) { delete storeResult.errors; } resolve(storeResult); }); }, }); })]; } }); }); }; QueryManager.prototype.fetchQuery = function (queryId, options, fetchType, fetchMoreForQueryId) { return tslib_1.__awaiter(this, void 0, void 0, function () { var _a, metadata, _b, fetchPolicy, _c, context, query, variables, storeResult, isNetworkOnly, needToFetch, _d, complete, result, shouldFetch, requestId, cancel, networkResult; var _this = this; return tslib_1.__generator(this, function (_e) { switch (_e.label) { case 0: _a = options.metadata, metadata = _a === void 0 ? null : _a, _b = options.fetchPolicy, fetchPolicy = _b === void 0 ? 'cache-first' : _b, _c = options.context, context = _c === void 0 ? {} : _c; query = this.transform(options.query).document; variables = this.getVariables(query, options.variables); if (!this.transform(query).hasClientExports) return [3, 2]; return [4, this.localState.addExportedVariables(query, variables, context)]; case 1: variables = _e.sent(); _e.label = 2; case 2: options = tslib_1.__assign(tslib_1.__assign({}, options), { variables: variables }); isNetworkOnly = fetchPolicy === 'network-only' || fetchPolicy === 'no-cache'; needToFetch = isNetworkOnly; if (!isNetworkOnly) { _d = this.dataStore.getCache().diff({ query: query, variables: variables, returnPartialData: true, optimistic: false, }), complete = _d.complete, result = _d.result; needToFetch = !complete || fetchPolicy === 'cache-and-network'; storeResult = result; } shouldFetch = needToFetch && fetchPolicy !== 'cache-only' && fetchPolicy !== 'standby'; if (apollo_utilities_1.hasDirectives(['live'], query)) shouldFetch = true; requestId = this.idCounter++; cancel = fetchPolicy !== 'no-cache' ? this.updateQueryWatch(queryId, query, options) : undefined; this.setQuery(queryId, function () { return ({ document: query, lastRequestId: requestId, invalidated: true, cancel: cancel, }); }); this.invalidate(fetchMoreForQueryId); this.queryStore.initQuery({ queryId: queryId, document: query, storePreviousVariables: shouldFetch, variables: variables, isPoll: fetchType === types_1.FetchType.poll, isRefetch: fetchType === types_1.FetchType.refetch, metadata: metadata, fetchMoreForQueryId: fetchMoreForQueryId, }); this.broadcastQueries(); if (shouldFetch) { networkResult = this.fetchRequest({ requestId: requestId, queryId: queryId, document: query, options: options, fetchMoreForQueryId: fetchMoreForQueryId, }).catch(function (error) { if (ApolloError_1.isApolloError(error)) { throw error; } else { if (requestId >= _this.getQuery(queryId).lastRequestId) { _this.queryStore.markQueryError(queryId, error, fetchMoreForQueryId); _this.invalidate(queryId); _this.invalidate(fetchMoreForQueryId); _this.broadcastQueries(); } throw new ApolloError_1.ApolloError({ networkError: error }); } }); if (fetchPolicy !== 'cache-and-network') { return [2, networkResult]; } networkResult.catch(function () { }); } this.queryStore.markQueryResultClient(queryId, !shouldFetch); this.invalidate(queryId); this.invalidate(fetchMoreForQueryId); if (this.transform(query).hasForcedResolvers) { return [2, this.localState.runResolvers({ document: query, remoteResult: { data: storeResult }, context: context, variables: variables, onlyRunForcedResolvers: true, }).then(function (result) { _this.markQueryResult(queryId, result, options, fetchMoreForQueryId); _this.broadcastQueries(); return result; })]; } this.broadcastQueries(); return [2, { data: storeResult }]; } }); }); }; QueryManager.prototype.markQueryResult = function (queryId, result, _a, fetchMoreForQueryId) { var fetchPolicy = _a.fetchPolicy, variables = _a.variables, errorPolicy = _a.errorPolicy; if (fetchPolicy === 'no-cache') { this.setQuery(queryId, function () { return ({ newData: { result: result.data, complete: true }, }); }); } else { this.dataStore.markQueryResult(result, this.getQuery(queryId).document, variables, fetchMoreForQueryId, errorPolicy === 'ignore' || errorPolicy === 'all'); } }; QueryManager.prototype.queryListenerForObserver = function (queryId, options, observer) { var _this = this; function invoke(method, argument) { if (observer[method]) { try { observer[method](argument); } catch (e) { ts_invariant_1.invariant.error(e); } } else if (method === 'error') { ts_invariant_1.invariant.error(argument); } } return function (queryStoreValue, newData) { _this.invalidate(queryId, false); if (!queryStoreValue) return; var _a = _this.getQuery(queryId), observableQuery = _a.observableQuery, document = _a.document; var fetchPolicy = observableQuery ? observableQuery.options.fetchPolicy : options.fetchPolicy; if (fetchPolicy === 'standby') return; var loading = networkStatus_1.isNetworkRequestInFlight(queryStoreValue.networkStatus); var lastResult = observableQuery && observableQuery.getLastResult(); var networkStatusChanged = !!(lastResult && lastResult.networkStatus !== queryStoreValue.networkStatus); var shouldNotifyIfLoading = options.returnPartialData || (!newData && queryStoreValue.previousVariables) || (networkStatusChanged && options.notifyOnNetworkStatusChange) || fetchPolicy === 'cache-only' || fetchPolicy === 'cache-and-network'; if (loading && !shouldNotifyIfLoading) { return; } var hasGraphQLErrors = arrays_1.isNonEmptyArray(queryStoreValue.graphQLErrors); var errorPolicy = observableQuery && observableQuery.options.errorPolicy || options.errorPolicy || 'none'; if (errorPolicy === 'none' && hasGraphQLErrors || queryStoreValue.networkError) { return invoke('error', new ApolloError_1.ApolloError({ graphQLErrors: queryStoreValue.graphQLErrors, networkError: queryStoreValue.networkError, })); } try { var data = void 0; var isMissing = void 0; if (newData) { if (fetchPolicy !== 'no-cache' && fetchPolicy !== 'network-only') { _this.setQuery(queryId, function () { return ({ newData: null }); }); } data = newData.result; isMissing = !newData.complete; } else { var lastError = observableQuery && observableQuery.getLastError(); var errorStatusChanged = errorPolicy !== 'none' && (lastError && lastError.graphQLErrors) !== queryStoreValue.graphQLErrors; if (lastResult && lastResult.data && !errorStatusChanged) { data = lastResult.data; isMissing = false; } else { var diffResult = _this.dataStore.getCache().diff({ query: document, variables: queryStoreValue.previousVariables || queryStoreValue.variables, returnPartialData: true, optimistic: true, }); data = diffResult.result; isMissing = !diffResult.complete; } } var stale = isMissing && !(options.returnPartialData || fetchPolicy === 'cache-only'); var resultFromStore = { data: stale ? lastResult && lastResult.data : data, loading: loading, networkStatus: queryStoreValue.networkStatus, stale: stale, }; if (errorPolicy === 'all' && hasGraphQLErrors) { resultFromStore.errors = queryStoreValue.graphQLErrors; } invoke('next', resultFromStore); } catch (networkError) { invoke('error', new ApolloError_1.ApolloError({ networkError: networkError })); } }; }; QueryManager.prototype.transform = function (document) { var transformCache = this.transformCache; if (!transformCache.has(document)) { var cache = this.dataStore.getCache(); var transformed = cache.transformDocument(document); var forLink = apollo_utilities_1.removeConnectionDirectiveFromDocument(cache.transformForLink(transformed)); var clientQuery = this.localState.clientQuery(transformed); var serverQuery = this.localState.serverQuery(forLink); var cacheEntry_1 = { document: transformed, hasClientExports: apollo_utilities_1.hasClientExports(transformed), hasForcedResolvers: this.localState.shouldForceResolvers(transformed), clientQuery: clientQuery, serverQuery: serverQuery, defaultVars: apollo_utilities_1.getDefaultValues(apollo_utilities_1.getOperationDefinition(transformed)), }; var add = function (doc) { if (doc && !transformCache.has(doc)) { transformCache.set(doc, cacheEntry_1); } }; add(document); add(transformed); add(clientQuery); add(serverQuery); } return transformCache.get(document); }; QueryManager.prototype.getVariables = function (document, variables) { return tslib_1.__assign(tslib_1.__assign({}, this.transform(document).defaultVars), variables); }; QueryManager.prototype.watchQuery = function (options, shouldSubscribe) { if (shouldSubscribe === void 0) { shouldSubscribe = true; } ts_invariant_1.invariant(options.fetchPolicy !== 'standby', 'client.watchQuery cannot be called with fetchPolicy set to "standby"'); options.variables = this.getVariables(options.query, options.variables); if (typeof options.notifyOnNetworkStatusChange === 'undefined') { options.notifyOnNetworkStatusChange = false; } var transformedOptions = tslib_1.__assign({}, options); return new ObservableQuery_1.ObservableQuery({ queryManager: this, options: transformedOptions, shouldSubscribe: shouldSubscribe, }); }; QueryManager.prototype.query = function (options) { var _this = this; ts_invariant_1.invariant(options.query, 'query option is required. You must specify your GraphQL document ' + 'in the query option.'); ts_invariant_1.invariant(options.query.kind === 'Document', 'You must wrap the query string in a "gql" tag.'); ts_invariant_1.invariant(!options.returnPartialData, 'returnPartialData option only supported on watchQuery.'); ts_invariant_1.invariant(!options.pollInterval, 'pollInterval option only supported on watchQuery.'); return new Promise(function (resolve, reject) { var watchedQuery = _this.watchQuery(options, false); _this.fetchQueryRejectFns.set("query:" + watchedQuery.queryId, reject); watchedQuery .result() .then(resolve, reject) .then(function () { return _this.fetchQueryRejectFns.delete("query:" + watchedQuery.queryId); }); }); }; QueryManager.prototype.generateQueryId = function () { return String(this.idCounter++); }; QueryManager.prototype.stopQueryInStore = function (queryId) { this.stopQueryInStoreNoBroadcast(queryId); this.broadcastQueries(); }; QueryManager.prototype.stopQueryInStoreNoBroadcast = function (queryId) { this.stopPollingQuery(queryId); this.queryStore.stopQuery(queryId); this.invalidate(queryId); }; QueryManager.prototype.addQueryListener = function (queryId, listener) { this.setQuery(queryId, function (_a) { var listeners = _a.listeners; listeners.add(listener); return { invalidated: false }; }); }; QueryManager.prototype.updateQueryWatch = function (queryId, document, options) { var _this = this; var cancel = this.getQuery(queryId).cancel; if (cancel) cancel(); var previousResult = function () { var previousResult = null; var observableQuery = _this.getQuery(queryId).observableQuery; if (observableQuery) { var lastResult = observableQuery.getLastResult(); if (lastResult) { previousResult = lastResult.data; } } return previousResult; }; return this.dataStore.getCache().watch({ query: document, variables: options.variables, optimistic: true, previousResult: previousResult, callback: function (newData) { _this.setQuery(queryId, function () { return ({ invalidated: true, newData: newData }); }); }, }); }; QueryManager.prototype.addObservableQuery = function (queryId, observableQuery) { this.setQuery(queryId, function () { return ({ observableQuery: observableQuery }); }); }; QueryManager.prototype.removeObservableQuery = function (queryId) { var cancel = this.getQuery(queryId).cancel; this.setQuery(queryId, function () { return ({ observableQuery: null }); }); if (cancel) cancel(); }; QueryManager.prototype.clearStore = function () { this.fetchQueryRejectFns.forEach(function (reject) { reject(new ts_invariant_1.InvariantError('Store reset while query was in flight (not completed in link chain)')); }); var resetIds = []; this.queries.forEach(function (_a, queryId) { var observableQuery = _a.observableQuery; if (observableQuery) resetIds.push(queryId); }); this.queryStore.reset(resetIds); this.mutationStore.reset(); return this.dataStore.reset(); }; QueryManager.prototype.resetStore = function () { var _this = this; return this.clearStore().then(function () { return _this.reFetchObservableQueries(); }); }; QueryManager.prototype.reFetchObservableQueries = function (includeStandby) { var _this = this; if (includeStandby === void 0) { includeStandby = false; } var observableQueryPromises = []; this.queries.forEach(function (_a, queryId) { var observableQuery = _a.observableQuery; if (observableQuery) { var fetchPolicy = observableQuery.options.fetchPolicy; observableQuery.resetLastResults(); if (fetchPolicy !== 'cache-only' && (includeStandby || fetchPolicy !== 'standby')) { observableQueryPromises.push(observableQuery.refetch()); } _this.setQuery(queryId, function () { return ({ newData: null }); }); _this.invalidate(queryId); } }); this.broadcastQueries(); return Promise.all(observableQueryPromises); }; QueryManager.prototype.observeQuery = function (queryId, options, observer) { this.addQueryListener(queryId, this.queryListenerForObserver(queryId, options, observer)); return this.fetchQuery(queryId, options); }; QueryManager.prototype.startQuery = function (queryId, options, listener) { ts_invariant_1.invariant.warn("The QueryManager.startQuery method has been deprecated"); this.addQueryListener(queryId, listener); this.fetchQuery(queryId, options) .catch(function () { return undefined; }); return queryId; }; QueryManager.prototype.startGraphQLSubscription = function (_a) { var _this = this; var query = _a.query, fetchPolicy = _a.fetchPolicy, variables = _a.variables; query = this.transform(query).document; variables = this.getVariables(query, variables); var makeObservable = function (variables) { return _this.getObservableFromLink(query, {}, variables, false).map(function (result) { if (!fetchPolicy || fetchPolicy !== 'no-cache') { _this.dataStore.markSubscriptionResult(result, query, variables); _this.broadcastQueries(); } if (apollo_utilities_1.graphQLResultHasError(result)) { throw new ApolloError_1.ApolloError({ graphQLErrors: result.errors, }); } return result; }); }; if (this.transform(query).hasClientExports) { var observablePromise_1 = this.localState.addExportedVariables(query, variables).then(makeObservable); return new Observable_1.Observable(function (observer) { var sub = null; observablePromise_1.then(function (observable) { return sub = observable.subscribe(observer); }, observer.error); return function () { return sub && sub.unsubscribe(); }; }); } return makeObservable(variables); }; QueryManager.prototype.stopQuery = function (queryId) { this.stopQueryNoBroadcast(queryId); this.broadcastQueries(); }; QueryManager.prototype.stopQueryNoBroadcast = function (queryId) { this.stopQueryInStoreNoBroadcast(queryId); this.removeQuery(queryId); }; QueryManager.prototype.removeQuery = function (queryId) { this.fetchQueryRejectFns.delete("query:" + queryId); this.fetchQueryRejectFns.delete("fetchRequest:" + queryId); this.getQuery(queryId).subscriptions.forEach(function (x) { return x.unsubscribe(); }); this.queries.delete(queryId); }; QueryManager.prototype.getCurrentQueryResult = function (observableQuery, optimistic) { if (optimistic === void 0) { optimistic = true; } var _a = observableQuery.options, variables = _a.variables, query = _a.query, fetchPolicy = _a.fetchPolicy, returnPartialData = _a.returnPartialData; var lastResult = observableQuery.getLastResult(); var newData = this.getQuery(observableQuery.queryId).newData; if (newData && newData.complete) { return { data: newData.result, partial: false }; } if (fetchPolicy === 'no-cache' || fetchPolicy === 'network-only') { return { data: undefined, partial: false }; } var _b = this.dataStore.getCache().diff({ query: query, variables: variables, previousResult: lastResult ? lastResult.data : undefined, returnPartialData: true, optimistic: optimistic, }), result = _b.result, complete = _b.complete; return { data: (complete || returnPartialData) ? result : void 0, partial: !complete, }; }; QueryManager.prototype.getQueryWithPreviousResult = function (queryIdOrObservable) { var observableQuery; if (typeof queryIdOrObservable === 'string') { var foundObserveableQuery = this.getQuery(queryIdOrObservable).observableQuery; ts_invariant_1.invariant(foundObserveableQuery, "ObservableQuery with this id doesn't exist: " + queryIdOrObservable); observableQuery = foundObserveableQuery; } else { observableQuery = queryIdOrObservable; } var _a = observableQuery.options, variables = _a.variables, query = _a.query; return { previousResult: this.getCurrentQueryResult(observableQuery, false).data, variables: variables, document: query, }; }; QueryManager.prototype.broadcastQueries = function () { var _this = this; this.onBroadcast(); this.queries.forEach(function (info, id) { if (info.invalidated) { info.listeners.forEach(function (listener) { if (listener) { listener(_this.queryStore.get(id), info.newData); } }); } }); }; QueryManager.prototype.getLocalState = function () { return this.localState; }; QueryManager.prototype.getObservableFromLink = function (query, context, variables, deduplication) { var _this = this; if (deduplication === void 0) { deduplication = this.queryDeduplication; } var observable; var serverQuery = this.transform(query).serverQuery; if (serverQuery) { var _a = this, inFlightLinkObservables_1 = _a.inFlightLinkObservables, link = _a.link; var operation = { query: serverQuery, variables: variables, operationName: apollo_utilities_1.getOperationName(serverQuery) || void 0, context: this.prepareContext(tslib_1.__assign(tslib_1.__assign({}, context), { forceFetch: !deduplication })), }; context = operation.context; if (deduplication) { var byVariables_1 = inFlightLinkObservables_1.get(serverQuery) || new Map(); inFlightLinkObservables_1.set(serverQuery, byVariables_1); var varJson_1 = JSON.stringify(variables); observable = byVariables_1.get(varJson_1); if (!observable) { byVariables_1.set(varJson_1, observable = observables_1.multiplex(apollo_link_1.execute(link, operation))); var cleanup = function () { byVariables_1.delete(varJson_1); if (!byVariables_1.size) inFlightLinkObservables_1.delete(serverQuery); cleanupSub_1.unsubscribe(); }; var cleanupSub_1 = observable.subscribe({ next: cleanup, error: cleanup, complete: cleanup, }); } } else { observable = observables_1.multiplex(apollo_link_1.execute(link, operation)); } } else { observable = Observable_1.Observable.of({ data: {} }); context = this.prepareContext(context); } var clientQuery = this.transform(query).clientQuery; if (clientQuery) { observable = observables_1.asyncMap(observable, function (result) { return _this.localState.runResolvers({ document: clientQuery, remoteResult: result, context: context, variables: variables, }); }); } return observable; }; QueryManager.prototype.fetchRequest = function (_a) { var _this = this; var requestId = _a.requestId, queryId = _a.queryId, document = _a.document, options = _a.options, fetchMoreForQueryId = _a.fetchMoreForQueryId; var variables = options.variables, _b = options.errorPolicy, errorPolicy = _b === void 0 ? 'none' : _b, fetchPolicy = options.fetchPolicy; var resultFromStore; var errorsFromStore; return new Promise(function (resolve, reject) { var observable = _this.getObservableFromLink(document, options.context, variables); var fqrfId = "fetchRequest:" + queryId; _this.fetchQueryRejectFns.set(fqrfId, reject); var cleanup = function () { _this.fetchQueryRejectFns.delete(fqrfId); _this.setQuery(queryId, function (_a) { var subscriptions = _a.subscriptions; subscriptions.delete(subscription); }); }; var subscription = observable.map(function (result) { if (requestId >= _this.getQuery(queryId).lastRequestId) { _this.markQueryResult(queryId, result, options, fetchMoreForQueryId); _this.queryStore.markQueryResult(queryId, result, fetchMoreForQueryId); _this.invalidate(queryId); _this.invalidate(fetchMoreForQueryId); _this.broadcastQueries(); } if (errorPolicy === 'none' && arrays_1.isNonEmptyArray(result.errors)) { return reject(new ApolloError_1.ApolloError({ graphQLErrors: result.errors, })); } if (errorPolicy === 'all') { errorsFromStore = result.errors; } if (fetchMoreForQueryId || fetchPolicy === 'no-cache') { resultFromStore = result.data; } else { var _a = _this.dataStore.getCache().diff({ variables: variables, query: document, optimistic: false, returnPartialData: true, }), result_1 = _a.result, complete = _a.complete; if (complete || options.returnPartialData) { resultFromStore = result_1; } } }).subscribe({ error: function (error) { cleanup(); reject(error); }, complete: function () { cleanup(); resolve({ data: resultFromStore, errors: errorsFromStore, loading: false, networkStatus: networkStatus_1.NetworkStatus.ready, stale: false, }); }, }); _this.setQuery(queryId, function (_a) { var subscriptions = _a.subscriptions; subscriptions.add(subscription); }); }); }; QueryManager.prototype.getQuery = function (queryId) { return (this.queries.get(queryId) || { listeners: new Set(), invalidated: false, document: null, newData: null, lastRequestId: 1, observableQuery: null, subscriptions: new Set(), }); }; QueryManager.prototype.setQuery = function (queryId, updater) { var prev = this.getQuery(queryId); var newInfo = tslib_1.__assign(tslib_1.__assign({}, prev), updater(prev)); this.queries.set(queryId, newInfo); }; QueryManager.prototype.invalidate = function (queryId, invalidated) { if (invalidated === void 0) { invalidated = true; } if (queryId) { this.setQuery(queryId, function () { return ({ invalidated: invalidated }); }); } }; QueryManager.prototype.prepareContext = function (context) { if (context === void 0) { context = {}; } var newContext = this.localState.prepareContext(context); return tslib_1.__assign(tslib_1.__assign({}, newContext), { clientAwareness: this.clientAwareness }); }; QueryManager.prototype.checkInFlight = function (queryId) { var query = this.queryStore.get(queryId); return (query && query.networkStatus !== networkStatus_1.NetworkStatus.ready && query.networkStatus !== networkStatus_1.NetworkStatus.error); }; QueryManager.prototype.startPollingQuery = function (options, queryId, listener) { var _this = this; var pollInterval = options.pollInterval; ts_invariant_1.invariant(pollInterval, 'Attempted to start a polling query without a polling interval.'); if (!this.ssrMode) { var info = this.pollingInfoByQueryId.get(queryId); if (!info) { this.pollingInfoByQueryId.set(queryId, (info = {})); } info.interval = pollInterval; info.options = tslib_1.__assign(tslib_1.__assign({}, options), { fetchPolicy: 'network-only' }); var maybeFetch_1 = function () { var info = _this.pollingInfoByQueryId.get(queryId); if (info) { if (_this.checkInFlight(queryId)) { poll_1(); } else { _this.fetchQuery(queryId, info.options, types_1.FetchType.poll).then(poll_1, poll_1); } } }; var poll_1 = function () { var info = _this.pollingInfoByQueryId.get(queryId); if (info) { clearTimeout(info.timeout); info.timeout = setTimeout(maybeFetch_1, info.interval); } }; if (listener) { this.addQueryListener(queryId, listener); } poll_1(); } return queryId; }; QueryManager.prototype.stopPollingQuery = function (queryId) { this.pollingInfoByQueryId.delete(queryId); }; return QueryManager; }()); exports.QueryManager = QueryManager; //# sourceMappingURL=QueryManager.js.map