@lifaon/rx-js-light
Version:
Blazing fast Observables
128 lines (127 loc) • 6.76 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.fromXHR = void 0;
var is_abort_error_1 = require("../../../../../../../misc/errors/abort-error/is-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");
var noop_1 = require("../../../../../../../misc/helpers/noop.cjs");
var complete_notification_constant_1 = require("../../../../../../../misc/notifications/built-in/complete/complete-notification.constant.cjs");
var create_download_progress_notification_1 = require("../../../../../../../misc/notifications/built-in/download-progress/create-download-progress-notification.cjs");
var create_error_notification_1 = require("../../../../../../../misc/notifications/built-in/error/create-error-notification.cjs");
var create_abort_error_notification_1 = require("../../../../../../../misc/notifications/built-in/error/derived/create-abort-error-notification.cjs");
var create_next_notification_1 = require("../../../../../../../misc/notifications/built-in/next/create-next-notification.cjs");
var upload_complete_notification_constant_1 = require("../../../../../../../misc/notifications/built-in/upload-complete/upload-complete-notification.constant.cjs");
var create_upload_progress_notification_1 = require("../../../../../../../misc/notifications/built-in/upload-progress/create-upload-progress-notification.cjs");
var create_progress_from_progress_event_1 = require("../../../../../../../misc/progress/create-progress-from-progress-event.cjs");
var xhr_helpers_1 = require("../xhr-helpers.cjs");
function fromXHR(requestInfo, requestInit, options) {
var request = new Request(requestInfo, requestInit);
var useReadableStream = (0, xhr_helpers_1.areReadableStreamSupported)() && (options === void 0 || options.useReadableStream === void 0 ? true : options.useReadableStream);
return function (emit) {
if (request.signal.aborted) {
emit((0, create_abort_error_notification_1.createAbortErrorNotification)({
signal: request.signal
}));
return noop_1.noop;
} else {
var running_1 = true;
var xhr_1 = new XMLHttpRequest();
var stream_1;
var responseType_1;
if (useReadableStream) {
responseType_1 = 'binary-string';
stream_1 = (0, xhr_helpers_1.XHRResponseToReadableStream)(xhr_1, responseType_1);
} else {
responseType_1 = 'blob';
}
var end_1 = function () {
running_1 = false;
removeReadyStateChangeEventListener_1();
removeLoadEventListener_1();
removeErrorEventListener_1();
removeAbortEventListener_1();
removeDownloadProgressEventListener_1();
removeUploadProgressEventListener_1();
removeUploadCompleteEventListener_1();
};
var next_1 = function (response) {
emit((0, create_next_notification_1.createNextNotification)(response));
};
var complete = function () {
if (running_1) {
end_1();
emit(complete_notification_constant_1.STATIC_COMPLETE_NOTIFICATION);
}
};
var error_1 = function (error) {
if (running_1) {
end_1();
emit((0, create_error_notification_1.createErrorNotification)(error));
}
};
var abort = function () {
if (running_1) {
end_1();
emit((0, create_abort_error_notification_1.createAbortErrorNotification)({
signal: request.signal
}));
}
};
var downloadProgress_1 = function (progress) {
if (running_1) {
emit((0, create_download_progress_notification_1.createDownloadProgressNotification)(progress));
}
};
var uploadProgress_1 = function (progress) {
if (running_1) {
emit((0, create_upload_progress_notification_1.createUploadProgressNotification)(progress));
}
};
var uploadComplete = function () {
if (running_1) {
emit(upload_complete_notification_constant_1.STATIC_UPLOAD_COMPLETE_NOTIFICATION);
}
};
var removeReadyStateChangeEventListener_1 = (0, create_event_listener_1.createEventListener)((0, to_typed_event_target_1.toTypedEventTarget)(xhr_1), 'readystatechange', function () {
if (running_1) {
if (stream_1 === void 0) {
if (xhr_1.readyState === xhr_1.DONE) {
next_1((0, xhr_helpers_1.XHRResponseToResponse)(xhr_1, responseType_1));
}
} else {
if (xhr_1.readyState === xhr_1.HEADERS_RECEIVED) {
next_1(new xhr_helpers_1.XHRResponse(stream_1, (0, xhr_helpers_1.XHRResponseToResponseInit)(xhr_1)));
}
}
}
});
var removeLoadEventListener_1 = (0, create_event_listener_1.createEventListener)((0, to_typed_event_target_1.toTypedEventTarget)(xhr_1), 'load', complete);
var removeErrorEventListener_1 = (0, create_event_listener_1.createEventListener)((0, to_typed_event_target_1.toTypedEventTarget)(xhr_1), 'error', function () {
error_1((0, create_network_error_1.createNetworkErrorFromRequest)(request));
});
var removeAbortEventListener_1 = (0, create_event_listener_1.createEventListener)((0, to_typed_event_target_1.toTypedEventTarget)(xhr_1), 'abort', abort);
var removeDownloadProgressEventListener_1 = (0, create_event_listener_1.createEventListener)((0, to_typed_event_target_1.toTypedEventTarget)(xhr_1), 'progress', function (event) {
downloadProgress_1((0, create_progress_from_progress_event_1.createProgressFromProgressEvent)(event));
});
var removeUploadProgressEventListener_1 = (0, create_event_listener_1.createEventListener)((0, to_typed_event_target_1.toTypedEventTarget)(xhr_1.upload), 'progress', function (event) {
uploadProgress_1((0, create_progress_from_progress_event_1.createProgressFromProgressEvent)(event));
});
var removeUploadCompleteEventListener_1 = (0, create_event_listener_1.createEventListener)((0, to_typed_event_target_1.toTypedEventTarget)(xhr_1.upload), 'load', uploadComplete);
(0, xhr_helpers_1.initAndSendXHRFromRequest)(xhr_1, responseType_1, request).catch(function (error) {
if (!(0, is_abort_error_1.isAbortError)(error)) {
throw error;
}
});
return function () {
if (running_1) {
end_1();
xhr_1.abort();
}
};
}
};
}
exports.fromXHR = fromXHR;