UNPKG

@rpldy/chunked-sender

Version:

adds chunked upload capabilities on top of the regular XHR uploads

48 lines 1.82 kB
import { logger } from "@rpldy/shared"; import getChunks from "./getChunks"; import sendChunks from "./sendChunks"; import { CHUNKED_SENDER_TYPE } from "../consts"; import processChunkProgressData from "./processChunkProgressData"; import getChunkedState from "./getChunkedState"; export const abortChunkedRequest = (chunkedState, item) => { logger.debugLog(`chunkedSender: aborting chunked upload for item: ${item.id}`); const state = chunkedState.getState(); if (!state.finished && !state.aborted) { Object.keys(state.requests).forEach(chunkId => { logger.debugLog(`chunkedSender: aborting chunk: ${chunkId}`); state.requests[chunkId].abort(); }); chunkedState.updateState(state => { state.aborted = true; }); } return state.aborted; }; export const startProcessing = (chunkedState, item, onProgress, trigger) => { const onChunkProgress = (e, chunks) => { const progressData = processChunkProgressData(chunkedState, item, chunks[0].id, e.loaded); onProgress(progressData, [item]); }; const sendPromise = new Promise(resolve => { sendChunks(chunkedState, item, onChunkProgress, resolve, trigger); }); return { sendPromise, abort: () => abortChunkedRequest(chunkedState, item) }; }; const processChunks = (item, chunkedOptions, url, sendOptions, onProgress, trigger) => { const chunks = getChunks(item, chunkedOptions, sendOptions.startByte); const chunkedState = getChunkedState(chunks, url, sendOptions, chunkedOptions); logger.debugLog(`chunkedSender: created ${chunks.length} chunks for: ${item.file.name}.`); const { sendPromise, abort } = startProcessing(chunkedState, item, onProgress, trigger); return { request: sendPromise, abort, senderType: CHUNKED_SENDER_TYPE }; }; export default processChunks;