You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
365 lines
13 KiB
365 lines
13 KiB
'use strict'; |
|
|
|
Object.defineProperty(exports, '__esModule', { value: true }); |
|
|
|
var utilities = require('../..'); |
|
var tslib = require('tslib'); |
|
var utils = require('../../../link/utils'); |
|
var errors = require('../../../errors'); |
|
var core = require('../../../core'); |
|
|
|
function asyncIterator(source) { |
|
var _a; |
|
var iterator = source[Symbol.asyncIterator](); |
|
return _a = { |
|
next: function () { |
|
return iterator.next(); |
|
} |
|
}, |
|
_a[Symbol.asyncIterator] = function () { |
|
return this; |
|
}, |
|
_a; |
|
} |
|
|
|
function nodeStreamIterator(stream) { |
|
var cleanup = null; |
|
var error = null; |
|
var done = false; |
|
var data = []; |
|
var waiting = []; |
|
function onData(chunk) { |
|
if (error) |
|
return; |
|
if (waiting.length) { |
|
var shiftedArr = waiting.shift(); |
|
if (Array.isArray(shiftedArr) && shiftedArr[0]) { |
|
return shiftedArr[0]({ value: chunk, done: false }); |
|
} |
|
} |
|
data.push(chunk); |
|
} |
|
function onError(err) { |
|
error = err; |
|
var all = waiting.slice(); |
|
all.forEach(function (pair) { |
|
pair[1](err); |
|
}); |
|
!cleanup || cleanup(); |
|
} |
|
function onEnd() { |
|
done = true; |
|
var all = waiting.slice(); |
|
all.forEach(function (pair) { |
|
pair[0]({ value: undefined, done: true }); |
|
}); |
|
!cleanup || cleanup(); |
|
} |
|
cleanup = function () { |
|
cleanup = null; |
|
stream.removeListener("data", onData); |
|
stream.removeListener("error", onError); |
|
stream.removeListener("end", onEnd); |
|
stream.removeListener("finish", onEnd); |
|
stream.removeListener("close", onEnd); |
|
}; |
|
stream.on("data", onData); |
|
stream.on("error", onError); |
|
stream.on("end", onEnd); |
|
stream.on("finish", onEnd); |
|
stream.on("close", onEnd); |
|
function getNext() { |
|
return new Promise(function (resolve, reject) { |
|
if (error) |
|
return reject(error); |
|
if (data.length) |
|
return resolve({ value: data.shift(), done: false }); |
|
if (done) |
|
return resolve({ value: undefined, done: true }); |
|
waiting.push([resolve, reject]); |
|
}); |
|
} |
|
var iterator = { |
|
next: function () { |
|
return getNext(); |
|
}, |
|
}; |
|
if (utilities.canUseAsyncIteratorSymbol) { |
|
iterator[Symbol.asyncIterator] = function () { |
|
return this; |
|
}; |
|
} |
|
return iterator; |
|
} |
|
|
|
function promiseIterator(promise) { |
|
var resolved = false; |
|
var iterator = { |
|
next: function () { |
|
if (resolved) |
|
return Promise.resolve({ |
|
value: undefined, |
|
done: true, |
|
}); |
|
resolved = true; |
|
return new Promise(function (resolve, reject) { |
|
promise |
|
.then(function (value) { |
|
resolve({ value: value, done: false }); |
|
}) |
|
.catch(reject); |
|
}); |
|
}, |
|
}; |
|
if (utilities.canUseAsyncIteratorSymbol) { |
|
iterator[Symbol.asyncIterator] = function () { |
|
return this; |
|
}; |
|
} |
|
return iterator; |
|
} |
|
|
|
function readerIterator(reader) { |
|
var iterator = { |
|
next: function () { |
|
return reader.read(); |
|
}, |
|
}; |
|
if (utilities.canUseAsyncIteratorSymbol) { |
|
iterator[Symbol.asyncIterator] = function () { |
|
return this; |
|
}; |
|
} |
|
return iterator; |
|
} |
|
|
|
function isNodeResponse(value) { |
|
return !!value.body; |
|
} |
|
function isReadableStream(value) { |
|
return !!value.getReader; |
|
} |
|
function isAsyncIterableIterator(value) { |
|
return !!(utilities.canUseAsyncIteratorSymbol && |
|
value[Symbol.asyncIterator]); |
|
} |
|
function isStreamableBlob(value) { |
|
return !!value.stream; |
|
} |
|
function isBlob(value) { |
|
return !!value.arrayBuffer; |
|
} |
|
function isNodeReadableStream(value) { |
|
return !!value.pipe; |
|
} |
|
function responseIterator(response) { |
|
var body = response; |
|
if (isNodeResponse(response)) |
|
body = response.body; |
|
if (isAsyncIterableIterator(body)) |
|
return asyncIterator(body); |
|
if (isReadableStream(body)) |
|
return readerIterator(body.getReader()); |
|
if (isStreamableBlob(body)) { |
|
return readerIterator(body.stream().getReader()); |
|
} |
|
if (isBlob(body)) |
|
return promiseIterator(body.arrayBuffer()); |
|
if (isNodeReadableStream(body)) |
|
return nodeStreamIterator(body); |
|
throw new Error("Unknown body type for responseIterator. Please pass a streamable response."); |
|
} |
|
|
|
function isNonNullObject(obj) { |
|
return obj !== null && typeof obj === "object"; |
|
} |
|
|
|
function isApolloPayloadResult(value) { |
|
return isNonNullObject(value) && "payload" in value; |
|
} |
|
|
|
function readMultipartBody(response, nextValue) { |
|
var _a; |
|
return tslib.__awaiter(this, void 0, void 0, function () { |
|
var decoder, contentType, delimiter, boundaryVal, boundary, buffer, iterator, running, _b, value, done, chunk, searchFrom, bi, message, i, headers, contentType_1, body, result, next; |
|
var _c, _d; |
|
return tslib.__generator(this, function (_e) { |
|
switch (_e.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; |
|
_e.label = 1; |
|
case 1: |
|
if (!running) return [3 , 3]; |
|
return [4 , iterator.next()]; |
|
case 2: |
|
_b = _e.sent(), value = _b.value, done = _b.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; |
|
_c = [ |
|
buffer.slice(0, bi), |
|
buffer.slice(bi + boundary.length), |
|
], message = _c[0], buffer = _c[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) { |
|
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 = tslib.__assign({}, result.payload); |
|
} |
|
if ("errors" in result) { |
|
next = tslib.__assign(tslib.__assign({}, next), { extensions: tslib.__assign(tslib.__assign({}, ("extensions" in next ? next.extensions : null)), (_d = {}, _d[errors.PROTOCOL_ERRORS_SYMBOL] = result.errors, _d)) }); |
|
} |
|
nextValue(next); |
|
} |
|
else { |
|
nextValue(result); |
|
} |
|
} |
|
else if ( |
|
Object.keys(result).length === 1 && |
|
"hasNext" in result && |
|
!result.hasNext) { |
|
return [2 ]; |
|
} |
|
} |
|
bi = buffer.indexOf(boundary); |
|
} |
|
return [3 , 1]; |
|
case 3: return [2 ]; |
|
} |
|
}); |
|
}); |
|
} |
|
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; |
|
} |
|
function parseJsonBody(response, bodyText) { |
|
if (response.status >= 300) { |
|
var getResult = function () { |
|
try { |
|
return JSON.parse(bodyText); |
|
} |
|
catch (err) { |
|
return bodyText; |
|
} |
|
}; |
|
utils.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; |
|
} |
|
} |
|
function handleError(err, observer) { |
|
if (err.result && err.result.errors && err.result.data) { |
|
observer.next(err.result); |
|
} |
|
observer.error(err); |
|
} |
|
|
|
var defaultHttpOptions = { |
|
includeQuery: true, |
|
includeExtensions: false, |
|
preserveHeaderCase: false, |
|
}; |
|
var defaultHeaders = { |
|
accept: "*/*", |
|
"content-type": "application/json", |
|
}; |
|
var defaultOptions = { |
|
method: "POST", |
|
}; |
|
var fallbackHttpConfig = { |
|
http: defaultHttpOptions, |
|
headers: defaultHeaders, |
|
options: defaultOptions, |
|
}; |
|
|
|
function generateOptionsForMultipartSubscription(headers) { |
|
var options = tslib.__assign(tslib.__assign({}, fallbackHttpConfig.options), { headers: tslib.__assign(tslib.__assign(tslib.__assign({}, (headers || {})), fallbackHttpConfig.headers), { accept: "multipart/mixed;boundary=graphql;subscriptionSpec=1.0,application/json" }) }); |
|
return options; |
|
} |
|
|
|
var backupFetch = utilities.maybe(function () { return fetch; }); |
|
function createFetchMultipartSubscription(uri, _a) { |
|
var _b = _a === void 0 ? {} : _a, preferredFetch = _b.fetch, headers = _b.headers; |
|
return function multipartSubscriptionForwarder(_a) { |
|
var query = _a.query, variables = _a.variables; |
|
var body = { variables: variables, query: query }; |
|
var options = generateOptionsForMultipartSubscription(headers || {}); |
|
return new utilities.Observable(function (observer) { |
|
try { |
|
options.body = core.serializeFetchParameter(body, "Payload"); |
|
} |
|
catch (parseError) { |
|
observer.error(parseError); |
|
} |
|
var currentFetch = preferredFetch || utilities.maybe(function () { return fetch; }) || backupFetch; |
|
var observerNext = observer.next.bind(observer); |
|
currentFetch(uri, options) |
|
.then(function (response) { |
|
var _a; |
|
var ctype = (_a = response.headers) === null || _a === void 0 ? void 0 : _a.get("content-type"); |
|
if (ctype !== null && /^multipart\/mixed/i.test(ctype)) { |
|
return readMultipartBody(response, observerNext); |
|
} |
|
observer.error(new Error("Expected multipart response")); |
|
}) |
|
.then(function () { |
|
observer.complete(); |
|
}) |
|
.catch(function (err) { |
|
handleError(err, observer); |
|
}); |
|
}); |
|
}; |
|
} |
|
|
|
exports.createFetchMultipartSubscription = createFetchMultipartSubscription; |
|
//# sourceMappingURL=urql.cjs.map
|
|
|