@lifaon/rx-js-light
Version:
Blazing fast Observables
304 lines (303 loc) • 12.2 kB
JavaScript
;
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;