@lifaon/rx-js-light
Version:
Blazing fast Observables
80 lines (79 loc) • 2.97 kB
JavaScript
import {createEventListener} from "../../../../../../misc/event-listener/functions/create-event-listener.mjs";
import {toTypedEventTarget} from "../../../../../../misc/event-listener/functions/to-typed-event-target.mjs";
import {STATIC_COMPLETE_NOTIFICATION} from "../../../../../../misc/notifications/built-in/complete/complete-notification.constant.mjs";
import {createErrorNotification} from "../../../../../../misc/notifications/built-in/error/create-error-notification.mjs";
import {createAbortErrorNotification} from "../../../../../../misc/notifications/built-in/error/derived/create-abort-error-notification.mjs";
import {createNextNotification} from "../../../../../../misc/notifications/built-in/next/create-next-notification.mjs";
import {createProgressNotification} from "../../../../../../misc/notifications/built-in/progress-notification.mjs";
import {createProgressFromProgressEvent} from "../../../../../../misc/progress/create-progress-from-progress-event.mjs";
export function readBlob(blob, readType) {
return emit => {
const fileReader = new FileReader();
let running = true;
const end = () => {
running = false;
removeLoadEventListener();
removeErrorEventListener();
removeAbortEventListener();
removeProgressEventListener();
};
const next = value => {
if (running) {
emit(createNextNotification(value));
}
};
const complete = () => {
if (running) {
end();
emit(STATIC_COMPLETE_NOTIFICATION);
}
};
const error = error => {
if (running) {
end();
emit(createErrorNotification(error));
}
};
const abort = () => {
if (running) {
end();
emit(createAbortErrorNotification());
}
};
const progress = progress => {
if (running) {
emit(createProgressNotification(progress));
}
};
const removeLoadEventListener = createEventListener(toTypedEventTarget(fileReader), 'load', () => {
next(fileReader.result);
complete();
});
const removeErrorEventListener = createEventListener(toTypedEventTarget(fileReader), 'error', () => {
error(fileReader.error);
});
const removeAbortEventListener = createEventListener(toTypedEventTarget(fileReader), 'abort', abort);
const removeProgressEventListener = createEventListener(toTypedEventTarget(fileReader), 'progress', event => {
progress(createProgressFromProgressEvent(event));
});
switch (readType) {
case 'data-url':
fileReader.readAsDataURL(blob);
break;
case 'text':
fileReader.readAsText(blob);
break;
case 'array-buffer':
fileReader.readAsArrayBuffer(blob);
break;
default:
throw new TypeError(`Expected 'data-url', 'text', or 'array-buffer' as type`);
}
return () => {
if (running) {
end();
fileReader.abort();
}
};
};
}