UNPKG

apollo-link-http

Version:
243 lines (238 loc) 12.2 kB
(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('apollo-link'), require('apollo-link-http-common')) : typeof define === 'function' && define.amd ? define(['exports', 'apollo-link', 'apollo-link-http-common'], factory) : (factory((global.apolloLink = global.apolloLink || {}, global.apolloLink.http = {}),global.apolloLink.core,global.apolloLink.httpCommon)); }(this, (function (exports,apolloLink,apolloLinkHttpCommon) { 'use strict'; /* tslint:disable */ var __extends = (undefined && undefined.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __assign = (undefined && undefined.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var __rest = (undefined && undefined.__rest) || function (s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0) t[p[i]] = s[p[i]]; return t; }; var createHttpLink = function (linkOptions) { if (linkOptions === void 0) { linkOptions = {}; } var _a = linkOptions.uri, uri = _a === void 0 ? '/graphql' : _a, // use default global fetch is nothing passed in fetcher = linkOptions.fetch, includeExtensions = linkOptions.includeExtensions, useGETForQueries = linkOptions.useGETForQueries, requestOptions = __rest(linkOptions, ["uri", "fetch", "includeExtensions", "useGETForQueries"]); // dev warnings to ensure fetch is present apolloLinkHttpCommon.checkFetcher(fetcher); //fetcher is set here rather than the destructuring to ensure fetch is //declared before referencing it. Reference in the destructuring would cause //a ReferenceError if (!fetcher) { fetcher = fetch; } var linkConfig = { http: { includeExtensions: includeExtensions }, options: requestOptions.fetchOptions, credentials: requestOptions.credentials, headers: requestOptions.headers, }; return new apolloLink.ApolloLink(function (operation) { var chosenURI = apolloLinkHttpCommon.selectURI(operation, uri); var context = operation.getContext(); // `apollographql-client-*` headers are automatically set if a // `clientAwareness` object is found in the context. These headers are // set first, followed by the rest of the headers pulled from // `context.headers`. If desired, `apollographql-client-*` headers set by // the `clientAwareness` object can be overridden by // `apollographql-client-*` headers set in `context.headers`. var clientAwarenessHeaders = {}; if (context.clientAwareness) { var _a = context.clientAwareness, name_1 = _a.name, version = _a.version; clientAwarenessHeaders['apollographql-client-name'] = name_1; clientAwarenessHeaders['apollographql-client-version'] = version; } var contextHeaders = __assign({}, clientAwarenessHeaders, context.headers); var contextConfig = { http: context.http, options: context.fetchOptions, credentials: context.credentials, headers: contextHeaders, }; //uses fallback, link, and then context to build options var _b = apolloLinkHttpCommon.selectHttpOptionsAndBody(operation, apolloLinkHttpCommon.fallbackHttpConfig, linkConfig, contextConfig), options = _b.options, body = _b.body; var controller; if (!options.signal) { var _c = apolloLinkHttpCommon.createSignalIfSupported(), _controller = _c.controller, signal = _c.signal; controller = _controller; if (controller) options.signal = signal; } // If requested, set method to GET if there are no mutations. var definitionIsMutation = function (d) { return d.kind === 'OperationDefinition' && d.operation === 'mutation'; }; if (useGETForQueries && !operation.query.definitions.some(definitionIsMutation)) { options.method = 'GET'; } if (options.method === 'GET') { var _d = rewriteURIForGET(chosenURI, body), newURI = _d.newURI, parseError = _d.parseError; if (parseError) { return apolloLink.fromError(parseError); } chosenURI = newURI; } else { try { options.body = apolloLinkHttpCommon.serializeFetchParameter(body, 'Payload'); } catch (parseError) { return apolloLink.fromError(parseError); } } return new apolloLink.Observable(function (observer) { fetcher(chosenURI, options) .then(function (response) { operation.setContext({ response: response }); return response; }) .then(apolloLinkHttpCommon.parseAndCheckHttpResponse(operation)) .then(function (result) { // we have data and can send it to back up the link chain observer.next(result); observer.complete(); return result; }) .catch(function (err) { // fetch was cancelled so its already been cleaned up in the unsubscribe if (err.name === 'AbortError') return; // if it is a network error, BUT there is graphql result info // fire the next observer before calling error // this gives apollo-client (and react-apollo) the `graphqlErrors` and `networErrors` // to pass to UI // this should only happen if we *also* have data as part of the response key per // the spec if (err.result && err.result.errors && err.result.data) { // if we dont' call next, the UI can only show networkError because AC didn't // get andy graphqlErrors // this is graphql execution result info (i.e errors and possibly data) // this is because there is no formal spec how errors should translate to // http status codes. So an auth error (401) could have both data // from a public field, errors from a private field, and a status of 401 // { // user { // this will have errors // firstName // } // products { // this is public so will have data // cost // } // } // // the result of above *could* look like this: // { // data: { products: [{ cost: "$10" }] }, // errors: [{ // message: 'your session has timed out', // path: [] // }] // } // status code of above would be a 401 // in the UI you want to show data where you can, errors as data where you can // and use correct http status codes observer.next(err.result); } observer.error(err); }); return function () { // XXX support canceling this request // https://developers.google.com/web/updates/2017/09/abortable-fetch if (controller) controller.abort(); }; }); }); }; // For GET operations, returns the given URI rewritten with parameters, or a // parse error. function rewriteURIForGET(chosenURI, body) { // Implement the standard HTTP GET serialization, plus 'extensions'. Note // the extra level of JSON serialization! var queryParams = []; var addQueryParam = function (key, value) { queryParams.push(key + "=" + encodeURIComponent(value)); }; if ('query' in body) { addQueryParam('query', body.query); } if (body.operationName) { addQueryParam('operationName', body.operationName); } if (body.variables) { var serializedVariables = void 0; try { serializedVariables = apolloLinkHttpCommon.serializeFetchParameter(body.variables, 'Variables map'); } catch (parseError) { return { parseError: parseError }; } addQueryParam('variables', serializedVariables); } if (body.extensions) { var serializedExtensions = void 0; try { serializedExtensions = apolloLinkHttpCommon.serializeFetchParameter(body.extensions, 'Extensions map'); } catch (parseError) { return { parseError: parseError }; } addQueryParam('extensions', serializedExtensions); } // Reconstruct the URI with added query params. // XXX This assumes that the URI is well-formed and that it doesn't // already contain any of these query params. We could instead use the // URL API and take a polyfill (whatwg-url@6) for older browsers that // don't support URLSearchParams. Note that some browsers (and // versions of whatwg-url) support URL but not URLSearchParams! var fragment = '', preFragment = chosenURI; var fragmentStart = chosenURI.indexOf('#'); if (fragmentStart !== -1) { fragment = chosenURI.substr(fragmentStart); preFragment = chosenURI.substr(0, fragmentStart); } var queryParamsPrefix = preFragment.indexOf('?') === -1 ? '?' : '&'; var newURI = preFragment + queryParamsPrefix + queryParams.join('&') + fragment; return { newURI: newURI }; } var HttpLink = /** @class */ (function (_super) { __extends(HttpLink, _super); function HttpLink(opts) { return _super.call(this, createHttpLink(opts).request) || this; } return HttpLink; }(apolloLink.ApolloLink)); exports.createHttpLink = createHttpLink; exports.HttpLink = HttpLink; Object.defineProperty(exports, '__esModule', { value: true }); }))); //# sourceMappingURL=bundle.umd.js.map