UNPKG

@lifaon/rx-js-light

Version:

Blazing fast Observables

80 lines (79 loc) 2.97 kB
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(); } }; }; }