getBlobData(blob, compress, options, cb) {
    this._bufferedBytes += options[kByteLength];
    this._state = GET_BLOB_DATA;

    blob
      .arrayBuffer()
      .then((arrayBuffer) => {
        if (this._socket.destroyed) {
          const err = new Error(
            'The socket was closed while the blob was being read'
          );

          //
          // `callCallbacks` is called in the next tick to ensure that errors
          // that might be thrown in the callbacks behave like errors thrown
          // outside the promise chain.
          //
          process.nextTick(callCallbacks, this, err, cb);
          return;
        }

        this._bufferedBytes -= options[kByteLength];
        const data = toBuffer(arrayBuffer);

        if (!compress) {
          this._state = DEFAULT;
          this.sendFrame(Sender.frame(data, options), cb);
          this.dequeue();
        } else {
          this.dispatch(data, compress, options, cb);
        }
      })
      .catch((err) => {
        //
        // `onError` is called in the next tick for the same reason that
        // `callCallbacks` above is.
        //
        process.nextTick(onError, this, err, cb);
      });
  }
Gets the contents of a blob as binary data.

@param {Blob} blob The blob
@param {Boolean} [compress=false] Specifies whether or not to compress
    the data
@param {Object} options Options object
@param {Boolean} [options.fin=false] Specifies whether or not to set the
    FIN bit
@param {Function} [options.generateMask] The function used to generate the
    masking key
@param {Boolean} [options.mask=false] Specifies whether or not to mask
    `data`
@param {Buffer} [options.maskBuffer] The buffer used to store the masking
    key
@param {Number} options.opcode The opcode
@param {Boolean} [options.readOnly=false] Specifies whether `data` can be
    modified
@param {Boolean} [options.rsv1=false] Specifies whether or not to set the
    RSV1 bit
@param {Function} [cb] Callback
@private