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