3 const { EMPTY_BUFFER } = require('./constants');
6 * Merges an array of buffers into a new buffer.
8 * @param {Buffer[]} list The array of buffers to concat
9 * @param {Number} totalLength The total length of buffers in the list
10 * @return {Buffer} The resulting buffer
13 function concat(list, totalLength) {
14 if (list.length === 0) return EMPTY_BUFFER;
15 if (list.length === 1) return list[0];
17 const target = Buffer.allocUnsafe(totalLength);
20 for (let i = 0; i < list.length; i++) {
22 target.set(buf, offset);
26 if (offset < totalLength) return target.slice(0, offset);
32 * Masks a buffer using the given mask.
34 * @param {Buffer} source The buffer to mask
35 * @param {Buffer} mask The mask to use
36 * @param {Buffer} output The buffer where to store the result
37 * @param {Number} offset The offset at which to start writing
38 * @param {Number} length The number of bytes to mask.
41 function _mask(source, mask, output, offset, length) {
42 for (let i = 0; i < length; i++) {
43 output[offset + i] = source[i] ^ mask[i & 3];
48 * Unmasks a buffer using the given mask.
50 * @param {Buffer} buffer The buffer to unmask
51 * @param {Buffer} mask The mask to use
54 function _unmask(buffer, mask) {
55 // Required until https://github.com/nodejs/node/issues/9006 is resolved.
56 const length = buffer.length;
57 for (let i = 0; i < length; i++) {
58 buffer[i] ^= mask[i & 3];
63 * Converts a buffer to an `ArrayBuffer`.
65 * @param {Buffer} buf The buffer to convert
66 * @return {ArrayBuffer} Converted buffer
69 function toArrayBuffer(buf) {
70 if (buf.byteLength === buf.buffer.byteLength) {
74 return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);
78 * Converts `data` to a `Buffer`.
80 * @param {*} data The data to convert
81 * @return {Buffer} The buffer
85 function toBuffer(data) {
86 toBuffer.readOnly = true;
88 if (Buffer.isBuffer(data)) return data;
92 if (data instanceof ArrayBuffer) {
93 buf = Buffer.from(data);
94 } else if (ArrayBuffer.isView(data)) {
95 buf = Buffer.from(data.buffer, data.byteOffset, data.byteLength);
97 buf = Buffer.from(data);
98 toBuffer.readOnly = false;
105 const bufferUtil = require('bufferutil');
106 const bu = bufferUtil.BufferUtil || bufferUtil;
110 mask(source, mask, output, offset, length) {
111 if (length < 48) _mask(source, mask, output, offset, length);
112 else bu.mask(source, mask, output, offset, length);
116 unmask(buffer, mask) {
117 if (buffer.length < 32) _unmask(buffer, mask);
118 else bu.unmask(buffer, mask);
121 } catch (e) /* istanbul ignore next */ {