UNPKG

23.8 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, '__esModule', { value: true });
4
5var globals = require('../../utilities/globals');
6var tslib = require('tslib');
7var utilities = require('../../utilities');
8var utils = require('../utils');
9var graphql = require('graphql');
10var core = require('../core');
11
12typeof WeakMap === 'function' &&
13 globals.maybe(function () { return navigator.product; }) !== 'ReactNative';
14var canUseSymbol = typeof Symbol === 'function' &&
15 typeof Symbol.for === 'function';
16var canUseAsyncIteratorSymbol = canUseSymbol && Symbol.asyncIterator;
17typeof globals.maybe(function () { return window.document.createElement; }) === "function";
18globals.maybe(function () { return navigator.userAgent.indexOf("jsdom") >= 0; }) || false;
19
20function isNodeResponse(value) {
21 return !!value.body;
22}
23function isReadableStream(value) {
24 return !!value.getReader;
25}
26function isAsyncIterableIterator(value) {
27 return !!(canUseAsyncIteratorSymbol &&
28 value[Symbol.asyncIterator]);
29}
30function isStreamableBlob(value) {
31 return !!value.stream;
32}
33function isBlob(value) {
34 return !!value.arrayBuffer;
35}
36function isNodeReadableStream(value) {
37 return !!value.pipe;
38}
39
40function asyncIterator(source) {
41 var _a;
42 var iterator = source[Symbol.asyncIterator]();
43 return _a = {
44 next: function () {
45 return iterator.next();
46 }
47 },
48 _a[Symbol.asyncIterator] = function () {
49 return this;
50 },
51 _a;
52}
53
54function nodeStreamIterator(stream) {
55 var cleanup = null;
56 var error = null;
57 var done = false;
58 var data = [];
59 var waiting = [];
60 function onData(chunk) {
61 if (error)
62 return;
63 if (waiting.length) {
64 var shiftedArr = waiting.shift();
65 if (Array.isArray(shiftedArr) && shiftedArr[0]) {
66 return shiftedArr[0]({ value: chunk, done: false });
67 }
68 }
69 data.push(chunk);
70 }
71 function onError(err) {
72 error = err;
73 var all = waiting.slice();
74 all.forEach(function (pair) {
75 pair[1](err);
76 });
77 !cleanup || cleanup();
78 }
79 function onEnd() {
80 done = true;
81 var all = waiting.slice();
82 all.forEach(function (pair) {
83 pair[0]({ value: undefined, done: true });
84 });
85 !cleanup || cleanup();
86 }
87 cleanup = function () {
88 cleanup = null;
89 stream.removeListener("data", onData);
90 stream.removeListener("error", onError);
91 stream.removeListener("end", onEnd);
92 stream.removeListener("finish", onEnd);
93 stream.removeListener("close", onEnd);
94 };
95 stream.on("data", onData);
96 stream.on("error", onError);
97 stream.on("end", onEnd);
98 stream.on("finish", onEnd);
99 stream.on("close", onEnd);
100 function getNext() {
101 return new Promise(function (resolve, reject) {
102 if (error)
103 return reject(error);
104 if (data.length)
105 return resolve({ value: data.shift(), done: false });
106 if (done)
107 return resolve({ value: undefined, done: true });
108 waiting.push([resolve, reject]);
109 });
110 }
111 var iterator = {
112 next: function () {
113 return getNext();
114 },
115 };
116 if (utilities.canUseAsyncIteratorSymbol) {
117 iterator[Symbol.asyncIterator] = function () {
118 return this;
119 };
120 }
121 return iterator;
122}
123
124function promiseIterator(promise) {
125 var resolved = false;
126 var iterator = {
127 next: function () {
128 if (resolved)
129 return Promise.resolve({
130 value: undefined,
131 done: true,
132 });
133 resolved = true;
134 return new Promise(function (resolve, reject) {
135 promise
136 .then(function (value) {
137 resolve({ value: value, done: false });
138 })
139 .catch(reject);
140 });
141 },
142 };
143 if (utilities.canUseAsyncIteratorSymbol) {
144 iterator[Symbol.asyncIterator] = function () {
145 return this;
146 };
147 }
148 return iterator;
149}
150
151function readerIterator(reader) {
152 var iterator = {
153 next: function () {
154 return reader.read();
155 },
156 };
157 if (utilities.canUseAsyncIteratorSymbol) {
158 iterator[Symbol.asyncIterator] = function () {
159 return this;
160 };
161 }
162 return iterator;
163}
164
165function responseIterator(response) {
166 var body = response;
167 if (isNodeResponse(response))
168 body = response.body;
169 if (isAsyncIterableIterator(body))
170 return asyncIterator(body);
171 if (isReadableStream(body))
172 return readerIterator(body.getReader());
173 if (isStreamableBlob(body)) {
174 return readerIterator(body.stream().getReader());
175 }
176 if (isBlob(body))
177 return promiseIterator(body.arrayBuffer());
178 if (isNodeReadableStream(body))
179 return nodeStreamIterator(body);
180 throw new Error("Unknown body type for responseIterator. Please pass a streamable response.");
181}
182
183var hasOwnProperty = Object.prototype.hasOwnProperty;
184function readMultipartBody(response, observer) {
185 var _a, _b, _c;
186 return tslib.__awaiter(this, void 0, void 0, function () {
187 var decoder, contentType, delimiter, boundaryVal, boundary, buffer, iterator, running, _d, value, done, chunk, bi, message, i, headers, contentType_1, body, result;
188 var _e;
189 return tslib.__generator(this, function (_f) {
190 switch (_f.label) {
191 case 0:
192 if (TextDecoder === undefined) {
193 throw new Error("TextDecoder must be defined in the environment: please import a polyfill.");
194 }
195 decoder = new TextDecoder("utf-8");
196 contentType = (_a = response.headers) === null || _a === void 0 ? void 0 : _a.get('content-type');
197 delimiter = "boundary=";
198 boundaryVal = (contentType === null || contentType === void 0 ? void 0 : contentType.includes(delimiter))
199 ? contentType === null || contentType === void 0 ? void 0 : contentType.substring((contentType === null || contentType === void 0 ? void 0 : contentType.indexOf(delimiter)) + delimiter.length).replace(/['"]/g, "").replace(/\;(.*)/gm, "").trim()
200 : "-";
201 boundary = "--".concat(boundaryVal);
202 buffer = "";
203 iterator = responseIterator(response);
204 running = true;
205 _f.label = 1;
206 case 1:
207 if (!running) return [3, 3];
208 return [4, iterator.next()];
209 case 2:
210 _d = _f.sent(), value = _d.value, done = _d.done;
211 chunk = typeof value === "string" ? value : decoder.decode(value);
212 running = !done;
213 buffer += chunk;
214 bi = buffer.indexOf(boundary);
215 while (bi > -1) {
216 message = void 0;
217 _e = [
218 buffer.slice(0, bi),
219 buffer.slice(bi + boundary.length),
220 ], message = _e[0], buffer = _e[1];
221 if (message.trim()) {
222 i = message.indexOf("\r\n\r\n");
223 headers = parseHeaders(message.slice(0, i));
224 contentType_1 = headers["content-type"];
225 if (contentType_1 &&
226 contentType_1.toLowerCase().indexOf("application/json") === -1) {
227 throw new Error("Unsupported patch content type: application/json is required.");
228 }
229 body = message.slice(i);
230 try {
231 result = parseJsonBody(response, body.replace("\r\n", ""));
232 if (Object.keys(result).length > 1 ||
233 "data" in result ||
234 "incremental" in result ||
235 "errors" in result) {
236 (_b = observer.next) === null || _b === void 0 ? void 0 : _b.call(observer, result);
237 }
238 }
239 catch (err) {
240 handleError(err, observer);
241 }
242 }
243 bi = buffer.indexOf(boundary);
244 }
245 return [3, 1];
246 case 3:
247 (_c = observer.complete) === null || _c === void 0 ? void 0 : _c.call(observer);
248 return [2];
249 }
250 });
251 });
252}
253function parseHeaders(headerText) {
254 var headersInit = {};
255 headerText.split("\n").forEach(function (line) {
256 var i = line.indexOf(":");
257 if (i > -1) {
258 var name_1 = line.slice(0, i).trim().toLowerCase();
259 var value = line.slice(i + 1).trim();
260 headersInit[name_1] = value;
261 }
262 });
263 return headersInit;
264}
265function parseJsonBody(response, bodyText) {
266 if (response.status >= 300) {
267 var getResult = function () {
268 try {
269 return JSON.parse(bodyText);
270 }
271 catch (err) {
272 return bodyText;
273 }
274 };
275 utils.throwServerError(response, getResult(), "Response not successful: Received status code ".concat(response.status));
276 }
277 try {
278 return JSON.parse(bodyText);
279 }
280 catch (err) {
281 var parseError = err;
282 parseError.name = "ServerParseError";
283 parseError.response = response;
284 parseError.statusCode = response.status;
285 parseError.bodyText = bodyText;
286 throw parseError;
287 }
288}
289function handleError(err, observer) {
290 var _a, _b;
291 if (err.name === "AbortError")
292 return;
293 if (err.result && err.result.errors && err.result.data) {
294 (_a = observer.next) === null || _a === void 0 ? void 0 : _a.call(observer, err.result);
295 }
296 (_b = observer.error) === null || _b === void 0 ? void 0 : _b.call(observer, err);
297}
298function readJsonBody(response, operation, observer) {
299 parseAndCheckHttpResponse(operation)(response)
300 .then(function (result) {
301 var _a, _b;
302 (_a = observer.next) === null || _a === void 0 ? void 0 : _a.call(observer, result);
303 (_b = observer.complete) === null || _b === void 0 ? void 0 : _b.call(observer);
304 })
305 .catch(function (err) { return handleError(err, observer); });
306}
307function parseAndCheckHttpResponse(operations) {
308 return function (response) {
309 return response
310 .text()
311 .then(function (bodyText) { return parseJsonBody(response, bodyText); })
312 .then(function (result) {
313 if (response.status >= 300) {
314 utils.throwServerError(response, result, "Response not successful: Received status code ".concat(response.status));
315 }
316 if (!Array.isArray(result) &&
317 !hasOwnProperty.call(result, "data") &&
318 !hasOwnProperty.call(result, "errors")) {
319 utils.throwServerError(response, result, "Server response was missing for query '".concat(Array.isArray(operations)
320 ? operations.map(function (op) { return op.operationName; })
321 : operations.operationName, "'."));
322 }
323 return result;
324 });
325 };
326}
327
328var serializeFetchParameter = function (p, label) {
329 var serialized;
330 try {
331 serialized = JSON.stringify(p);
332 }
333 catch (e) {
334 var parseError = __DEV__ ? new globals.InvariantError("Network request failed. ".concat(label, " is not serializable: ").concat(e.message)) : new globals.InvariantError(24);
335 parseError.parseError = e;
336 throw parseError;
337 }
338 return serialized;
339};
340
341var defaultHttpOptions = {
342 includeQuery: true,
343 includeExtensions: false,
344 preserveHeaderCase: false,
345};
346var defaultHeaders = {
347 accept: '*/*',
348 'content-type': 'application/json',
349};
350var defaultOptions = {
351 method: 'POST',
352};
353var fallbackHttpConfig = {
354 http: defaultHttpOptions,
355 headers: defaultHeaders,
356 options: defaultOptions,
357};
358var defaultPrinter = function (ast, printer) { return printer(ast); };
359function selectHttpOptionsAndBody(operation, fallbackConfig) {
360 var configs = [];
361 for (var _i = 2; _i < arguments.length; _i++) {
362 configs[_i - 2] = arguments[_i];
363 }
364 configs.unshift(fallbackConfig);
365 return selectHttpOptionsAndBodyInternal.apply(void 0, tslib.__spreadArray([operation,
366 defaultPrinter], configs, false));
367}
368function selectHttpOptionsAndBodyInternal(operation, printer) {
369 var configs = [];
370 for (var _i = 2; _i < arguments.length; _i++) {
371 configs[_i - 2] = arguments[_i];
372 }
373 var options = {};
374 var http = {};
375 configs.forEach(function (config) {
376 options = tslib.__assign(tslib.__assign(tslib.__assign({}, options), config.options), { headers: tslib.__assign(tslib.__assign({}, options.headers), config.headers) });
377 if (config.credentials) {
378 options.credentials = config.credentials;
379 }
380 http = tslib.__assign(tslib.__assign({}, http), config.http);
381 });
382 if (options.headers) {
383 options.headers = removeDuplicateHeaders(options.headers, http.preserveHeaderCase);
384 }
385 var operationName = operation.operationName, extensions = operation.extensions, variables = operation.variables, query = operation.query;
386 var body = { operationName: operationName, variables: variables };
387 if (http.includeExtensions)
388 body.extensions = extensions;
389 if (http.includeQuery)
390 body.query = printer(query, graphql.print);
391 return {
392 options: options,
393 body: body,
394 };
395}
396function removeDuplicateHeaders(headers, preserveHeaderCase) {
397 if (!preserveHeaderCase) {
398 var normalizedHeaders_1 = Object.create(null);
399 Object.keys(Object(headers)).forEach(function (name) {
400 normalizedHeaders_1[name.toLowerCase()] = headers[name];
401 });
402 return normalizedHeaders_1;
403 }
404 var headerData = Object.create(null);
405 Object.keys(Object(headers)).forEach(function (name) {
406 headerData[name.toLowerCase()] = { originalName: name, value: headers[name] };
407 });
408 var normalizedHeaders = Object.create(null);
409 Object.keys(headerData).forEach(function (name) {
410 normalizedHeaders[headerData[name].originalName] = headerData[name].value;
411 });
412 return normalizedHeaders;
413}
414
415var checkFetcher = function (fetcher) {
416 if (!fetcher && typeof fetch === 'undefined') {
417 throw __DEV__ ? new globals.InvariantError("\n\"fetch\" has not been found globally and no fetcher has been configured. To fix this, install a fetch package (like https://www.npmjs.com/package/cross-fetch), instantiate the fetcher, and pass it into your HttpLink constructor. For example:\n\nimport fetch from 'cross-fetch';\nimport { ApolloClient, HttpLink } from '@apollo/client';\nconst client = new ApolloClient({\n link: new HttpLink({ uri: '/graphql', fetch })\n});\n ") : new globals.InvariantError(23);
418 }
419};
420
421var createSignalIfSupported = function () {
422 if (typeof AbortController === 'undefined')
423 return { controller: false, signal: false };
424 var controller = new AbortController();
425 var signal = controller.signal;
426 return { controller: controller, signal: signal };
427};
428
429var selectURI = function (operation, fallbackURI) {
430 var context = operation.getContext();
431 var contextURI = context.uri;
432 if (contextURI) {
433 return contextURI;
434 }
435 else if (typeof fallbackURI === 'function') {
436 return fallbackURI(operation);
437 }
438 else {
439 return fallbackURI || '/graphql';
440 }
441};
442
443function rewriteURIForGET(chosenURI, body) {
444 var queryParams = [];
445 var addQueryParam = function (key, value) {
446 queryParams.push("".concat(key, "=").concat(encodeURIComponent(value)));
447 };
448 if ('query' in body) {
449 addQueryParam('query', body.query);
450 }
451 if (body.operationName) {
452 addQueryParam('operationName', body.operationName);
453 }
454 if (body.variables) {
455 var serializedVariables = void 0;
456 try {
457 serializedVariables = serializeFetchParameter(body.variables, 'Variables map');
458 }
459 catch (parseError) {
460 return { parseError: parseError };
461 }
462 addQueryParam('variables', serializedVariables);
463 }
464 if (body.extensions) {
465 var serializedExtensions = void 0;
466 try {
467 serializedExtensions = serializeFetchParameter(body.extensions, 'Extensions map');
468 }
469 catch (parseError) {
470 return { parseError: parseError };
471 }
472 addQueryParam('extensions', serializedExtensions);
473 }
474 var fragment = '', preFragment = chosenURI;
475 var fragmentStart = chosenURI.indexOf('#');
476 if (fragmentStart !== -1) {
477 fragment = chosenURI.substr(fragmentStart);
478 preFragment = chosenURI.substr(0, fragmentStart);
479 }
480 var queryParamsPrefix = preFragment.indexOf('?') === -1 ? '?' : '&';
481 var newURI = preFragment + queryParamsPrefix + queryParams.join('&') + fragment;
482 return { newURI: newURI };
483}
484
485var backupFetch = utilities.maybe(function () { return fetch; });
486var createHttpLink = function (linkOptions) {
487 if (linkOptions === void 0) { linkOptions = {}; }
488 var _a = linkOptions.uri, uri = _a === void 0 ? '/graphql' : _a, preferredFetch = linkOptions.fetch, _b = linkOptions.print, print = _b === void 0 ? defaultPrinter : _b, includeExtensions = linkOptions.includeExtensions, preserveHeaderCase = linkOptions.preserveHeaderCase, useGETForQueries = linkOptions.useGETForQueries, _c = linkOptions.includeUnusedVariables, includeUnusedVariables = _c === void 0 ? false : _c, requestOptions = tslib.__rest(linkOptions, ["uri", "fetch", "print", "includeExtensions", "preserveHeaderCase", "useGETForQueries", "includeUnusedVariables"]);
489 if (__DEV__) {
490 checkFetcher(preferredFetch || backupFetch);
491 }
492 var linkConfig = {
493 http: { includeExtensions: includeExtensions, preserveHeaderCase: preserveHeaderCase },
494 options: requestOptions.fetchOptions,
495 credentials: requestOptions.credentials,
496 headers: requestOptions.headers,
497 };
498 return new core.ApolloLink(function (operation) {
499 var chosenURI = selectURI(operation, uri);
500 var context = operation.getContext();
501 var clientAwarenessHeaders = {};
502 if (context.clientAwareness) {
503 var _a = context.clientAwareness, name_1 = _a.name, version = _a.version;
504 if (name_1) {
505 clientAwarenessHeaders['apollographql-client-name'] = name_1;
506 }
507 if (version) {
508 clientAwarenessHeaders['apollographql-client-version'] = version;
509 }
510 }
511 var contextHeaders = tslib.__assign(tslib.__assign({}, clientAwarenessHeaders), context.headers);
512 var contextConfig = {
513 http: context.http,
514 options: context.fetchOptions,
515 credentials: context.credentials,
516 headers: contextHeaders,
517 };
518 var _b = selectHttpOptionsAndBodyInternal(operation, print, fallbackHttpConfig, linkConfig, contextConfig), options = _b.options, body = _b.body;
519 if (body.variables && !includeUnusedVariables) {
520 var unusedNames_1 = new Set(Object.keys(body.variables));
521 graphql.visit(operation.query, {
522 Variable: function (node, _key, parent) {
523 if (parent && parent.kind !== 'VariableDefinition') {
524 unusedNames_1.delete(node.name.value);
525 }
526 },
527 });
528 if (unusedNames_1.size) {
529 body.variables = tslib.__assign({}, body.variables);
530 unusedNames_1.forEach(function (name) {
531 delete body.variables[name];
532 });
533 }
534 }
535 var controller;
536 if (!options.signal) {
537 var _c = createSignalIfSupported(), _controller = _c.controller, signal = _c.signal;
538 controller = _controller;
539 if (controller)
540 options.signal = signal;
541 }
542 var definitionIsMutation = function (d) {
543 return d.kind === 'OperationDefinition' && d.operation === 'mutation';
544 };
545 if (useGETForQueries &&
546 !operation.query.definitions.some(definitionIsMutation)) {
547 options.method = 'GET';
548 }
549 if (utilities.hasDirectives(['defer'], operation.query)) {
550 options.headers = options.headers || {};
551 options.headers.accept = "multipart/mixed; deferSpec=20220824, application/json";
552 }
553 if (options.method === 'GET') {
554 var _d = rewriteURIForGET(chosenURI, body), newURI = _d.newURI, parseError = _d.parseError;
555 if (parseError) {
556 return utils.fromError(parseError);
557 }
558 chosenURI = newURI;
559 }
560 else {
561 try {
562 options.body = serializeFetchParameter(body, 'Payload');
563 }
564 catch (parseError) {
565 return utils.fromError(parseError);
566 }
567 }
568 return new utilities.Observable(function (observer) {
569 var currentFetch = preferredFetch || utilities.maybe(function () { return fetch; }) || backupFetch;
570 currentFetch(chosenURI, options)
571 .then(function (response) {
572 var _a;
573 operation.setContext({ response: response });
574 var ctype = (_a = response.headers) === null || _a === void 0 ? void 0 : _a.get('content-type');
575 if (ctype !== null && /^multipart\/mixed/i.test(ctype)) {
576 return readMultipartBody(response, observer);
577 }
578 else {
579 return readJsonBody(response, operation, observer);
580 }
581 })
582 .catch(function (err) { return handleError(err, observer); });
583 return function () {
584 if (controller)
585 controller.abort();
586 };
587 });
588 });
589};
590
591var HttpLink = (function (_super) {
592 tslib.__extends(HttpLink, _super);
593 function HttpLink(options) {
594 if (options === void 0) { options = {}; }
595 var _this = _super.call(this, createHttpLink(options).request) || this;
596 _this.options = options;
597 return _this;
598 }
599 return HttpLink;
600}(core.ApolloLink));
601
602exports.HttpLink = HttpLink;
603exports.checkFetcher = checkFetcher;
604exports.createHttpLink = createHttpLink;
605exports.createSignalIfSupported = createSignalIfSupported;
606exports.defaultPrinter = defaultPrinter;
607exports.fallbackHttpConfig = fallbackHttpConfig;
608exports.parseAndCheckHttpResponse = parseAndCheckHttpResponse;
609exports.rewriteURIForGET = rewriteURIForGET;
610exports.selectHttpOptionsAndBody = selectHttpOptionsAndBody;
611exports.selectHttpOptionsAndBodyInternal = selectHttpOptionsAndBodyInternal;
612exports.selectURI = selectURI;
613exports.serializeFetchParameter = serializeFetchParameter;
614//# sourceMappingURL=http.cjs.map