UNPKG

@apollo/client

Version:

A fully-featured caching GraphQL client.

169 lines 8.4 kB
import { __assign, __awaiter, __generator } from "tslib"; import { responseIterator } from "./responseIterator.js"; import { throwServerError } from "../utils/index.js"; import { PROTOCOL_ERRORS_SYMBOL } from "../../errors/index.js"; import { isApolloPayloadResult } from "../../utilities/common/incrementalResult.js"; var hasOwnProperty = Object.prototype.hasOwnProperty; export function readMultipartBody(response, observer) { var _a, _b, _c, _d, _e; return __awaiter(this, void 0, void 0, function () { var decoder, contentType, delimiter, boundaryVal, boundary, buffer, iterator, running, _f, value, done, chunk, searchFrom, bi, message, i, headers, contentType_1, body, result, next; var _g, _h; return __generator(this, function (_j) { switch (_j.label) { case 0: if (TextDecoder === undefined) { throw new Error("TextDecoder must be defined in the environment: please import a polyfill."); } decoder = new TextDecoder("utf-8"); contentType = (_a = response.headers) === null || _a === void 0 ? void 0 : _a.get("content-type"); delimiter = "boundary="; boundaryVal = (contentType === null || contentType === void 0 ? void 0 : contentType.includes(delimiter)) ? 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() : "-"; boundary = "\r\n--".concat(boundaryVal); buffer = ""; iterator = responseIterator(response); running = true; _j.label = 1; case 1: if (!running) return [3, 3]; return [4, iterator.next()]; case 2: _f = _j.sent(), value = _f.value, done = _f.done; chunk = typeof value === "string" ? value : decoder.decode(value); searchFrom = buffer.length - boundary.length + 1; running = !done; buffer += chunk; bi = buffer.indexOf(boundary, searchFrom); while (bi > -1) { message = void 0; _g = [ buffer.slice(0, bi), buffer.slice(bi + boundary.length), ], message = _g[0], buffer = _g[1]; i = message.indexOf("\r\n\r\n"); headers = parseHeaders(message.slice(0, i)); contentType_1 = headers["content-type"]; if (contentType_1 && contentType_1.toLowerCase().indexOf("application/json") === -1) { throw new Error("Unsupported patch content type: application/json is required."); } body = message.slice(i); if (body) { try { result = parseJsonBody(response, body); if (Object.keys(result).length > 1 || "data" in result || "incremental" in result || "errors" in result || "payload" in result) { if (isApolloPayloadResult(result)) { next = {}; if ("payload" in result) { next = __assign({}, result.payload); } if ("errors" in result) { next = __assign(__assign({}, next), { extensions: __assign(__assign({}, ("extensions" in next ? next.extensions : null)), (_h = {}, _h[PROTOCOL_ERRORS_SYMBOL] = result.errors, _h)) }); } (_b = observer.next) === null || _b === void 0 ? void 0 : _b.call(observer, next); } else { (_c = observer.next) === null || _c === void 0 ? void 0 : _c.call(observer, result); } } else if (Object.keys(result).length === 1 && "hasNext" in result && !result.hasNext) { (_d = observer.complete) === null || _d === void 0 ? void 0 : _d.call(observer); } } catch (err) { handleError(err, observer); } } bi = buffer.indexOf(boundary); } return [3, 1]; case 3: (_e = observer.complete) === null || _e === void 0 ? void 0 : _e.call(observer); return [2]; } }); }); } export function parseHeaders(headerText) { var headersInit = {}; headerText.split("\n").forEach(function (line) { var i = line.indexOf(":"); if (i > -1) { var name_1 = line.slice(0, i).trim().toLowerCase(); var value = line.slice(i + 1).trim(); headersInit[name_1] = value; } }); return headersInit; } export function parseJsonBody(response, bodyText) { if (response.status >= 300) { var getResult = function () { try { return JSON.parse(bodyText); } catch (err) { return bodyText; } }; throwServerError(response, getResult(), "Response not successful: Received status code ".concat(response.status)); } try { return JSON.parse(bodyText); } catch (err) { var parseError = err; parseError.name = "ServerParseError"; parseError.response = response; parseError.statusCode = response.status; parseError.bodyText = bodyText; throw parseError; } } export function handleError(err, observer) { var _a, _b; if (err.name === "AbortError") return; if (err.result && err.result.errors && err.result.data) { (_a = observer.next) === null || _a === void 0 ? void 0 : _a.call(observer, err.result); } (_b = observer.error) === null || _b === void 0 ? void 0 : _b.call(observer, err); } export function readJsonBody(response, operation, observer) { parseAndCheckHttpResponse(operation)(response) .then(function (result) { var _a, _b; (_a = observer.next) === null || _a === void 0 ? void 0 : _a.call(observer, result); (_b = observer.complete) === null || _b === void 0 ? void 0 : _b.call(observer); }) .catch(function (err) { return handleError(err, observer); }); } export function parseAndCheckHttpResponse(operations) { return function (response) { return response .text() .then(function (bodyText) { return parseJsonBody(response, bodyText); }) .then(function (result) { if (response.status >= 300) { throwServerError(response, result, "Response not successful: Received status code ".concat(response.status)); } if (!Array.isArray(result) && !hasOwnProperty.call(result, "data") && !hasOwnProperty.call(result, "errors")) { throwServerError(response, result, "Server response was missing for query '".concat(Array.isArray(operations) ? operations.map(function (op) { return op.operationName; }) : operations.operationName, "'.")); } return result; }); }; } //# sourceMappingURL=parseAndCheckHttpResponse.js.map