concat.js 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. import { isBufferSource, toUint8Array, toView } from "./buffer-source.js";
  2. export function concatToUint8Array(buffers) {
  3. const views = [];
  4. let length = 0;
  5. for (const buffer of buffers) {
  6. const view = toUint8Array(buffer);
  7. views.push(view);
  8. length += view.byteLength;
  9. }
  10. const result = new Uint8Array(length);
  11. let offset = 0;
  12. for (const view of views) {
  13. result.set(view, offset);
  14. offset += view.byteLength;
  15. }
  16. return result;
  17. }
  18. export function concat(first, second, ...rest) {
  19. let buffers;
  20. let type;
  21. if (typeof second === "function") {
  22. buffers = Array.from(first);
  23. type = second;
  24. }
  25. else if (isBufferSource(first)) {
  26. buffers = [first, second, ...rest].filter(isBufferSource);
  27. }
  28. else {
  29. buffers = Array.from(first);
  30. if (second) {
  31. buffers.push(second);
  32. }
  33. buffers.push(...rest);
  34. }
  35. const bytes = concatToUint8Array(buffers);
  36. return type ? toView(bytes, type) : bytes.buffer;
  37. }