@rpldy/chunked-sender
Version:
adds chunked upload capabilities on top of the regular XHR uploads
49 lines • 1.8 kB
JavaScript
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;