UNPKG

@lifaon/rx-js-light

Version:

Blazing fast Observables

304 lines (303 loc) 12.2 kB
"use strict"; var __extends = this && this.__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 (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }); return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.XHRResponseToResponseUsingReadableStream = exports.XHRResponseToResponse = exports.XHRResponseToResponseInit = exports.parseRawHeaders = exports.XHRResponseToReadableStream = exports.XHRResponseToBlob = exports.XHRResponseToUint8Array = exports.binaryStringToUint8Array = exports.initAndSendXHRFromRequest = exports.initAndSendXHRFromRequestUsingBlob = exports.initAndSendXHRFromRequestUsingReadableStream = exports.initAndSendXHRFromRequestAndBody = exports.initXHRFromRequest = exports.getXHRWithCredentialsValueFromRequest = exports.setHeadersIntoXHR = exports.isReadableStream = exports.areReadableStreamSupported = exports.XHRResponse = void 0; var create_abort_error_1 = require("../../../../../../misc/errors/abort-error/create-abort-error.cjs"); var create_network_error_1 = require("../../../../../../misc/errors/network-error/create-network-error.cjs"); var create_event_listener_1 = require("../../../../../../misc/event-listener/functions/create-event-listener.cjs"); var to_typed_event_target_1 = require("../../../../../../misc/event-listener/functions/to-typed-event-target.cjs"); function getResponseClass() { return typeof Response === 'undefined' ? function () { throw new Error("Unsupported Response"); } : Response; } var XHRResponse = (function (_super) { __extends(XHRResponse, _super); function XHRResponse(body, init) { var _a; var _this = _super.call(this, body, init) || this; _this._url = (_a = init === null || init === void 0 ? void 0 : init.url) !== null && _a !== void 0 ? _a : _super.prototype.url; return _this; } Object.defineProperty(XHRResponse.prototype, "url", { get: function () { return this._url; }, enumerable: false, configurable: true }); return XHRResponse; })(getResponseClass()); exports.XHRResponse = XHRResponse; function areReadableStreamSupported() { return globalThis.ReadableStream !== void 0; } exports.areReadableStreamSupported = areReadableStreamSupported; function isReadableStream(value) { return value instanceof ReadableStream; } exports.isReadableStream = isReadableStream; function setHeadersIntoXHR(headers, xhr) { headers.forEach(function (value, key) { xhr.setRequestHeader(key, value); }); } exports.setHeadersIntoXHR = setHeadersIntoXHR; function getXHRWithCredentialsValueFromRequest(request) { switch (request.credentials) { case 'omit': return false; case 'same-origin': return window.location.origin === new URL(request.url).origin; case 'include': return true; default: throw new TypeError("Unsupported request.credentials"); } } exports.getXHRWithCredentialsValueFromRequest = getXHRWithCredentialsValueFromRequest; function initXHRFromRequest(request, xhr, responseType) { if (request.signal.aborted) { xhr.abort(); } else { var end_1 = function () { removeLoadEventListener_1(); removeErrorEventListener_1(); removeAbortEventListener_1(); }; xhr.open(request.method, request.url, true); if (responseType === 'binary-string') { xhr.responseType = 'text'; xhr.overrideMimeType('text/plain; charset=x-user-defined'); } else { xhr.responseType = responseType; } xhr.withCredentials = getXHRWithCredentialsValueFromRequest(request); setHeadersIntoXHR(request.headers, xhr); var removeLoadEventListener_1 = (0, create_event_listener_1.createEventListener)((0, to_typed_event_target_1.toTypedEventTarget)(xhr), 'load', end_1); var removeErrorEventListener_1 = (0, create_event_listener_1.createEventListener)((0, to_typed_event_target_1.toTypedEventTarget)(xhr), 'error', end_1); var removeAbortEventListener_1 = (0, create_event_listener_1.createEventListener)((0, to_typed_event_target_1.toTypedEventTarget)(request.signal), 'abort', function () { end_1(); xhr.abort(); }); } } exports.initXHRFromRequest = initXHRFromRequest; function initAndSendXHRFromRequestAndBody(xhr, responseType, request, body) { initXHRFromRequest(request, xhr, responseType); xhr.send(body); } exports.initAndSendXHRFromRequestAndBody = initAndSendXHRFromRequestAndBody; function initAndSendXHRFromRequestUsingReadableStream(xhr, responseType, request) { return initAndSendXHRFromRequestAndBody(xhr, responseType, request, request.body); } exports.initAndSendXHRFromRequestUsingReadableStream = initAndSendXHRFromRequestUsingReadableStream; function initAndSendXHRFromRequestUsingBlob(xhr, responseType, request, signal) { if (signal === null || signal === void 0 ? void 0 : signal.aborted) { return Promise.reject((0, create_abort_error_1.createAbortError)()); } else { return request.blob().then(function (blob) { if (signal === null || signal === void 0 ? void 0 : signal.aborted) { throw (0, create_abort_error_1.createAbortError)(); } else { return initAndSendXHRFromRequestAndBody(xhr, responseType, request, blob); } }); } } exports.initAndSendXHRFromRequestUsingBlob = initAndSendXHRFromRequestUsingBlob; function initAndSendXHRFromRequest(xhr, responseType, request, signal) { return areReadableStreamSupported() && isReadableStream(request.body) ? new Promise(function (resolve) { return resolve(initAndSendXHRFromRequestUsingReadableStream(xhr, responseType, request)); }) : initAndSendXHRFromRequestUsingBlob(xhr, responseType, request, signal); } exports.initAndSendXHRFromRequest = initAndSendXHRFromRequest; function binaryStringToUint8Array(input) { var length = input.length; var array = new Uint8Array(length); for (var i = 0; i < length; i++) { array[i] = input.charCodeAt(i); } return array; } exports.binaryStringToUint8Array = binaryStringToUint8Array; function XHRResponseToUint8Array(xhr, responseType) { if (responseType === void 0) { responseType = xhr.responseType; } switch (responseType) { case '': case 'text': return new TextEncoder().encode(xhr.response); case 'binary-string': return binaryStringToUint8Array(xhr.response); case 'arraybuffer': return new Uint8Array(xhr.response); case 'blob': throw new TypeError("Cannot synchronously convert a blob to an Uint8Array"); case 'document': return new TextEncoder().encode(new XMLSerializer().serializeToString(xhr.response)); case 'json': return new TextEncoder().encode(JSON.stringify(xhr.response)); default: throw new TypeError(("Unsupported response type '").concat(responseType, "'")); } } exports.XHRResponseToUint8Array = XHRResponseToUint8Array; function XHRResponseToBlob(xhr, responseType) { if (responseType === void 0) { responseType = xhr.responseType; } var contentType = xhr.getResponseHeader('content-type'); switch (responseType) { case '': case 'text': return new Blob([xhr.response], { type: contentType || 'text/plain' }); case 'binary-string': return new Blob([binaryStringToUint8Array(xhr.response)], { type: contentType || 'text/plain' }); case 'arraybuffer': return new Blob([xhr.response], { type: contentType || void 0 }); case 'blob': return xhr.response; case 'document': return new Blob([new XMLSerializer().serializeToString(xhr.response)], { type: contentType || xhr.response.contentType }); case 'json': return new Blob([JSON.stringify(xhr.response)], { type: contentType || 'application/json' }); default: throw new TypeError(("Unsupported response type '").concat(responseType, "'")); } } exports.XHRResponseToBlob = XHRResponseToBlob; function XHRResponseToReadableStream(xhr, responseType) { if (responseType === void 0) { responseType = xhr.responseType; } var end; return new ReadableStream({ start: function (controller) { var isStreamableResponseType = responseType === 'binary-string'; var readIndex = 0; end = function () { removeLoadEventListener(); removeErrorEventListener(); removeAbortEventListener(); if (removeProgressEventListener !== void 0) { removeProgressEventListener(); } }; var progress = function () { var index = xhr.response.length; if (index !== readIndex) { var data = binaryStringToUint8Array(xhr.response.substring(readIndex, index)); controller.enqueue(data); readIndex = index; } }; var removeLoadEventListener = (0, create_event_listener_1.createEventListener)((0, to_typed_event_target_1.toTypedEventTarget)(xhr), 'load', function () { end(); if (isStreamableResponseType) { progress(); } else { controller.enqueue(XHRResponseToUint8Array(xhr.response, responseType)); } controller.close(); }); var removeErrorEventListener = (0, create_event_listener_1.createEventListener)((0, to_typed_event_target_1.toTypedEventTarget)(xhr), 'error', function () { end(); controller.error((0, create_network_error_1.createNetworkError)()); }); var removeAbortEventListener = (0, create_event_listener_1.createEventListener)((0, to_typed_event_target_1.toTypedEventTarget)(xhr), 'abort', function () { end(); controller.error((0, create_abort_error_1.createAbortError)()); }); var removeProgressEventListener; if (isStreamableResponseType) { removeProgressEventListener = (0, create_event_listener_1.createEventListener)((0, to_typed_event_target_1.toTypedEventTarget)(xhr), 'progress', progress); } }, cancel: function () { if (end !== void 0) { end(); } } }); } exports.XHRResponseToReadableStream = XHRResponseToReadableStream; function parseRawHeaders(headers) { return headers.split(/\r?\n/g).map(function (header) { var parts = header.split(': '); var key = parts.shift(); var value = parts.join(': '); return [key.trim(), value.trim()]; }).filter(function (_a) { var key = _a[0]; return key !== ''; }); } exports.parseRawHeaders = parseRawHeaders; function XHRResponseToResponseInit(xhr) { return { headers: new Headers(parseRawHeaders(xhr.getAllResponseHeaders())), status: xhr.status, statusText: xhr.statusText, url: xhr.responseURL }; } exports.XHRResponseToResponseInit = XHRResponseToResponseInit; function XHRResponseToResponse(xhr, responseType) { if (responseType === void 0) { responseType = xhr.responseType; } var init = XHRResponseToResponseInit(xhr); switch (responseType) { case '': case 'text': return new XHRResponse(xhr.response, init); case 'arraybuffer': return new XHRResponse(xhr.response, init); case 'blob': return new XHRResponse(xhr.response, init); case 'document': case 'json': case 'binary-string': return new XHRResponse(XHRResponseToBlob(xhr, responseType), init); default: throw new TypeError(("Unsupported response type '").concat(responseType, "'")); } } exports.XHRResponseToResponse = XHRResponseToResponse; function XHRResponseToResponseUsingReadableStream(xhr, responseType) { return new XHRResponse(XHRResponseToReadableStream(xhr, responseType), XHRResponseToResponseInit(xhr)); } exports.XHRResponseToResponseUsingReadableStream = XHRResponseToResponseUsingReadableStream;