UNPKG

@rpldy/chunked-sender

Version:

adds chunked upload capabilities on top of the regular XHR uploads

49 lines 1.8 kB
import { FILE_STATES, logger, pick } from "@rpldy/shared"; import { unwrap } from "@rpldy/simple-state"; import { CHUNK_EVENTS } from "../consts"; const handleChunkRequest = (chunkedState, item, chunkId, chunkSendResult, trigger, onProgress) => { chunkedState.updateState(state => { state.requests[chunkId] = { id: chunkId, abort: chunkSendResult.abort }; }); return chunkSendResult.request.then(result => { logger.debugLog(`chunkedSender: request finished for chunk: ${chunkId} - `, result); chunkedState.updateState(state => { delete state.requests[chunkId]; }); const chunks = chunkedState.getState().chunks; const index = chunks.findIndex(c => c.id === chunkId); if (~index) { if (result.state === FILE_STATES.FINISHED) { const finishedChunk = chunks[index]; chunkedState.updateState(state => { state.chunks = state.chunks.slice(0, index).concat(state.chunks.slice(index + 1)); }); const chunkSize = finishedChunk.end - finishedChunk.start; onProgress({ loaded: chunkSize, total: item.file.size }, [finishedChunk]); trigger(CHUNK_EVENTS.CHUNK_FINISH, { chunk: pick(finishedChunk, ["id", "start", "end", "index", "attempt"]), item: unwrap(item), uploadData: result }); } else if (result.state !== FILE_STATES.ABORTED) { chunkedState.updateState(state => { state.chunks[index].attempt += 1; state.lastChunkErrorData = { status: result.status, response: result.response }; }); } chunkedState.updateState(state => { state.responses.push(result.response); }); } }); }; export default handleChunkRequest;