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 (self._isUsingPlugin) {
                            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;
                      };