File: source/data-process.js
/**
* 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 data transfer data type when Blob binary data chunks encoded to Base64 encoded string are
* sent or received over the Datachannel connection for the data transfer session.
* <small>Used only in <a href="#method_sendBlobData"><code>sendBlobData()</code> method</a> when
* parameter <code>sendChunksAsBinary</code> value is <code>false</code>.</small>
* @param {String} ARRAY_BUFFER <small>Value <code>"arrayBuffer"</code></small>
* The value of data transfer data type when ArrayBuffer binary data chunks are
* sent or received over the Datachannel connection for the data transfer session.
* <small>Used only in <a href="#method_sendBlobData"><code>sendBlobData()</code> method</a> when
* parameter <code>sendChunksAsBinary</code> value is <code>true</code>.</small>
* @param {String} BLOB <small>Value <code>"blob"</code></small>
* The value of data transfer data type when Blob binary data chunks are
* sent or received over the Datachannel connection for the data transfer session.
* <small>Used only in <a href="#method_sendBlobData"><code>sendBlobData()</code> method</a> when
* parameter <code>sendChunksAsBinary</code> value is <code>true</code>.</small>
* @param {String} STRING <small>Value <code>"string"</code></small>
* The value of data transfer data type when only string data chunks are
* sent or received over the Datachannel connection for the data transfer session.
* <small>Used only in <a href="#method_sendURLData"><code>sendURLData()</code> method</a>.</small>
* @type JSON
* @readOnly
* @for Skylink
* @since 0.1.0
*/
Skylink.prototype.DATA_TRANSFER_DATA_TYPE = {
BINARY_STRING: 'binaryString',
ARRAY_BUFFER: 'arrayBuffer',
BLOB: 'blob',
STRING: 'string'
};
/**
* 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 binary Blob transfers.
* @attribute _BINARY_FILE_SIZE
* @type Number
* @private
* @readOnly
* @for Skylink
* @since 0.6.16
*/
Skylink.prototype._BINARY_FILE_SIZE = 65456;
/**
* Stores the data chunk size for binary Blob transfers.
* @attribute _MOZ_BINARY_FILE_SIZE
* @type Number
* @private
* @readOnly
* @for Skylink
* @since 0.6.16
*/
Skylink.prototype._MOZ_BINARY_FILE_SIZE = 16384;
/**
* 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);
// 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 converts a Blob object into ArrayBuffer object.
* @method _blobToArrayBuffer
* @private
* @for Skylink
* @since 0.1.0
*/
Skylink.prototype._blobToArrayBuffer = function(data, callback) {
var self = this;
var fileReader = new FileReader();
fileReader.onload = function() {
// Load Blob as dataurl base64 string
if (AdapterJS.webrtcDetectedType === 'plugin') {
callback(new Int8Array(fileReader.result));
} else {
callback(fileReader.result);
}
};
fileReader.readAsArrayBuffer(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;
};