twitst4tz

twitter statistics web application
Log | Files | Refs | README | LICENSE

buffer-util.js (1899B)


      1 'use strict';
      2 
      3 /**
      4  * Merges an array of buffers into a new buffer.
      5  *
      6  * @param {Buffer[]} list The array of buffers to concat
      7  * @param {Number} totalLength The total length of buffers in the list
      8  * @return {Buffer} The resulting buffer
      9  * @public
     10  */
     11 function concat(list, totalLength) {
     12   const target = Buffer.allocUnsafe(totalLength);
     13   var offset = 0;
     14 
     15   for (var i = 0; i < list.length; i++) {
     16     const buf = list[i];
     17     buf.copy(target, offset);
     18     offset += buf.length;
     19   }
     20 
     21   return target;
     22 }
     23 
     24 /**
     25  * Masks a buffer using the given mask.
     26  *
     27  * @param {Buffer} source The buffer to mask
     28  * @param {Buffer} mask The mask to use
     29  * @param {Buffer} output The buffer where to store the result
     30  * @param {Number} offset The offset at which to start writing
     31  * @param {Number} length The number of bytes to mask.
     32  * @public
     33  */
     34 function _mask(source, mask, output, offset, length) {
     35   for (var i = 0; i < length; i++) {
     36     output[offset + i] = source[i] ^ mask[i & 3];
     37   }
     38 }
     39 
     40 /**
     41  * Unmasks a buffer using the given mask.
     42  *
     43  * @param {Buffer} buffer The buffer to unmask
     44  * @param {Buffer} mask The mask to use
     45  * @public
     46  */
     47 function _unmask(buffer, mask) {
     48   // Required until https://github.com/nodejs/node/issues/9006 is resolved.
     49   const length = buffer.length;
     50   for (var i = 0; i < length; i++) {
     51     buffer[i] ^= mask[i & 3];
     52   }
     53 }
     54 
     55 try {
     56   const bufferUtil = require('bufferutil');
     57   const bu = bufferUtil.BufferUtil || bufferUtil;
     58 
     59   module.exports = {
     60     mask(source, mask, output, offset, length) {
     61       if (length < 48) _mask(source, mask, output, offset, length);
     62       else bu.mask(source, mask, output, offset, length);
     63     },
     64     unmask(buffer, mask) {
     65       if (buffer.length < 32) _unmask(buffer, mask);
     66       else bu.unmask(buffer, mask);
     67     },
     68     concat
     69   };
     70 } catch (e) /* istanbul ignore next */ {
     71   module.exports = { concat, mask: _mask, unmask: _unmask };
     72 }