* Take n bytes from the buffered Buffers * @param {number} n * @returns {Buffer}
(n)
| 310 | * @returns {Buffer} |
| 311 | */ |
| 312 | consume (n) { |
| 313 | if (n > this.#byteOffset) { |
| 314 | throw new Error('Called consume() before buffers satiated.') |
| 315 | } else if (n === 0) { |
| 316 | return emptyBuffer |
| 317 | } |
| 318 | |
| 319 | this.#byteOffset -= n |
| 320 | |
| 321 | const first = this.#buffers[0] |
| 322 | |
| 323 | if (first.length > n) { |
| 324 | // replace with remaining buffer |
| 325 | this.#buffers[0] = first.subarray(n, first.length) |
| 326 | return first.subarray(0, n) |
| 327 | } else if (first.length === n) { |
| 328 | // prefect match |
| 329 | return this.#buffers.shift() |
| 330 | } else { |
| 331 | let offset = 0 |
| 332 | // If Buffer.allocUnsafe is used, extra copies will be made because the offset is non-zero. |
| 333 | const buffer = Buffer.allocUnsafeSlow(n) |
| 334 | while (offset !== n) { |
| 335 | const next = this.#buffers[0] |
| 336 | const length = next.length |
| 337 | |
| 338 | if (length + offset === n) { |
| 339 | buffer.set(this.#buffers.shift(), offset) |
| 340 | break |
| 341 | } else if (length + offset > n) { |
| 342 | buffer.set(next.subarray(0, n - offset), offset) |
| 343 | this.#buffers[0] = next.subarray(n - offset) |
| 344 | break |
| 345 | } else { |
| 346 | buffer.set(this.#buffers.shift(), offset) |
| 347 | offset += length |
| 348 | } |
| 349 | } |
| 350 | |
| 351 | return buffer |
| 352 | } |
| 353 | } |
| 354 | |
| 355 | writeFragments (fragment) { |
| 356 | if ( |