File: source/data-process.js
/**
* <blockquote class="info">
* Currently, we do not support Blob or ArrayBuffer data type of transfers, but we
* will look into implementing it in the future.
* </blockquote>
* The list of supported data transfer data types.
* @attribute DATA_TRANSFER_DATA_TYPE
* @param {String} BINARY_STRING <small>Value <code>"binaryString"</code></small>
* The value of the transfer type that sends all data packets as string
* (or converts them into string) when transferring data over the Datachannel connection.
* @type JSON
* @readOnly
* @for Skylink
* @since 0.1.0
*/
Skylink.prototype.DATA_TRANSFER_DATA_TYPE = {
BINARY_STRING: 'binaryString',
ARRAY_BUFFER: 'arrayBuffer',
BLOB: 'blob'
};
/**
* Stores the data chunk size for Blob transfers.
* @attribute _CHUNK_FILE_SIZE
* @type Number
* @private
* @readOnly
* @for Skylink
* @since 0.5.2
*/
Skylink.prototype._CHUNK_FILE_SIZE = 49152;
/**
* Stores the data chunk size for Blob transfers transferring from/to
* Firefox browsers due to limitation tested in the past in some PCs (linx predominatly).
* @attribute _MOZ_CHUNK_FILE_SIZE
* @type Number
* @private
* @readOnly
* @for Skylink
* @since 0.5.2
*/
Skylink.prototype._MOZ_CHUNK_FILE_SIZE = 12288;
/**
* Stores the data chunk size for data URI string transfers.
* @attribute _CHUNK_DATAURL_SIZE
* @type Number
* @private
* @readOnly
* @for Skylink
* @since 0.5.2
*/
Skylink.prototype._CHUNK_DATAURL_SIZE = 1212;
/**
* Function that converts Base64 string into Blob object.
* This is referenced from devnull69@stackoverflow.com #6850276.
* @method _base64ToBlob
* @private
* @for Skylink
* @since 0.1.0
*/
Skylink.prototype._base64ToBlob = function(dataURL) {
var byteString = atob(dataURL.replace(/\s\r\n/g, ''));
// write the bytes of the string to an ArrayBuffer
var ab = new ArrayBuffer(byteString.length);
var ia = new Uint8Array(ab);
for (var j = 0; j < byteString.length; j++) {
ia[j] = byteString.charCodeAt(j);
}
// write the ArrayBuffer to a blob, and you're done
return new Blob([ab]);
};
/**
* Function that converts a Blob object into Base64 string.
* @method _blobToBase64
* @private
* @for Skylink
* @since 0.1.0
*/
Skylink.prototype._blobToBase64 = function(data, callback) {
var fileReader = new FileReader();
fileReader.onload = function() {
// Load Blob as dataurl base64 string
var base64BinaryString = fileReader.result.split(',')[1];
callback(base64BinaryString);
};
fileReader.readAsDataURL(data);
};
/**
* Function that chunks Blob object based on the data chunk size provided.
* If provided Blob object size is lesser than or equals to the chunk size, it should return an array
* of length of <code>1</code>.
* @method _chunkBlobData
* @private
* @for Skylink
* @since 0.5.2
*/
Skylink.prototype._chunkBlobData = function(blob, chunkSize) {
var chunksArray = [];
var startCount = 0;
var endCount = 0;
var blobByteSize = blob.size;
if (blobByteSize > chunkSize) {
// File Size greater than Chunk size
while ((blobByteSize - 1) > endCount) {
endCount = startCount + chunkSize;
chunksArray.push(blob.slice(startCount, endCount));
startCount += chunkSize;
}
if ((blobByteSize - (startCount + 1)) > 0) {
chunksArray.push(blob.slice(startCount, blobByteSize - 1));
}
} else {
// File Size below Chunk size
chunksArray.push(blob);
}
return chunksArray;
};
/**
* Function that chunks large string into string chunks based on the data chunk size provided.
* If provided string length is lesser than or equals to the chunk size, it should return an array
* of length of <code>1</code>.
* @method _chunkDataURL
* @private
* @for Skylink
* @since 0.6.1
*/
Skylink.prototype._chunkDataURL = function(dataURL, chunkSize) {
var outputStr = dataURL; //encodeURIComponent(dataURL);
var dataURLArray = [];
var startCount = 0;
var endCount = 0;
var dataByteSize = dataURL.size || dataURL.length;
if (dataByteSize > chunkSize) {
// File Size greater than Chunk size
while ((dataByteSize - 1) > endCount) {
endCount = startCount + chunkSize;
dataURLArray.push(outputStr.slice(startCount, endCount));
startCount += chunkSize;
}
if ((dataByteSize - (startCount + 1)) > 0) {
chunksArray.push(outputStr.slice(startCount, dataByteSize - 1));
}
} else {
// File Size below Chunk size
dataURLArray.push(outputStr);
}
return dataURLArray;
};
/**
* Function that assembles the data string chunks into a large string.
* @method _assembleDataURL
* @private
* @for Skylink
* @since 0.6.1
*/
Skylink.prototype._assembleDataURL = function(dataURLArray) {
var outputStr = '';
for (var i = 0; i < dataURLArray.length; i++) {
try {
outputStr += dataURLArray[i];
} catch (error) {
console.error('Malformed', i, dataURLArray[i]);
}
}
return outputStr;
};