1 | import { __awaiter, __generator } from "tslib";
|
2 | import { responseIterator } from "./responseIterator.js";
|
3 | import { throwServerError } from "../utils/index.js";
|
4 | var hasOwnProperty = Object.prototype.hasOwnProperty;
|
5 | export function readMultipartBody(response, observer) {
|
6 | var _a, _b, _c;
|
7 | return __awaiter(this, void 0, void 0, function () {
|
8 | var decoder, contentType, delimiter, boundaryVal, boundary, buffer, iterator, running, _d, value, done, chunk, bi, message, i, headers, contentType_1, body, result;
|
9 | var _e;
|
10 | return __generator(this, function (_f) {
|
11 | switch (_f.label) {
|
12 | case 0:
|
13 | if (TextDecoder === undefined) {
|
14 | throw new Error("TextDecoder must be defined in the environment: please import a polyfill.");
|
15 | }
|
16 | decoder = new TextDecoder("utf-8");
|
17 | contentType = (_a = response.headers) === null || _a === void 0 ? void 0 : _a.get('content-type');
|
18 | delimiter = "boundary=";
|
19 | boundaryVal = (contentType === null || contentType === void 0 ? void 0 : contentType.includes(delimiter))
|
20 | ? 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()
|
21 | : "-";
|
22 | boundary = "--".concat(boundaryVal);
|
23 | buffer = "";
|
24 | iterator = responseIterator(response);
|
25 | running = true;
|
26 | _f.label = 1;
|
27 | case 1:
|
28 | if (!running) return [3, 3];
|
29 | return [4, iterator.next()];
|
30 | case 2:
|
31 | _d = _f.sent(), value = _d.value, done = _d.done;
|
32 | chunk = typeof value === "string" ? value : decoder.decode(value);
|
33 | running = !done;
|
34 | buffer += chunk;
|
35 | bi = buffer.indexOf(boundary);
|
36 | while (bi > -1) {
|
37 | message = void 0;
|
38 | _e = [
|
39 | buffer.slice(0, bi),
|
40 | buffer.slice(bi + boundary.length),
|
41 | ], message = _e[0], buffer = _e[1];
|
42 | if (message.trim()) {
|
43 | i = message.indexOf("\r\n\r\n");
|
44 | headers = parseHeaders(message.slice(0, i));
|
45 | contentType_1 = headers["content-type"];
|
46 | if (contentType_1 &&
|
47 | contentType_1.toLowerCase().indexOf("application/json") === -1) {
|
48 | throw new Error("Unsupported patch content type: application/json is required.");
|
49 | }
|
50 | body = message.slice(i);
|
51 | try {
|
52 | result = parseJsonBody(response, body.replace("\r\n", ""));
|
53 | if (Object.keys(result).length > 1 ||
|
54 | "data" in result ||
|
55 | "incremental" in result ||
|
56 | "errors" in result) {
|
57 | (_b = observer.next) === null || _b === void 0 ? void 0 : _b.call(observer, result);
|
58 | }
|
59 | }
|
60 | catch (err) {
|
61 | handleError(err, observer);
|
62 | }
|
63 | }
|
64 | bi = buffer.indexOf(boundary);
|
65 | }
|
66 | return [3, 1];
|
67 | case 3:
|
68 | (_c = observer.complete) === null || _c === void 0 ? void 0 : _c.call(observer);
|
69 | return [2];
|
70 | }
|
71 | });
|
72 | });
|
73 | }
|
74 | export function parseHeaders(headerText) {
|
75 | var headersInit = {};
|
76 | headerText.split("\n").forEach(function (line) {
|
77 | var i = line.indexOf(":");
|
78 | if (i > -1) {
|
79 | var name_1 = line.slice(0, i).trim().toLowerCase();
|
80 | var value = line.slice(i + 1).trim();
|
81 | headersInit[name_1] = value;
|
82 | }
|
83 | });
|
84 | return headersInit;
|
85 | }
|
86 | export function parseJsonBody(response, bodyText) {
|
87 | if (response.status >= 300) {
|
88 | var getResult = function () {
|
89 | try {
|
90 | return JSON.parse(bodyText);
|
91 | }
|
92 | catch (err) {
|
93 | return bodyText;
|
94 | }
|
95 | };
|
96 | throwServerError(response, getResult(), "Response not successful: Received status code ".concat(response.status));
|
97 | }
|
98 | try {
|
99 | return JSON.parse(bodyText);
|
100 | }
|
101 | catch (err) {
|
102 | var parseError = err;
|
103 | parseError.name = "ServerParseError";
|
104 | parseError.response = response;
|
105 | parseError.statusCode = response.status;
|
106 | parseError.bodyText = bodyText;
|
107 | throw parseError;
|
108 | }
|
109 | }
|
110 | export function handleError(err, observer) {
|
111 | var _a, _b;
|
112 | if (err.name === "AbortError")
|
113 | return;
|
114 | if (err.result && err.result.errors && err.result.data) {
|
115 | (_a = observer.next) === null || _a === void 0 ? void 0 : _a.call(observer, err.result);
|
116 | }
|
117 | (_b = observer.error) === null || _b === void 0 ? void 0 : _b.call(observer, err);
|
118 | }
|
119 | export function readJsonBody(response, operation, observer) {
|
120 | parseAndCheckHttpResponse(operation)(response)
|
121 | .then(function (result) {
|
122 | var _a, _b;
|
123 | (_a = observer.next) === null || _a === void 0 ? void 0 : _a.call(observer, result);
|
124 | (_b = observer.complete) === null || _b === void 0 ? void 0 : _b.call(observer);
|
125 | })
|
126 | .catch(function (err) { return handleError(err, observer); });
|
127 | }
|
128 | export function parseAndCheckHttpResponse(operations) {
|
129 | return function (response) {
|
130 | return response
|
131 | .text()
|
132 | .then(function (bodyText) { return parseJsonBody(response, bodyText); })
|
133 | .then(function (result) {
|
134 | if (response.status >= 300) {
|
135 | throwServerError(response, result, "Response not successful: Received status code ".concat(response.status));
|
136 | }
|
137 | if (!Array.isArray(result) &&
|
138 | !hasOwnProperty.call(result, "data") &&
|
139 | !hasOwnProperty.call(result, "errors")) {
|
140 | throwServerError(response, result, "Server response was missing for query '".concat(Array.isArray(operations)
|
141 | ? operations.map(function (op) { return op.operationName; })
|
142 | : operations.operationName, "'."));
|
143 | }
|
144 | return result;
|
145 | });
|
146 | };
|
147 | }
|
148 |
|
\ | No newline at end of file |